如何在storm中构建容错应用程序?

osh3o9ms  于 2021-06-26  发布在  Storm
关注(0)|答案(2)|浏览(386)

这个问题的简短版本是:如何在twitter风暴中构建一个故障安全的字数计算程序(topology),即使出现故障也能产生准确的结果?这有可能吗?
长版:我正在研究twitter风暴,并试图了解它应该如何使用。我遵循了教程,发现它是一个非常简单的概念。但是教程中概述的字数计算示例不是容错的(因为螺栓会在内存中保存一些数据)。但是,在后端数据库中保存相同的数据会导致重复计数,如果事件重新提交到链的开头(当某些螺栓发生故障时会发生这种情况)。
我是否应该将twitter风暴视为产生部分准确结果的实时平台,并且仍然依赖mapreduce来获得准确的结果?

ha5z0ras

ha5z0ras1#

storm有事务拓扑的概念。实际上,这意味着您需要成批处理项目,然后在批处理结束时提交到数据库,将事务id与计数一起存储在数据库中。这还有一个实际的好处,即通过较少的插入来减少数据库的负载。
批处理是并行处理的,失败时可以重放,但保证按顺序提交。这一点很重要,因为这样可以安全地编写获取当前计数行的代码,检查事务id与内存中的事务id,如果两者不同(意味着这是一个未提交的批处理),则将新的计数添加到现有的计数中,并提交更新的计数。
有关更多信息和代码示例,请参见以下链接:
https://github.com/nathanmarz/storm/wiki/transactional-topologies

pinkon5k

pinkon5k2#

这真的取决于你试图反对什么样的失败。你可以做以下几件事:
风暴螺栓应该只有在处理完元组后才能确认元组。如果你写你的喷口和螺栓和拓扑使用这个,你可以实现一个“正好一次”系统,这将保证准确性。
kafka是将数据放入storm的一个好方法,因为它使用磁盘持久性将消息保存很长时间,即使消息被消耗后也是如此。这意味着您可以检索到他们,如果有一个消费者的失败线。
不过,一般来说,很难保证在任何流媒体系统中只处理一次。这是一个已知的问题,也是一个很难有效解决的问题。

相关问题