design-patterns - 管理一个 Kafka 主题的多个消费者的消息
问题描述
我正在实施一个利用 Apache Kafka 的工作流程,其中我有多个生产者和多个消费者。
简而言之,类似于订单处理工作流程,其中:
- 生产者接收并发布一个“订单”到一个主题。Consumer_1 接受“订单”,对其进行验证并将相同的“订单”发布到同一主题。
- Consumer_2 收到“验证订单”并检查仓库中的库存。一旦确认,它就会向同一主题发布相同的“订单”。
- Consumer_3 收到 ' Validated & Warehouse Confirmed Order ' 并发送到同一主题等...
我为我的消费者创建了一个“订单”类型的对象,以使用 State 作为局部变量进行处理,每个消费者在完成后都会更新该变量。
使用上述多个生产者/消费者和一个主题的方法,我看到了维护消息状态(已验证、已确认仓库、已发送等)的问题,其中每个消费者必须处理所有消息并检查状态是否与当前消费者的责任相对应. 同样使用这种方法,所有消费者都必须属于不同的消费者组才能接收所有消息(这并不理想)并因此确认所有消息(即使是那些不是发往他们的消息)。
我考虑的其他方法是创建多个主题(每个“状态”一个,但在这种情况下,我的“订单”消息将用于发布到多个主题,这似乎违反了 Kafka 原则。
我还可以创建不同的“类型”订单,即 ValidatedOrder、WarehouseConfirmedOrder、DispatchedOrder,从而在我的消费者中删除状态检查,而是引入一个“类型”过滤器,这似乎与我原来的状态解决方案非常相似。
在这里可以应用哪些最佳实践和替代技术?
您可以指出上述任何文件吗?
解决方案
推荐阅读
- javascript - 谷歌地图仅在 USB 调试时加载
- c++ - cublasSasum 在自定义 TensorFlow op 中导致分段错误
- swift - 在 Swift 中初始化二维用户定义数组
- c# - 在这个正则表达式中防止灾难性的回溯
- angular - 创建缓存(Angular - 插件)
- excel - VBA如何根据日期仅锁定工作表中的某些列
- python - 将 yyyymm 格式的列映射到数字列的 Pythonic 方法?
- ios - 在 UITextView.attributedText 中插入 unicode 的正确方法
- java - 在附加的堆栈跟踪中获取了资源,但从未释放。有关避免资源泄漏的信息,请参阅 java.io.Closeable,为什么会发生这种情况
- jboss - 在 jboss 7.1 中配置 MDB 和 MQ 时面临的问题