Kafka实现消息过滤的最佳方式



想知道以下情况的最佳方法。

在微服务项目中:一个应用程序(生产者(正在发布消息,而这些消息正被许多其他下游应用程序使用。有些消息是针对第一个应用程序的,有些是针对第二个,有些则是针对第三个,依此类推。让消费者只消费那些针对他们的消息的最佳方式是什么。

我应该有1个主题,分区的数量等于使用者的数量,并在发布消息时使用密钥,这样每个分区将由一个特定的使用者使用。

或者每个消费者有一个主题,每个主题有一个分区或多个分区?

我们还应该考虑,如果未来消费者数量增加,那么我们的解决方案应该能够轻松处理。

您不应该尝试使用分区来路由到消费者,因为分区是为了可扩展性,虽然您可以确保相同的密钥将指向相同的分区,但您无法随时知道哪个消费者将从该分区消费。

因此,每个主题的分区数量与您的问题无关,应该设置为满足未来的扩展需求。

您的选择是使用单个主题、每个使用者应用程序的主题还是介于两者之间的主题。

只要每个应用程序中的使用者与其他应用程序中使用者在一个单独的组中,那么单个主题就可以了,这样每个应用程序都可以获得所有消息。缺点是每个人都必须过滤掉他们不感兴趣的消息

每个应用程序的主题也可能很好,尽管它会给您带来生产者必须知道将消息路由到哪里的开销,这可能会导致复杂的配置。

另一种方法是基于基于消息类型的某种逻辑划分来创建主题,其中几个应用程序可以订阅一个主题,一些应用程序可能订阅几个主题,并且他们可能对所有消息都不感兴趣,但生产者不需要知道谁在消费,消息与哪个逻辑区域相关(由您决定如何划分主题和消息类型(

在我看来,这听起来是一个使用Kafka的好用例。

我建议不要重复数据,并将所有消息处理到带有多个分区的一个主题中。处理Kafka中的数据会随着分区数量的增加而增加,所以我会根据您预期的数据量和所需的throuput来设置数量。如果您对分区主题中的消息顺序有要求,您可以在生成器中使用自定义分区器来引导数据分布到该主题中。请注意,Kafka中消息的顺序仅在分区内得到保证。

订阅这个卡夫卡主题的消费者应该尽可能独立于生产者。所以我不会试图让生产商为消费者"做点什么"。理想情况下,生产者不需要了解消费者的任何信息,特别是如果你计划在未来增加更多的消费者。

消费者也应该相互独立,并且都使用不同的消费者群体。这样,每个消费者都可以控制从主题中独立读取数据。此外,在失败的情况下,消费者可以从一开始就独立地重新读取Kafka主题的数据,而不会影响任何其他消费者。

最新更新