Apache Kafka Offset在Apache Storm拓扑中提交

时间:2019-01-31 15:10:07

标签: apache-kafka apache-storm

我正在设计一个Apache风暴拓扑(使用streamparse),该拓扑由一个spout(apache kafka spout)和1个并行度大于1的螺栓构建,可从kafka spout中批量读取消息并将消息保留在mysql表中

螺栓分批读取消息。如果该批处理成功完成,我将手动提交apache kafka offset。

当MySQL上的螺栓插入失败时,我不会在kafka中提交偏移量,但是某些消息已经在喷嘴已发送到螺栓的消息队列中。

应该删除已经在队列中的消息,因为我不能提高kafka偏移而不丢失先前失败的消息。

在streamparse中是否有一种方法可以清除或失败螺栓启动时已在队列中的所有消息?

1 个答案:

答案 0 :(得分:0)

我不了解streamparse,但是我得到的印象是您想将元组捆绑在一起并成批编写。假设您已写入偏移量10。现在您的螺栓接收到偏移量11-15,并且批次无法写入。偏移15-20已排入队列,您不希望立即处理它们,因为这将使批处理混乱。

这种理解正确吗?

首先,我将删除手动提交的偏移量。您应该让壶嘴来处理。假设您正在使用storm-kafka-client,则可以将其配置为仅在确认相应的元组和所有先前的元组后才提交偏移量。

您可能应该做的是跟踪螺栓(甚至在数据库中甚至更好)跟踪失败批次中的最大偏移量。然后,当螺栓未能写入偏移量11-15时,可以使用offset > 15使螺栓在每个元组中失效。在某个时候,您将再次收到偏移量11-15,并且可以重试写入批处理。由于您使用offset > 15使所有邮件都失败了,因此它们也会被重试,并在失败的批处理中到达邮件之后。

此解决方案假定您不对喷嘴和编写器螺栓之间的消息流进行重新排序,因此消息按其发出顺序到达螺栓。