concurrency - Apache Kafka 按特定顺序使用来自不同主题的事件
问题描述
比方说,我有 topicA、topicB 和 topicC,这两个主题都基于域实体由不同的事件类型隔离。topicA 仅对 eventA 进行操作,topicB 保留 eventB,topicC 仅对 eventC 进行操作。所有事件都按业务领域相互关联,但由单独的微服务产生,应按特定顺序处理。
问题是,如何使用 Apache Kafka 以特定顺序引入消费事件,eventA 然后等待接收 eventB,然后当 eventC 接收到时消费所有事件。
感谢任何反馈,欢迎提出任何问题。
一些注意事项:Kafka Streams 是一种很好的方法,但受到公司政策的限制。
另外,我查看了加入模式,但没有找到任何可靠的实现方法。
解决方案
可能有很多方法可以解决这个问题。这是一对,我可以建议:
引入相关 ID,它将链接来自主题 A、B 和 C 的事件。然后,按以下方式使用相关 ID:
服务 A、B 和 C 对对应的主题产生事件,但相关事件具有相同的关联 ID
服务 D 使用来自不同主题的事件。每次从任何主题接收事件时,服务 D 要么通过相关 ID 将事件数据插入数据库,要么在收到所有数据时执行一些操作。
例如,当服务 D 接收到事件 C 时,它首先发出查询以检查数据库中是否存在具有来自事件 C 的相关 ID 的记录:
- 如果没有记录,则存储传入事件 C,
- 如果某些记录已经存在,则服务 D 检查事件 C 是否是使用所有数据所需的最后一个事件并执行最终操作,或者将事件 C 插入数据库。
对于每个消费事件,依此类推。
产生事件(A、B 和 C)的链式服务。例如,链可以通过以下方式形成:
服务 A 为主题 A 生成事件
服务 B 消费来自主题 A 的事件,并向主题 B 产生事件(可能是聚合事件 A 和 B)
服务 C 消费来自主题 B 的事件,并产生事件到主题 C(可能聚合事件 A、B 和 C)
最后,服务 D 使用来自主题 C 的事件(可能与 A、B 和 C 聚合)并执行所需的操作。
这种方法的变体(没有在每个中间阶段聚合事件)将链接服务并监听链中的最后一个事件。当最后一个事件被消费时,然后向相应的主题发出 Kafka pull 以获取其他服务产生的事件。
推荐阅读
- python - 在 Node-RED 中使用 Python 节点而不暴露代码
- javascript - 在shopify中向product-card-grid.liquid写入函数时,Javascript简单函数未执行?
- ruby-on-rails - 如何使用 exec_params where params in ('','','')
- c# - 表单帖子字段之一返回 NULL .NET Core MVC
- java - mybatis中如何将String[]映射到PostgreSQL数组列
- reactjs - SyntaxError: Unexpected token < at ScriptTransformer._transformAndBuildScript (../../node_modules/jest-runtime/build/script_transformer.js
- .net-core - .NET 5 未编译为单个文件可执行文件
- java - 避免 @Secured 注解的重复值
- multithreading - 添加回调而不是使用默认实现
- css - 是否可以在 RadioGroup 中使用常规按钮作为单选按钮?