Hazelcast Jet exactly once 保证定制水槽

Hazelcast Jet exactly once guarantee for custom sink

我需要处理一些不定式传入流并将结果发送到某个外部服务器,例如通过 REST。我需要 "Exactly-once" 保证。我可以用 hazelcast jet 实现吗?

文档说

As of version 0.6, Hazelcast Jet supports exactly-once processing with the source being either a Hazelcast IMap or a Kafka topic, and the sink being a Hazelcast IMap.

我可以将 IMap 用作接收器,但我对如何从中 "extract" 新数据感到困惑。有没有"exactly-once" IMap事件监听器?

容错从不提供 "execute exactly once" 保证,这是不可能的。如果一个集群成员崩溃了,你不知道它是否执行了 REST 操作。即使 REST 操作本身失败了,它可能已经被远程执行,但是响应传递失败了——你不知道。

相反,如果操作失败,则会重试。内部 Jet 顶点,例如 window 累加器,将所有状态保存到快照。换句话说,没有未保存到快照中的顶点状态。因此,如果重新启动作业,则会丢弃在最后一个快照之后执行的操作,并且恢复状态,就好像这些操作从未执行过一样。这就是为什么我们可以称它为 "exactly once".

但是,这对于接收器通常是不可能的:如果我们执行 REST 操作,则无法将远程端重置为该操作从未执行过的状态。如果有的话,你可以写一个exactly-once sink。

我们调用 IMap sink exactly-once 因为如果你多次执行 map.put("key", "value"),key "key" 的值仍然是 "value"。这称为幂等性。 put操作虽然可能执行了多次,但效果和执行了一次一样。

幂等性可能是实现 REST 服务的方式。例如,它可以通过忽略重复项来实现。用IMap没办法解决:即使你能"listen exactly once",REST操作也可能会失败,你不确定它是否在远程执行。