Hazelcast Jet只需一次保证可定制水槽

时间:2018-08-19 22:37:37

标签: hazelcast-jet

我需要处理一些不确定的传入流,并将结果发送到某个外部服务器,例如通过REST。我需要“完全一次”的保证。我可以用hazelcast jet实现吗?

医生说

  

从0.6版开始,Hazelcast Jet支持一次精确处理,其源可以是Hazelcast IMap或Kafka主题,接收器可以是Hazelcast IMap。

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

1 个答案:

答案 0 :(得分:3)

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

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

但是,接收器通常无法做到这一点:如果执行REST操作,则无法将远程方重置为从未执行过的状态。如果有的话,您可以编写一次精确的接收器。

我们称一次IMap接收器是一次,因为如果多次执行map.put("key", "value"),则键{{1​​}}的值仍为"key"。这称为幂等。即使"value"操作可能会执行多次,其效果就像执行一次一样。

幂等可能是您使用REST服务的一种方式。例如,可以通过忽略重复项来实现它。使用IMap无法解决此问题:即使您能够以某种方式“准确地监听一次”,REST操作也可能失败,并且您不确定它是否在远程执行。