【问题标题】:Message routing in kafkakafka中的消息路由
【发布时间】:2016-06-26 02:05:50
【问题描述】:

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

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

【问题讨论】:

  • 1 - 在使用 Kafka 的一年中从未出现过类似的情况。 2 - 差不多,是的,除非您有更细化或有针对性的主题。好消息是,如果您的客户端具有完整的 snappy 支持 3 功能,那么从 Kafka 消费很便宜 - 只有您可以回答这个问题。使用 Camel 可以完成更轻的路由。 4 - 这根本不是分区的目的。当您需要快速提供大量数据时,Kafka 是一个非常强大的工具,但代价是更微妙地控制数据的分发方式。你不会用消防水管给花园浇水。
  • 不仅从 Kafka 消费很便宜,而且阅读整个流并折腾你想要的东西实际上从生产方来说也很便宜。磁盘驱动器进行线性读取与随机读取相比要快 100 到 1,000 倍。这是 Kafka 设计理念的重要组成部分:kafka.apache.org/08/design.html

标签: apache-kafka kafka-consumer-api


【解决方案1】:

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

如果不同的动作有不同的模式,反序列化会很困难。如果您使用的是 JavaScript 之类的松散语言,那没关系——没什么大不了的。但是像 Scala 这样的严格类型语言在同一主题中具有不同的模式是有问题的。

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

【讨论】:

  • 这意味着我们必须为每个事件类型创建一个 kafka 主题。考虑到多个微服务,这意味着主题数 = 所有服务的事件类型数。那不会降低kafka的性能吗?最重要的是,这意味着我们失去了每个聚合事件类型的顺序:UserCreated 然后 UserNameChanged 事件可以乱序传递给其他服务,这增加了复杂性
  • 拥有额外的主题不会成为问题(请参阅此处:quora.com/How-many-topics-can-be-created-in-Apache-Kafka),您对事件进行排序是绝对正确的。然而,每个主题确实应该有一个模式。肯定是泡菜。
  • 你好@DavidGriffin,失去订单保证对我来说似乎是一个巨大的缺点。假设我们有一个事件存储,所有针对流运行的投影仪都保证它们将按顺序接收事件。如果他们不这样做,计算的状态可能完全不正确(如果没有这个顺序保证,时间旅行根本不可能)。请问您有一些系统示例可以对这种无序的事件流做出反应,以及它们是如何处理的吗?我对 Kafka 很陌生,所以我可能会错误地表示手头的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-17
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
  • 2015-12-10
  • 1970-01-01
相关资源
最近更新 更多