Java 我们是否可以使用类似于RabbitMq的Apache Kafka实现强大的路由功能?

Java 我们是否可以使用类似于RabbitMq的Apache Kafka实现强大的路由功能?,java,routing,rabbitmq,amqp,apache-kafka,Java,Routing,Rabbitmq,Amqp,Apache Kafka,我们正在尝试评估卡夫卡并在我们的软件中替换Rabbit Mq 我们知道Kafka在RabbitMq方面相对于离线消耗、巨大的持久性、卓越的性能、低延迟和高吞吐量的优势 但是我们需要RabbitMq与主题交换粒度路由一样的功能,以满足异构消费 在某种程度上,我们可以通过在Kafka中为每个代理提供更多的分区来实现这一点。但它也有其自身的局限性,例如znode上主题元数据的开销,增加延迟 我们的用例是过滤分区内的数据。假设您在一个分区中获得100个类似类型的传感器数据。消费者可以只选择少数传感器数据

我们正在尝试评估卡夫卡并在我们的软件中替换Rabbit Mq

我们知道Kafka在RabbitMq方面相对于离线消耗、巨大的持久性、卓越的性能、低延迟和高吞吐量的优势

但是我们需要RabbitMq与主题交换粒度路由一样的功能,以满足异构消费

在某种程度上,我们可以通过在Kafka中为每个代理提供更多的分区来实现这一点。但它也有其自身的局限性,例如znode上主题元数据的开销,增加延迟

我们的用例是过滤分区内的数据。假设您在一个分区中获得100个类似类型的传感器数据。消费者可以只选择少数传感器数据而忽略其余数据

我们可以在应用程序(消费者)端进行过滤/路由,但它似乎不可重用,并且在每个消费者端都会增加额外的开销

卡夫卡有没有办法通过优化分区数量来提供丰富的路由功能

谢谢,
Ashish

Kafka的消息传递模型比RabbitMQ简单得多,用户明智地使用它提供的少量抽象。实际上,主题是卡夫卡唯一应该完成的路由级别。分区仅用于扩展、提供顺序(但仅限于分区内,如果您的应用程序依赖于顺序,这是一个值得注意的可伸缩性问题),并促进主题内的并发使用者

在分区级别执行路由的问题在于它不可伸缩,因为分区是Kafka的元素,提供了可伸缩性(至少在消息传递层)。显然,卡夫卡不是为粒度路由而设计的。它专为持久、可靠、可扩展的发布/订阅消息而设计。分区的设计也不是为了跨集群扩展。分区本质上是一个或几个Kafka节点的本地分区(取决于主题的复制因素),但Kafka将主题内的多个分区分布在集群中。这意味着,如果消息倾向于某个特定分区,而不是均匀分布在某个主题的各个分区上,则可能会出现热点问题(这就是为什么Kafka制作人通常为您处理分区的原因)

在客户端的过滤方面,我认为你是对的:对我来说,这感觉像是浪费了很多资源,但也许我太不喜欢浪费资源了

简言之,如果你试图用如此复杂的术语来思考卡夫卡的消息传递抽象,我认为你可能会把自己挖到一个洞里。Kafka在很大程度上是为通过分区分配负载而设计和优化的,因此将它们用于不同的(即使有点相似)用例肯定是不理想的

我觉得您可以在Kafka特性的上下文中管理您的用例。我发现在Kafka的主题框架中,复杂路由方案的最大挑战是防止多个主题中的重复数据,但一旦您了解了多个应用程序如何从同一主题中的不同位置使用数据,这个问题似乎就消失了。从这个意义上讲,重要的是将卡夫卡更多地看作一个日志,而不是一个队列


另一方面,我认为您对管理分区所需的znode的关注是没有根据的。如果您有足够的主题和分区来消耗ZooKeeper节点(一吨)的内存,那么您可能已经遇到了更大的资源问题。

您有没有找到卡夫卡的最终方法/解决方案来满足您的路由需求?我有一个类似的情况,我有一组应用程序将以N个单独的部分运行,我希望为集合a的上下文发布的消息被同一集合a中的其他应用程序使用,而不是集合B。我不喜欢所有集合中的所有应用程序都将获得所有消息的想法,这取决于他们为自己的设置过滤掉那些。