architecture - Apache Kafka 适合用作无序任务队列吗?

标签 architecture message-queue apache-kafka

Kafka 根据生产者分配的分区将传入消息分成多个分区。来自分区的消息随后被不同消费者组中的消费者消费。

这种架构让我对使用 Kafka 作为工作/任务队列持谨慎态度,因为我必须在生产时指定分区,这间接限制了哪些消费者可以在其上工作,因为分区仅发送给一个消费者消费群体。我宁愿不提前指定分区,以便任何可以执行该任务的消费者都可以这样做。有没有一种方法可以在 Kafka 架构中构建分区/生产者,其中任务可以由下一个可用的消费者拉取,而不必在工作生成时通过选择分区来提前分割工作?

对此主题仅使用一个分区会将所有任务放入同一队列中,但每个消费者组的消费者数量限制为 1 个,因此每个消费者必须位于不同的组中。然后所有任务都会分发到每个消费者组,但这不是我正在寻找的那种工作队列。

Apache Kafka 适合用作任务队列吗?

最佳答案

使用 Kafka 作为任务队列不是一个好主意。 使用 RabbitMQ 代替,它做得更好、更优雅。

虽然您可以将 Kafka 用于任务队列 - 但您会遇到一些问题: Kafka 不允许多个消费者(根据设计)使用单个分区,因此,例如,如果单个分区充满了许多任务,并且拥有该分区的消费者很忙,则该分区中的任务将“饥饿”。 这也意味着主题中任务的消费顺序将与任务的生成顺序不同,如果需要按特定顺序消费任务,则可能会导致严重问题(在 Kafka 中要完全实现这一点,您必须只有一个消费者和一个分区(即只有一个节点串行消费。如果有多个消费者和多个分区,则在主题级别将无法保证任务消费的顺序)。

事实上 - Kafka 主题并不是计算机科学方式中的队列。队列意味着先进先出 - 这不是您在 Kafka 主题级别中得到的。

另一个问题是很难动态改变分区的数量。添加或删除新 worker 应该是动态的。如果您想确保新工作人员能够在 Kakfa 中获得任务,您必须将分区号设置为可能的最大工作人员数量。这不够优雅。

所以底线 - 使用 RabbitMQ 或其他队列代替。

话虽如此,Samza(由 linkedin 提供)正在使用 kafka 作为某种基于流的任务队列: Samza

编辑: 规模考虑:我忘了提及 Kakfa 是一个大数据/大规模工具。如果你的工作率很高,那么 Kafka 可能是你的不错选择,尽管我之前写过这些内容,因为处理大规模是非常具有挑战性的,而 Kafka 非常擅长做到这一点。如果我们谈论的是较小的规模(例如,每秒最多几个剂量/数百个作业),那么与 RabbitMQ 相比,Kafka 又是一个糟糕的选择。

关于architecture - Apache Kafka 适合用作无序任务队列吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36206204/

相关文章:

asp.net - 通过 MSMQ 分离 Web 和数据库层是必要的还是矫枉过正的?

.net - Thrift、.NET、Cassandra - 这是正确的组合吗?

c - IPC的轻量级跨平台消息队列

apache-kafka - BigQuery 以 Kafka 作为源

java - 如何在 HTTP 之上设计 Java 服务器和 Java worker 之间的协议(protocol)?

memory - MMU 和内存 Controller 的区别

spring-boot - Spring boot - 如何使用故障转移 URL 连接到外部 ActiveMQ 主/从集群

php - Laravel 无法排队作业

apache-kafka - Kafka 主题的理想分区数

java - Spark (Kafka) 流式内存问题