【问题标题】:Microservices async communication circuit breaker微服务异步通信断路器
【发布时间】:2021-09-19 05:58:43
【问题描述】:

我有 2 个使用 spring boot 运行的服务,我有以下情况:

服务 A(N 个实例)-> 队列(多个实例)-> 服务 B(N 个实例)

  • 服务 A 异步排队事件
  • 服务 B 出队事件

流量正在增加,我们注意到活动需要花费大量时间排队。我们需要更快地处理事件。每个事件的负载都很小,这个解决方案已经工作了几年,几年前他们认为队列是个好主意,但现在我遇到了这个性能问题。

  • 我正在考虑在服务 B 中创建一个端点并从服务 A 中访问该端点。

这个调用应该是异步的,并且还应该实现一个断路器以避免在 B 出现故障时丢失消息。如果 B 出现故障,我可以使用队列来保存消息,一旦 B 运行并再次从队列中提取消息。

我有两个问题:

  • 是否可以为异步调用实现断路器或故障转移机制?

  • 您认为还有其他更好的方法吗?

谢谢

【问题讨论】:

  • 您的解决方案将如何帮助We need to process events faster.?也许您需要研究服务 b 的性能/扩展性?
  • 我们在服务和队列中有一些监视器,我们看到消息大部分时间都在队列中。当我们增加队列中的实例时,一切都会更好
  • 这意味着服务 B 可以快速处理所有内容,因为一旦我们在队列中增加实例,就无需在 B 中添加更多实例
  • 您可以使用消费者组来扩展和消费消息。Link::activemq.apache.org/message-groups
  • 要求“其他可能更好的方法”将产生讨论和基于意见的答案,而不是基于事实的答案。这是 Stack Overflow 上的题外话。此外,您在这里问了多个问题,这也是题外话。

标签: java asynchronous microservices circuit-breaker


【解决方案1】:

提问

  1. 是的,有可能,我假设您正在使用 spring boot,因为您在标签中提到了 java,所以有一种称为 RetryTemplate 的机制,您也可以将其用于异步调用,您可以在此处找到更多详细信息 -> https://www.openprogrammer.info/2019/09/03/using-spring-boot-async-with-retry/

  2. 我会说有更好的方法,当你在这里说队列时,你实现了什么?喜欢它是 LIFO 还是 AWS SQS 之类的东西?如果是这种情况,那么您可以尝试寻找基于主题的队列机制,例如 apache kafka

【讨论】:

  • 我们使用主动 mq... 那么问题是,你认为异步调用会比任何其他队列系统或类似的队列系统更快,如 sqs、kafka 等
  • 因此它肯定不会比队列快,但同时队列为您提供了您输入的每条消息的确认传递,您不需要依赖断路器。而且您始终可以微调队列参数以获得更好的性能
  • 对不起,我没听懂你是说队列比异步服务之间的调用更快?
  • 哦,我打错了“not”,肯定会比队列快,但就我之前提到的确认消息传递而言,队列是可靠的
【解决方案2】:

如果瓶颈在队列中,我认为您不应该将其删除。您可以尝试使用 SQS 或其他基于云的队列,它们没有这个问题。

如果服务 A 直接调用服务 B,而服务 B 宕机了怎么办?请求将丢失。使用队列,消息将一直保留在那里,直到服务 B 恢复。

断路器用于避免请求使失败的服务不堪重负(以使其恢复)。因此,当它启动时,那里会出现明显的数据丢失。

【讨论】:

  • 实际上我们是直接命中端点并实现电路制动...如果 B 出现故障,我们会将事件排入队列。我们还将用 sqs 替换活动 mq
猜你喜欢
  • 2021-08-19
  • 1970-01-01
  • 2017-02-24
  • 2017-01-28
  • 2018-03-17
  • 2020-06-11
  • 2021-08-20
  • 1970-01-01
  • 2018-05-07
相关资源
最近更新 更多