在浮士德文档中,它指出当更改主题的键/值模型时,它是不兼容的更改。它声明所有浮士德实例都必须重新启动。
如何在不停机的情况下更改键/值?由另一个库(例如生成的 Protobuf 代码)执行反序列化是否更有意义?当以向后兼容的方式更新生成的 Protobuf 代码时,以下代码是否会规避停机时间要求(proto/greetings_pb2.py
生成的代码)?
# app.py
import faust
from .proto.greetings_pb2 import Greeting
from .proto_serializer import ProtobufSerializer
greetings_schema = faust.Schema(
key_serializer=ProtobufSerializer(pb_type=Greeting),
value_serializer=ProtobufSerializer(pb_type=Greeting),
)
# proto_serializer.py
from faust.serializers import codecs
from typing import Any
from google.protobuf import json_format
from google.protobuf.json_format import MessageToJson
from google.protobuf.json_format import MessageToDict
from google.protobuf import text_format
from google.protobuf.text_format import MessageToString
from google.protobuf.text_format import MessageToBytes
class ProtobufSerializer(codecs.Codec):
def __init__(self, pb_type: Any):
self.pb_type = pb_type
super(self.__class__, self).__init__()
def _dumps(self, pb: Any) -> bytes:
return pb.SerializeToString()
def _loads(self, s: bytes) -> Any:
pb = self.pb_type()
pb.ParseFromString(s)
return pb