在节点可用于处理元组之前,Apache Storm 将元组存储在哪里?

Where does Apache Storm store tuples before a node is available to process it?

我正在阅读 Apache Storm 以评估它是否适合我们的实时处理需求。

直到现在我还想不通的一件事是——当下一个节点不可用于处理元组时,它将元组存储在哪里。例如假设 spout A 以每秒 1000 个元组的速度生成,但下一级螺栓(处理 spout A 输出)只能以每秒 500 个元组的速度共同消耗。其他元组会怎样?它是否有基于磁盘的缓冲区(或其他东西)来解决这个问题?

通常,Storm spout 会读取一些持久存储并跟踪元组的完成情况,以确定何时可以安全地删除或确认该存储中的消息。 Vanilla Storm 本身不会持久化元组。发生故障时从源重放元组。

我必须同意其他人的意见,您应该看看 Heron。自 Storm 诞生以来,流处理框架取得了显着进步。

Storm 使用内部内存消息队列。因此,如果一个 bolt 无法跟上处理,消息就会被缓冲在那里。

在 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)。如果队列变得太大(并在队列变空时再次加速),这允许 bolt 通知其上游生产者 "slow down"。在您的 spout-bolt-example 中,在这种情况下,spout 会放慢速度以发出消息。