网络分区 and/or 故障场景中 Storm Trident 中的恰好一次保证

Exactly-once guarantee in Storm Trident in network partitioning and/or failure scenarios

因此,Apache Storm + Trident 提供了 exactly-once 语义。假设我有以下拓扑:

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

CalculateMoneyBolt 对内存中的货币值求和,然后将结果传递给 SaveMoneyBolt,后者应将最终值保存到远程 storage/database.

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

那么 Storm with Trident 如何处理网络分区 and/or 故障场景,当向数据库的写请求已成功发送,数据库已成功接收到请求,记录事务,并在响应客户端,SaveMoneyBolt 在收到数据库响应之前已经死亡或与网络分区?

我假设如果 SaveMoneyBolt 死亡,Trident 会重试该批次,但我们不能重复计算。

如何处理此类情况?

谢谢。

Trident 为每个批次提供唯一的交易 ID。如果重试批次,它将具有相同的 txid。此外,批次更新是有序的,即在前一批次的更新完成之前,不会发生批次的状态更新。因此,通过将 txid 与状态中的值一起存储,trident 可以对更新进行去重并提供恰好一次的语义。

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

有关更多信息,请查看文档: