我有一个storm设置,它从Kafka主题中提取消息,并对其进行处理和持久化。我想了解在这种情况下,storm是如何保证消息处理的
考虑下面的场景:我为一个storm集群配置了多个supervisors+Worker。Kafka普特正在读这个主题的信息,然后把它传给了一个插销。完成后,螺栓会确认,喷口会向前移动到下一个消息。
我有两个主管,每个主管负责3个工人。据我所知,每个主管的每个员工都有能力处理一条消息。
所以,在任何给定的时间,6条消息在storm集群中被并行处理。如果第二条消息失败,或者由于工作人员关闭,或者由于主管关闭,该怎么办。zookeeper已经指向消费者组的7消息。在这种情况下,如何处理第二条消息?
1条答案
按热度按时间jv4diomz1#
我想有些误会。以下说法似乎是错误的:
完成后,螺栓会确认,喷口会向前移动到下一个消息。
在任何给定的时间,6条消息在风暴群中被并行处理
=>喷口不等待确认;它以最大的速度一次又一次地获取元组,而不考虑bolt的处理速度——只要kafka中有新消息可用(或者你限制了飞行中元组的数量
max.spout.pending
?). 因此,许多消息是并行处理的(即使只有#executors被赋予一个udf——许多其他消息被缓冲在内部storm队列中)。据我所知(但我不是100%肯定),
KafkaSpout
“命令”传入的ack,并且仅在所有连续ack都可用时移动偏移量——即,如果消息6的storm ack还不存在,则消息7未确认给kafka。因此,KafkaSpout
如果失败,可以重新发出消息6。再打电话说,风暴不给任何订购保证。