首页 > 解决方案 > Hazelcast Jet 只为定制水槽提供一次保证

问题描述

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

文档说

从 0.6 版开始,Hazelcast Jet 支持完全一次处理,源是 Hazelcast IMap 或 Kafka 主题,接收器是 Hazelcast IMap。

我可以将 IMap 用作接收器,但我很困惑如何从中“提取”新数据。是否有任何“恰好一次”的 IMap 事件监听器?

标签: hazelcast-jet

解决方案


容错从不提供“只执行一次”的保证,这是不可能的。如果集群成员崩溃,您不知道它是否执行了 REST 操作。即使 REST 操作本身失败,它也可能已远程执行,但响应传递失败 - 你不知道。

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

但是,这对于接收器通常是不可能的:如果我们执行 REST 操作,则无法将远程端重置为好像从未执行该操作的状态。如果有,您可以编写一个完全一次性的接收器。

我们只调用IMap一次 sink,因为如果你执行map.put("key", "value")多次,key 的值"key"仍然是"value". 这称为幂等性。即使该put操作可能会执行多次,但效果就像执行了一次一样。

幂等性可能是 REST 服务的必经之路。例如,它可以通过忽略重复来实现。没有办法用 IMap 来解决它:即使您能够以某种方式“只听一次”,REST 操作也可能会失败,并且您不确定它是否在远程端执行。


推荐阅读