-1

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

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

有什么办法来配置TopicA和TopicB以确保消息从TopicA接收的第一,然后从TopicB接收。

换句话说,我怎样才能使主题之间的依赖关系?

+0

数据如何发送到TopicA和TopicB?数据是否保证在TopicB之前发送给TopicA,而您只是想按照正确的顺序阅读它?或者可以在TopicA之前将数据发送到TopicB,并且您只是想确保TopicA在TopicB之前位于TopicB中? – morganw09dev

+0

为什么你需要两个不同的主题?只需使用一个插入对象的主题即可。 –

+0

如果主题分区为1,则使用一个主题可以解决我的问题。但对于更多的分区,它仍然无法正常工作。 – fcbflying

回答

1

所有卡夫卡消费消息和基于偏移量产生消息。卡夫卡主题能够提供的唯一一件事就是保证您可以按照写给卡夫卡的顺序使用邮件。您可以控制从某个主题中消费的速度,但您可以访问的唯一信息是您所在每个主题的偏移量。

话说,在这里你需要TopicA和TopicB之间的相关性似乎并不只可执行使用卡夫卡您的使用案例。

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

+0

非常感谢。其实我已经做了一些你所说的话题。但我不认为这是一个更好的解决方案。也许我应该改变我的设计。 – fcbflying

+0

当我使用名为'MyTopic'的相同主题时,另一个问题是每个主题有两个分区,并且可能消费者A的这个结果接收到带有'MyTopic'的消息来首先更新它,然后另一个消费者接收到具有相同消息的消息主题来创建对象。似乎只有一个分区中的主题才能将接收顺序保留为发布顺序。例如,我首先发布'test message1',然后将'test message2'发布到主题'Test'。如果主题具有两个分区,首先接收'测试消息2',然后消费者B接收'测试消息1'。 – fcbflying