Apache Kafka 按特定顺序消费来自不同主题的事件

Ave*_*tes 4 concurrency java-8 apache-kafka spring-kafka

比方说,我有 topicA、topicB 和 topicC,这两个主题根据域实体由单独的事件类型分隔。topicA 仅与 eventA 一起操作,topicB 保留 eventB,topicC 仅与 eventC 一起操作。所有事件都通过业务领域相互关联,但由单独的微服务生成,并且应按特定顺序进行处理。

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

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

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

另外,我浏览了连接模式,但没有找到任何可靠的实现方法。

Ole*_*kyi 5

解决这个问题的方法可能有很多种。我可以建议以下几个:

  • 引入相关 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拉取以获取其他服务产生的事件。