每个业务用例的 Kafka Consumer - 最佳实施方式

Kafka Consumer per business use case - best way to implement

我正在为不同类型的相关消息使用单个 kafka 主题。主题名称是:apiEvents。事件类型:

  1. ApiUpdateEvent
  2. 端点更新事件
  3. 模板更新事件

我拥有的一个应用程序使用了所有这些事件。此外 - 我希望它在两个不相关的用例中以不同方式(两次)使用相同的事件。

例如,同一事件 (EndpointUpdateEvent) 的两个用例:

  1. 我想创建一个 500 毫秒的窗口时间范围,并响应该时间范围内所有事件的聚合 - 一次!
  2. 与第 (1) 节中所述的事件相同 - 我想通过触发一些数据库操作来单独响应每个事件。

因此,我想编写干净且可维护的代码,并且不想将所有用例都扔给一个大消费者,乱七八糟。

我考虑过的一个解决方案是为每个用例编写一个新的 kafka-consumer,并为每个消费者分配不同的 groupId(在同一应用程序中)。这样,每个业务逻辑用例都会有自己的 class,它将以自己的特殊方式处理事件。看起来够整洁了。

  1. 在一个应用中创建过多的消费者组会不会出现问题?
  2. 是否有更好的解决方案可以让我保持干净并划分不同的业务逻辑用例?

您可以使用 Kafka Streams Processor API 在特定的 rolling/hopping 中使用和处理单个消息 以及 window 它们]时间段

听起来您走在了正确的轨道上,为不同的业务逻辑用例使用单独的消费者组,这些用例将具有单独管理的偏移量以跟踪个人进度。这也将更符合微服务风格的架构,在这种架构中,不同的业务案例可能会在不同的组件中实现。

再考虑一件事——我不能仅根据提供的信息来判断这一点,但我也会考虑将您的主题分成一个事件类型。一个消费组同时订阅多个主题是没有问题的。而我认为让消费者 process/discard 大量与他们无关的事件效率较低。