我正在阅读Apache Storm,以评估它是否适合我们的实时处理需求。
到目前为止,我无法弄清楚的一点是 - 在下一个节点无法处理它时,它在哪里存储元组。对于例如让我们说喷口A以每秒1000元组的速度生产,但下一级螺栓(处理喷口A输出)只能以每秒500元组的速度共同消耗。其他元组会发生什么?是否有基于磁盘的缓冲区(或其他东西)来解决这个问题?
答案 0 :(得分:1)
Storm使用内部内存中的消息队列。因此,如果一个螺栓无法跟上处理,那么消息就会缓存在那里。
在Storm 1.0.0之前,这些队列可能会越过越界(即,你得到一个内存不足的异常,你的工作人员就会死亡)。为防止数据丢失,您需要确保spout可以重新读取数据(请参阅https://storm.apache.org/releases/1.0.0/Guaranteeing-message-processing.html)
你可以使用" max.spout.pending"参数,以限制飞行中的元组来解决这个问题。
从Storm 1.0.0开始,支持背压(参见https://storm.apache.org/2016/04/12/storm100-released.html)。这允许螺栓通知其上游生产商减速"如果队列变得太大(并且在队列中再次加速变空)。在你的spout-bolt-example中,在这种情况下,spout将减速以发出消息。
答案 1 :(得分:-1)
通常情况下,Storm spouts读取某些持久性存储并跟踪元组的完成情况,以确定何时可以安全地删除或确认该存储中的消息。香草风暴本身并没有坚持元组。如果发生故障,将从源中重放元组。
我必须同意其他人你应该看看苍鹭。自Storm发布以来,流处理框架已经取得了显着进步。