2017-06-19 58 views
0

因此,Apache Storm + Trident提供了完全一次的语义。想象我有以下拓扑:在存储器风暴三叉戟在网络分区和/或故障场景中的确切一次保证

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

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

现在,我们计算这些值并仅存储一次数据库非常重要。我们不希望意外地重复计算这笔钱。

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

我认为如果SaveMoneyBolt已经死亡,Trident会重试批次,但我们不能重复计算。

这样的场景是如何处理的?

谢谢。

回答

1

Trident为每个批次提供了唯一的事务ID。如果批次重试,它将具有相同的txid。批量更新也是有序的,即,直到前一批次的更新完成后,批次的状态更新才会发生。因此,通过将txid与状态中的值一起存储起来,可以消除重复更新并只提供一次语义。

Trident带有几个内置的Map状态实现,它们自动处理所有这些。

欲了解更多信息,看看文档: