网络分区 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 状态实现,可以自动处理所有这些。
有关更多信息,请查看文档:
因此,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 状态实现,可以自动处理所有这些。
有关更多信息,请查看文档: