因此,Apache Storm + Trident提供了一次性语义。想象一下,我有以下拓扑:
TridentSpout -> SumMoneyBolt -> SaveMoneyBolt -> Persistent Storage.
CalculateMoneyBolt
将内存中的货币值相加,然后将结果传递给SaveMoneyBolt
,这应该将最终值保存到远程存储/数据库。
现在计算这些值并仅存储一次到数据库是非常重要的。我们不想不小心重复计算这笔钱。
因此,当对数据库的写入请求成功发送,数据库已成功接收请求,记录事务以及响应客户端时,Storm与Trident如何处理网络分区和/或故障情况{在收到数据库响应之前,{1}}是否已从网络中死亡或分区?
我假设如果SaveMoneyBolt
已经死亡,Trident会重试批次,但我们无法承担重复计算。
如何处理此类情况?
感谢。
答案 0 :(得分:1)
Trident为每个批次提供唯一的交易ID。如果重试批次,它将具有相同的txid。此外,批量更新也是有序的,即批量的状态更新不会发生,直到完成上一批次的更新。因此,通过将txid与状态trident中的值一起存储,可以重复删除更新并提供一次语义。
Trident附带了一些内置的Map状态实现,可以自动处理所有这些。
有关详细信息,请查看文档: