我的用例需要从Kafka主题中读取消息,并在发布到Kafka时以自然顺序处理消息。
Kafka制作人负责发布在单个kafka主题分区中排序的每组消息,我需要以相同的顺序处理同一个顶点处理器中的每组消息。
上图代表了基本理念。有一些KafkaSource-Processors在卡夫卡读书。
并且一条边连接到顶点以解码kafka消息,依此类推。
我可以使用kafka消息密钥作为分区密钥,但我认为最终会使用非平衡解码处理器。
鉴于:
答案 0 :(得分:2)
您不需要为此使用分区程序。 Edge.isolated()
与相等的本地并行一起设计用于:
dag.edge(between(kafkaSource, decode).isolated());
在这种情况下,源处理器的一个实例仅与目标处理器的一个实例绑定,并且将保留项目的顺序。请记住,单个Kafka源处理器可以从多个Kafka分区中获取项目,因此您必须跟踪Kafka分区ID。即使您使Jet处理器和Kafka分区的总数相等,也不能依赖它,因为如果其中一个成员发生故障并且作业重新启动,则Jet处理器的总数将减少,但Kafka分区的数量将赢得“T
另请注意,默认本地并行性对于源不相同:对于Kafka源,它默认为2,对于其他源,它通常等于CPU计数。您需要手动指定相等的值。
另一个限制是,如果对Processors.mapP
顶点使用decode
,则映射函数必须是无状态的。因为你需要订购的物品,我认为你有一些状态要保留。要使其正常工作,您必须使用自定义处理器:
Vertex decode = dag.newVertex("decode", MyDecodeP::new);
处理器实施:
private static class MyDecodeP extends AbstractProcessor {
private Object myStateObject;
@Override
protected boolean tryProcess(int ordinal, @Nonnull Object item) {
Object mappedItem = ...;
return tryEmit(mappedItem);
}
}
答案是为Jet 0.5.1写的。