首页 > 解决方案 > 如何设计用于从 Kafka 获取客户端事件的 API?

问题描述

我考虑架构模式,当我的服务的每个客户端都有自己的 kafka 消费者时。

例如,有events一些具有一些副本因子和一些分区数的主题,我将其用于可扩展性。给定客户端的所有事件都属于一个分区(我clientId用于分区键)。

每个客户都有自己的offset. 所以我的 API 允许用来offset获取客户端事件。

系统设计好不好?或者获取事件的正确 API 设计是什么?

标签: javaarchitectureapache-kafkaconsumer

解决方案


这个问题有点模糊,所以让我在提出建议之前先陈述我的猜测。

  1. 发布事件的单个主题。
  2. 这些事件必须通知某些客户(他们是移动应用程序还是什么?)
  3. 当前设计每个客户端有一个消费者,这意味着至少为一个客户端分配了一个线程。

对当前设计的担忧

  1. 随着用户数量的增加,线程的数量也必须增加,这意味着该方法不能线性扩展。成本随着用户数量的增加而增加。
  2. 如果消费者线程失败了怎么办?这可能会导致通知客户端失败。

提议

  1. 使用 Kstreams 消费。将 kstreams 视为比消费者 api 更高级别的消费 api。
  2. 使用 numthreads 属性,您可以配置线程数。因此,单个 KStream 将充当消费者池。
  3. 有一个路由逻辑来查找客户端并通知。
  4. 权衡:此路由逻辑增加了延迟。

推荐阅读