0

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

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

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

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

那么当对数据库的写入请求已成功发送、数据库已成功接收请求、记录事务以及在响应客户端时,Storm with Trident 如何处理网络分区和/或故障SaveMoneyBolt场景在收到数据库响应之前从网络分区?

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

如何处理此类场景?

谢谢。

4

1 回答 1

1

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

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

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

于 2017-06-21T04:40:13.707 回答