Asynchronous Kafka-动态/任意分区

Asynchronous Kafka-动态/任意分区,asynchronous,apache-kafka,job-scheduling,Asynchronous,Apache Kafka,Job Scheduling,我正在为卡夫卡主题构建消费者服务。每条消息都包含一个url,我的服务将向其发出http请求。每个消息/url与其他消息/url完全独立 我担心的问题是如何处理长时间运行的请求。一些http请求可能需要50多分钟才能返回响应。在这段时间里,我不想保留任何其他消息 并行化此操作的最佳方法是什么 我知道Kafka的并行方法是创建分区。然而,从我所读到的内容来看,当我真正想要无限或动态数量的分区时,似乎需要预先定义分区的数量(理想情况下,每个消息都会动态创建自己的分区) 例如,假设我创建了1000个分区

我正在为卡夫卡主题构建消费者服务。每条消息都包含一个url,我的服务将向其发出http请求。每个消息/url与其他消息/url完全独立

我担心的问题是如何处理长时间运行的请求。一些http请求可能需要50多分钟才能返回响应。在这段时间里,我不想保留任何其他消息

并行化此操作的最佳方法是什么

我知道Kafka的并行方法是创建分区。然而,从我所读到的内容来看,当我真正想要无限或动态数量的分区时,似乎需要预先定义分区的数量(理想情况下,每个消息都会动态创建自己的分区)

例如,假设我创建了1000个分区。如果为我的主题生成了1001条以上的消息,则将发出前1000条请求,但之后的每条消息都将排队,直到该分区中的前一个请求完成

我曾考虑过让http请求异步,但在确定提交什么偏移量时,似乎遇到了问题

例如,在单个分区上,我可以让使用者读取第一条消息并发出异步请求。它提供了一个回调函数,将该偏移提交给Kafka。当该请求等待时,我的消费者读取下一条消息并发出另一个异步请求。如果该请求在第一次请求之前完成,它将提交该偏移量。现在,如果第一个请求由于某种原因失败或者我的使用者进程死亡,会发生什么?如果我已经提交了一个更高的偏移量,听起来这意味着我的第一条消息将永远不会被重新处理,这不是我想要的


在使用Kafka进行长时间运行的异步消息处理时,我显然遗漏了一些东西。有没有人遇到过类似的问题,或者有没有想过如何最好地解决这个问题?提前感谢您抽出时间阅读此文章。

您应该查看Apache Storm以了解消费者的处理部分,并将消息存储和检索留给Kafka。您所描述的是大数据中一个非常常见的用例(尽管50分钟以上的事情有点极端)。简言之,您的主题将有少量的分区,并让Storm stream processing扩展实际发出http请求的组件(Storm speak中的“螺栓”)的数量。单个喷口(从外部源读取数据的storm组件)可以读取卡夫卡主题中的消息并将其流式传输到处理程序

我已经发布了关于如何在github上编写Storm/Kafka应用程序的文章

以下是对此答案的一些想法:

1) 虽然我认为Storm是正确的平台方法,但没有理由不编写一个执行http调用的Runnable,然后再编写一些代码,让单个Kafka消费者读取消息并使用Runnable的多线程实例处理它们。所需的管理代码有点有趣,但可能比从头开始学习Storm更容易编写。所以,您可以通过在更多线程上添加更多Runnable实例来进行扩展


2) 无论您使用Storm还是您自己的多线程解决方案,您仍然会遇到如何在Kafka中管理偏移量的问题。简单的回答是,您必须自己进行复杂的补偿管理。您不仅必须保留从卡夫卡读取的最后一封邮件的偏移量,而且还必须保留和管理当前正在处理的飞行中邮件的列表。这样,如果你的应用程序宕机,你知道正在处理哪些消息,你可以在启动备份时检索并重新处理它们。基本Kafka偏移量持久性不支持这种更复杂的需求,但它只是为了方便更简单的用例。您可以将偏移量信息保存到任何您喜欢的地方(Zookeeper、文件系统或任何数据库)。

谢谢,克里斯!我有长期计划来研究流处理(Storm、Samza等),但鉴于当前的截止日期,这个当前问题需要短期解决方案。有没有关于搁置解决方案的想法?刚刚添加了这些评论