【问题标题】:Kafka dependency between topics主题之间的Kafka依赖关系
【发布时间】:2016-02-21 11:35:36
【问题描述】:

我创建了一个订阅两个主题 TopicA 和 TopicB 的消费者。 当消费者收到来自 TopicA 的消息时,我的业务逻辑是将 ObjectA 存储到 MySQL 中。 当消费者收到来自TopicB的消息时,我的业务逻辑是更新ObjectA。

但现在的问题是: TopicA 和 TopicB 是相互独立的。 消费者可能会先收到来自 TopicB 的消息,然后再收到来自 TopicA 的消息。 尝试更新 ObjectA 时,发现它在 mysql 中不存在,然后会抛出 NullPointerException。

有什么方法可以配置 TopicA 和 TopicB 以确保消息先从 TopicA 接收,然后从 TopicB 接收。

换句话说,如何在主题之间建立依赖关系?

【问题讨论】:

  • 如何将数据发送到 TopicA 和 TopicB?数据是否保证在 TopicB 之前发送到 TopicA 并且您只想以正确的顺序读取它?或者数据可以在 TopicA 之前发送到 TopicB 并且您只想确保它在 TopicA 之前在 TopicB 中?
  • 为什么需要两个不同的主题?只需使用一个主题来提升对象。
  • 如果topic的partition为1,使用一个topic可以解决我的问题。但是对于更多partition,它仍然无法正常工作。

标签: dependencies apache-kafka kafka-consumer-api apache-zookeeper


【解决方案1】:

所有 Kafka 都会使用消息并根据偏移量生成消息。 Kafka Topics 唯一能提供的就是保证您能够按照消息写入 Kafka 的顺序来使用它们。您可以控制从主题中消费的速度,但您可以访问的唯一信息是您所在的每个主题中的偏移量。

也就是说,您需要在 TopicA 和 TopicB 之间建立依赖关系的用例似乎无法仅使用 Kafka 来实现。

如果保证消息在 TopicB 之前被写入 TopicA。您可能会想出一个解决方案,将两条消息写入同一个主题,第一次看到特定消息时将其存储在 MySQL 中,第二次更新时。

【讨论】:

  • 非常感谢。实际上我已经按照您所说的做了一些合并主题的事情。但我不认为这是一个更好的解决方案。也许我应该改变我的设计。
  • 当我使用名为“MyTopic”的同一个主题时,另一个问题是每个主题有两个分区,这导致消费者A可能会收到带有“MyTopic”的消息,然后先更新它另一个消费者接收具有相同主题的消息以创建对象。好像只有一个分区中的主题才能保持接收顺序为发布顺序。例如,我先发布“测试消息1”,然后将“测试消息2”发布到主题“测试”。如果主题有两个分区,可能消费者A 先接收“测试消息 2”,然后消费者 B 接收“测试消息 1”。
猜你喜欢
  • 1970-01-01
  • 2016-09-10
  • 2010-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多