首页 > 解决方案 > Apache Kafka 按特定顺序使用来自不同主题的事件

问题描述

比方说,我有 topicA、topicB 和 topicC,这两个主题都基于域实体由不同的事件类型隔离。topicA 仅对 eventA 进行操作,topicB 保留 eventB,topicC 仅对 eventC 进行操作。所有事件都按业务领域相互关联,但由单独的微服务产生,应按特定顺序处理。

问题是,如何使用 Apache Kafka 以特定顺序引入消费事件,eventA 然后等待接收 eventB,然后当 eventC 接收到时消费所有事件。

感谢任何反馈,欢迎提出任何问题。

一些注意事项:Kafka Streams 是一种很好的方法,但受到公司政策的限制。

另外,我查看了加入模式,但没有找到任何可靠的实现方法。

标签: concurrencyjava-8apache-kafkaspring-kafka

解决方案


可能有很多方法可以解决这个问题。这是一对,我可以建议:

  • 引入相关 ID,它将链接来自主题 A、B 和 C 的事件。然后,按以下方式使用相关 ID:

    1. 服务 A、B 和 C 对对应的主题产生事件,但相关事件具有相同的关联 ID

    2. 服务 D 使用来自不同主题的事件。每次从任何主题接收事件时,服务 D 要么通过相关 ID 将事件数据插入数据库,要么在收到所有数据时执行一些操作。

    例如,当服务 D 接收到事件 C 时,它首先发出查询以检查数据库中是否存在具有来自事件 C 的相关 ID 的记录:

    • 如果没有记录,则存储传入事件 C,
    • 如果某些记录已经存在,则服务 D 检查事件 C 是否是使用所有数据所需的最后一个事件并执行最终操作,或者将事件 C 插入数据库。

    对于每个消费事件,依此类推。

  • 产生事件(A、B 和 C)的链式服务。例如,链可以通过以下方式形成:

    1. 服务 A 为主题 A 生成事件

    2. 服务 B 消费来自主题 A 的事件,并向主题 B 产生事件(可能是聚合事件 A 和 B)

    3. 服务 C 消费来自主题 B 的事件,并产生事件到主题 C(可能聚合事件 A、B 和 C)

    4. 最后,服务 D 使用来自主题 C 的事件(可能与 A、B 和 C 聚合)并执行所需的操作。

    这种方法的变体(没有在每个中间阶段聚合事件)将链接服务并监听链中的最后一个事件。当最后一个事件被消费时,然后向相应的主题发出 Kafka pull 以获取其他服务产生的事件。


推荐阅读