我目前正在尝试更新有状态的流作业,该作业基本上如下所示(使用2.7 / 2.8版本的sdks):
pipeline
.apply("Read from pubsub", ...read from pubsub...)
.apply(
"Map PubSubMessages",
MapElements
.into(TypeDescriptors.kvs(TypeDescriptors.strings(), TypeDescriptor.of(PubSubMessage.class)))
.via(input -> KV.of(input.getId1() + ":" + input.getId2(), input))
)
.apply(...stateful processing...)
PubSubMessage使用自动生成的类进行解码/编码:
registry.registerCoderForClass(PubSubMessage.class, ProtoCoder.of(PubSubMessage.class));
我现在遇到的问题是消息已更新。 PubSubMessage
现在有两个附加字段。由于它是proto3
,所以向后兼容。但是,由于生成的类已更改,因此Dataflow似乎认为类型也已更改,并且旧消息/步骤不再兼容,并且无法使用以下内容更新作业:
工作流程失败。原因:新作业与现有作业不兼容。原始作业尚未中止。,步骤Map PubSubMessages到状态object / Map.out0 / FromValue的编码器或类型已更改。
停止工作(耗尽其消息)并重新启动它会有些痛苦。在这种情况下,有没有更好的方法来更新类型/ protobuf /编码器?
谢谢!