【问题标题】:Dynamic message "routing" pattern?动态消息“路由”模式?
【发布时间】:2019-01-28 15:00:52
【问题描述】:

我们正在构建一个使用微服务和 AWS SQS 进行消息传递的应用程序。

我们要求一条消息在被“最终目的地”微服务处理之前由多个微服务处理。

例如:

  • 微服务 A 生成消息
  • 消息必须由微服务 B 验证
  • 必须使用微服务 C 转换经过验证的消息
  • 必须使用微服务 D 将转换后的消息应用到数据存储中

是否存在动态(在消息创建时)规定消息队列上的侦听器之间的消息流的模式?

【问题讨论】:

标签: design-patterns microservices message-queue


【解决方案1】:

如下链接中所述,SQS 似乎无法实现消息的选择性路由

Finding certain messages in SQS

正如您从 SQS 文档 https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/sqs/src/main/java/aws/example/sqs/SendReceiveMessages.java 中看到的那样,您无法添加属性来对消息进行分类,即 SQS 不是针对用例构建的

唯一可能的解决方案是为不同类型的消息使用三个不同的队列,并让每个微服务监听特定类型的消息,这是管道和过滤器设计模式的典型用例

另一方面,如果您考虑构建自己的动态路由队列,请参阅此文档以实现本企业设计模式文档https://www.enterpriseintegrationpatterns.com/patterns/messaging/ContentBasedRouter.html 中讨论的基于内容的路由器

希望对你有帮助!

【讨论】:

  • 您的回答对我的问题是正确的,谢谢。您如何看待使用“调度程序”微服务来侦听通用队列上的消息,检查消息内容,然后将消息中继到与相应处理程序微服务关联的队列。然后有一个单独的“响应”队列,发起者将监听响应消息?
  • @JoelStevick :您建议的设计与我的建议很接近,如下所示的管道和过滤器架构模式使用单独的 SQS 队列 - service1 作用于 msg -> 将 msg 排队到 SQS Q1 , service2 侦听 SQS Q1 并对其采取行动,然后将其推送到 SQS Q2, service3 侦听 SQS Q3 并对其采取行动。希望清楚
  • 那么,如果 service3 想要向 service1 发送响应消息,那将如何实现呢?我在想一个合理的方法是有一个“响应”队列,service1 会监听来自任何其他服务的完成结果;那会是反模式吗?
  • 从我能够确定我正在寻找的确切模式的答案中,它被称为“routing slip
猜你喜欢
  • 1970-01-01
  • 2014-09-17
  • 1970-01-01
  • 2020-12-20
  • 2021-11-18
  • 2014-10-06
  • 1970-01-01
  • 2015-12-10
  • 1970-01-01
相关资源
最近更新 更多