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

时间:2018-10-26 14:52:29

标签: architecture activemq

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

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

我倾向于选择第三个选项来分离关注点,而不是用错误流来打扰开心的流程,但我想反馈为什么这可能是一个错误的选择。

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

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

1 个答案:

答案 0 :(得分:2)

我也会选择第三个选项,出于几个原因将您的疑虑分开。

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

值得注意的是,消息代理并不像数据库那样用于长期数据存储。如果您打算将响应详细信息保留一段时间,则可能需要将它们转移到数据库中。