架构:使用单独的队列进行错误处理?

问题描述 投票:0回答:2

我们有一个小型微服务,其唯一目的是通过队列接收消息并将其发送到外部系统。这些消息可以来自任意数量的其他服务,并且该服务不知道消息的内容。外部系统可以接受或拒绝该消息。我看到了许多处理外部系统响应的选项:

  • 将响应放在用于接收消息的同一队列中
  • 将响应放在不同的队列中
  • 将成功响应放在不同的队列中,将错误响应放在另一个队列中

我倾向于选择第三个选项来分离关注点,并且不会因为错误流程而干扰愉快的流程,但希望得到反馈,为什么这可能是一个糟糕的选择。

是否有任何可用资源记录此类问题的最佳实践解决方案?

(我知道上面可以重写为从队列读取消息并将消息存储在数据库中的服务,异步将消息发送到外部系统并将响应存储在数据库中,发布一个事件以指示消息已处理并且开发一个 API 以允许从数据库检索响应,但这需要额外的数据库、更多的工作和更多的资源,在我看来这有点过头了)

architecture messaging mq
2个回答
3
投票

我也会选择第三种选择,并出于几个原因将您的担忧分开。

  1. 如果所有不同类型的消息都在同一个队列上,那么您的消费者将必须使用过滤器/选择器来获取他们想要的消息。这将增加消费者的复杂性。此外,消费者端过滤器/选择器通常不被鼓励,因为它们会对性能产生负面影响,因为代理必须进行队列扫描才能找到与消费者过滤器匹配的消息。
  2. 如果所有消息都在同一个队列上,那么管理会更加复杂。例如,如果您想知道发生了多少错误,则需要管理工具扫描队列以查找与错误模式匹配的消息。如果错误出现在单独的队列上,您只需要查看队列中的消息数量即可。
  3. 多个队列通常可以提高性能,因为它们可以提高并行性并减少瓶颈。大多数现代代理(例如 ActiveMQ Artemis)可以很好地扩展多个队列和客户端。

值得注意的是,消息代理并不像数据库那样用于长期数据存储。如果您打算将响应详细信息保留一段时间,您可能希望在某个时候将它们卸载到数据库中。


0
投票

拥有单独的错误队列/路径是一种将错误扔回调用者的替代方案(以某种方式)......面向铁路的编程。

© www.soinside.com 2019 - 2024. All rights reserved.