在我的拓扑中,我从Kafka队列中读取触发器消息。收到触发消息后,我需要向螺栓发出大约4096条消息。在螺栓中,经过一些处理后,它将发布到另一个Kafka队列(另一个拓扑将在以后使用它)。
我正在尝试设置TOPOLOGY_MAX_SPOUT_PENDING
参数来限制要去的消息数量。但我发现它没有效果。是因为我用一个nextTuple()
方法发出所有元组?如果是这样,那应该是什么工作?
答案 0 :(得分:2)
如果您正在阅读kafka,那么您应该使用充满风暴的KafkaSpout
。不要试图实现自己的鲸鱼喷水,相信我,我在生产中使用KafkaSpout,它的工作非常顺利。每个Kafka消息都只生成一个元组。
正如您在this nice page from the manual上看到的那样,您可以像这样设置topology.max.spout.pending
:
Config conf = new Config();
conf.setMaxSpoutPending(5000);
StormSubmitter.submitTopology("mytopology", conf, topology);
每个喷口设置topology.max.spout.pending
,如果你有四个喷口,你的拓扑结构中最多有非完整元组,等于喷口数* topology.max.spout.pending。
另一个提示是,您应该使用风暴UI来查看topology.max.spout.pending
是否设置正确。
请记住,topology.max.spout.pending
只是拓扑中未处理的元组数,拓扑永远不会停止消耗来自kafka的消息,至少在生产系统上消息...如果你想消耗4096批次你需要在你的螺栓上实现缓存逻辑,或使用除风暴之外的其他东西(微批量导向)。
答案 1 :(得分:1)
要进行TOPOLOGY_MAX_SPOUT_PENDING,您需要启用容错机制(即,在Spouts中分配消息ID,在锚点中分配锚点和确认)。此外,如果每次调用Spout.nextTuple()
时发出多个元组,则TOPOLOGY_MAX_SPOUT_PENDING将无法正常工作。
由于某些原因,这实际上是不好的做法,因此每Spout.nextTuple()
次调用会发出多个元组(有关详情,请参阅Why should I not loop or block in Spout.nextTuple())。