在网络分区和/或故障情况下,在storm trident中只保证一次

efzxgjgh  于 2021-06-24  发布在  Storm
关注(0)|答案(1)|浏览(385)

因此,apachestorm+trident提供了精确的once语义。假设我有以下拓扑结构:

TridentSpout -> SumMoneyBolt -> SaveMoneyBolt -> Persistent Storage.
``` `CalculateMoneyBolt` 对内存中的货币值求和,然后将结果传递给 `SaveMoneyBolt` 将最终值保存到远程存储/数据库。
现在非常重要的是,我们计算这些值并只将其存储到数据库中一次。我们不想不小心把钱数了一遍。
那么,当对数据库的写请求已成功发送、数据库已成功接收到请求、记录事务以及在响应客户端时,storm with trident如何处理网络分区和/或故障场景呢 `SaveMoneyBolt` 在收到数据库响应之前,是否已死亡或已从网络分区?
我想如果 `SaveMoneyBolt` 已经死了,三叉戟将重新批,但我们不能承受重复计算。
这些情况是如何处理的?
谢谢。
z0qdvdin

z0qdvdin1#

trident为每个批提供一个唯一的事务id。如果重试一个批,它将具有相同的txid。此外,批更新也是有序的,即在前一批的更新完成之前,批的状态更新不会发生。因此,通过将txid和值一起存储在state trident中,trident可以消除重复的更新并提供精确的一次语义。
trident附带了一些内置的Map状态实现,可以自动处理所有这些。
有关更多信息,请参阅文档:
http://storm.apache.org/releases/1.0.1/trident-tutorial.html
http://storm.apache.org/releases/current/trident-state.html

相关问题