我有一个流应用程序(用 Spark/storm/任何无关紧要的东西编写)。 Kafka 用作流事件的来源。现在,与其他事件相比,有些事件需要占用更大的资源(时间、CPU 等)。
如何在各种框架中处理这些较大的消息,存在特定于应用程序的细微差别。例如
因为在kafka中,消息确认只能通过某些messageid par分区来进行,但不能在单个消息级别上进行。每当这些较大的事件发生时,应用程序就会在某个时间点停止。这样做是为了解决重复消息处理的权衡(如果应用程序在处理这些大消息时死机,您可以重做多少工作,因为较大消息之后的所有消息都需要重播)。另一个问题是滞后警报,因为即使我在较大的消息之后处理消息,由于较大的消息被卡住,提交的偏移量也不会移动。
基于这种理解,我得出的结论是,当主题中所有消息的处理时间相似时,kafka 更适合(至少 Spark 和 Storm 只提供在主题级别调整事物的选项,而不是在单个分区级别)。
因此以下是我的选择
还有其他选择来处理这些情况吗?
您需要维护关键订单处理吗?如果您确实需要维护键的顺序,您可以使用专门的消费者,例如 Confluence 的并行消费者:https://github.com/confluenceinc/parallel-consumer。它并行处理不同的键,同时确保顺序处理具有相同键的记录。 (它也适用于无序键)这将并行处理来自同一分区的小型和大型记录(消除队头阻塞问题)。正如您所建议的,幂等机制在失败的情况下仍然有用。
请注意,Kafka 队列即将推出 KIP-923