我们能否在Apache Kafka中拥有类似RabbitMQ的强大路由功能?

24
我们正在尝试评估Kafka并替换我们软件中的Rabbit Mq。
我们知道在离线消费、巨大的持久性、出色的性能、低延迟和高吞吐量方面,Kafka相对于RabbitMq具有优势。
但是,我们需要像RabbitMq一样具有主题交换的细粒度路由功能,以便进行异构消费。
在某种程度上,我们可以通过在Kafka中有更多的分区来实现这一点。但它有它自己的局限性,例如znode上主题元数据的开销和增加延迟。
我们的用例是在分区内过滤数据。假设您在一个分区中获取100个相似类型的传感器数据。消费者是否有能力仅选择其中几个传感器数据并忽略其余的数据。
我们可以在应用程序(消费者)端进行过滤/路由,但这似乎不可重用并且在每个消费者端都会增加额外的开销。
Kafka是否有任何方式通过拥有适当数量的分区来提供丰富的路由功能?
谢谢, Ashish

1
你是否曾经找到了符合你路由需求的Kafka最终方法/解决方案?我有一个类似的情况,我有一组应用程序将在N个单独部分的集合中运行,并且我希望为集合A的上下文发布的消息被同一集合A中的其他应用程序消费,而不是集合B。我不喜欢所有集合中的所有应用程序都会收到所有消息的想法,而且它们必须过滤掉自己集合的那些消息。 - Thiago Silva
1个回答

24
Kafka的消息模型比RabbitMQ简单得多,用户明智地使用它提供的少数抽象,并按照它们的意图使用。 实际上,在Kafka中应该仅使用主题这个层次来路由。 分区仅用于扩展、提供顺序(但仅在分区内,如果您有一个顺序相关的应用程序,则这是一个值得注意的可伸缩性问题)以及在主题中实现并发消费者。
将路由设置为分区级别的问题在于它不具备可伸缩性,因为分区是Kafka在消息层面提供可伸缩性的元素(至少是这样)。 显然,Kafka不是为粒度路由而设计的。 它的设计目的是提供持久、可靠、可伸缩的发布/订阅消息传递功能。 并且分区也不是跨群集进行扩展的。 从它们的本质上讲,分区只对一个或几个Kafka节点(取决于主题的复制因子)本地有效,但是Kafka将主题中的多个分区分散在整个群集中。 如果消息偏向于某个特定分区而不是在主题的所有分区之间均匀分布,则会出现一些热点情况(这就是为什么Kafka生产者通常会为您处理分区的原因)。
在客户端过滤方面,我认为你是正确的:对我来说这似乎浪费了很多资源,但也许我只是太反感浪费资源了。
简而言之,如果您试图以如此复杂的方式考虑Kafka的消息抽象,那么您可能会冒险陷入困境。 Kafka非常专门设计和优化用于通过分区分配负载,因此将它们用于不同的用例(即使是模糊相似的用例)肯定不是理想的选择。
我有一种感觉,您可以在Kafka的功能范围内管理您的用例。 我发现,在Kafka主题框架中进行复杂路由方案的最大挑战在于防止在多个主题中重复数据,但是一旦您了解了多个应用程序如何从同一主题的不同位置消耗,这个问题似乎消失了。 在这种意义上,重要的是将Kafka视为日志,而不是队列。
顺便说一句,我认为您担心需要管理分区的znode是没有根据的。 如果您有足够的主题和分区来占用您的ZooKeeper节点的内存(大量),那么您很可能已经遇到了更大的资源问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接