问题描述
假设我有 N 个城市,每个城市都将通过生成 Kafka 事件来报告其每小时 (H) 的温度。我有一个复杂的模型,我想运行,但想确保它不会在读取所有 N 之前尝试启动。
说它们是分批生产的,我知道为了确保至少一次消费,如果消费者在批次中失败,那么它将在批次的前面恢复。我已将其构建到我的模型中,以按唯一城市进行计数(如果一个城市被多次发送,它将覆盖现有记录)。
我目前的计划是这样设置:
- 一个应用程序创建了一个初始事件,上面写着“期望这 N 个城市在 H o'clock 报告”。
- 事件由另一个应用程序持久化(在 db、Redis 等中)。写入后,它会生成一个事件,说明到目前为止 H 总共报告了多少个独特的城市。
- 某些进程将初始的“Expect N”事件与“N Written”事件相匹配。当 H 的数据集相等时,它会提醒系统的其余部分已准备好创建模型。
这个问题有名字吗?是否有通用的模式或库来管理它?
概述的解决方案是否存在明显漏洞或使问题过于复杂?
解决方法
您所描述的听起来像 Aggregator,由 Gregor Hohpe 和 Bobby Woolf 的“企业集成模式”描述为:
接收消息流并识别相关消息的特殊过滤器。一旦接收到一组完整的消息 [...],聚合器会从每个相关消息中收集信息,并将单个聚合消息发布到输出通道以供进一步处理。
这可以在 Kafka Streams 之上完成,使用其内置聚合,或使用您建议的有状态服务。
另一个建议——使用事件驱动的编排设计这样的流程可能很棘手。我见过强大的工程团队因为没有先学会游泳就潜入深渊而无法提供类似的解决方案。如果您的规模需要它并且您的组织已经为事件驱动的分布式架构做好了准备,那么就去吧,但如果没有,请考虑基于编排的替代方案(例如,AWS Step Functions、Airflow 或其他工作流编排工具)。这些更容易推理和调试。