kafka中的消息路由

Message routing in kafka

我们正在尝试使用通过 kafka 进行异步通信的微服务构建一个平台。 按照我的理解,每个微服务中每个聚合类型都有 1 个主题似乎很自然。因此,实现用户注册的微服务会将与用户相关的事件发布到主题 "users" 中。 其他微服务会监听从 "users" 微服务创建的事件并实现自己的逻辑并相应地填充它们的数据库。问题是其他微服务可能不对用户微服务生成的所有事件感兴趣,而是对这些事件的一个子集感兴趣,例如仅 UserCreated(没有 UsernameChanged ...)。 使用 RabbitMq 很容易,因为事件处理程序是根据消息类型调用的。

  1. 你有没有在 kafka 上实现基于 routing/filtering 的消息?
  2. 我们是否应该消费所有消息,反序列化它们并忽略消费者不需要的消息? (听起来像是开销)
  3. 我们是否应该将这些主题转发到风暴并将这些消息重定向到消费者目标主题? (听起来有点矫枉过正且无法扩展)
  4. 使用分区作为路由机制似乎不合逻辑

为每个标准对象操作使用不同的主题:创建、读取、更新和删除,使用 "UserCreated"、"UserRead" 等命名约定。如果您考虑一下,对于每个对象,您可能会有不同的架构。创建将需要一个有效的对象;阅读将需要某种过滤器;更新您可能想要处理增量更新(将 10 添加到特定字段等)。

如果不同的操作有不同的模式,就会使反序列化变得困难。如果您使用的是像 JavaScript 这样松散的语言,那么好吧——没什么大不了的。但是像 Scala 这样的严格类型的语言在同一个主题中有不同的模式是有问题的。

它还会解决您的问题 -- 您可以准确地听取您想要的操作类型,不多也不少。