Storm Trident在网络分区和/或故障情况下的一次性保证

时间:2017-06-19 23:11:10

标签: apache-storm reliability network-partitioning

因此,Apache Storm + Trident提供了一次性语义。想象一下,我有以下拓扑:

TridentSpout -> SumMoneyBolt -> SaveMoneyBolt -> Persistent Storage.

CalculateMoneyBolt将内存中的货币值相加,然后将结果传递给SaveMoneyBolt,这应该将最终值保存到远程存储/数据库。

现在计算这些值并仅存储一次到数据库是非常重要的。我们不想不小心重复计算这笔钱。

因此,当对数据库的写入请求成功发送,数据库已成功接收请求,记录事务以及响应客户端时,Storm与Trident如何处理网络分区和/或故障情况{在收到数据库响应之前,{1}}是否已从网络中死亡或分区?

我假设如果SaveMoneyBolt已经死亡,Trident会重试批次,但我们无法承担重复计算。

如何处理此类情况?

感谢。

1 个答案:

答案 0 :(得分:1)

Trident为每个批次提供唯一的交易ID。如果重试批次,它将具有相同的txid。此外,批量更新也是有序的,即批量的状态更新不会发生,直到完成上一批次的更新。因此,通过将txid与状态trident中的值一起存储,可以重复删除更新并提供一次语义。

Trident附带了一些内置的Map状态实现,可以自动处理所有这些。

有关详细信息,请查看文档: