微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

微服务异步通信断路器

如何解决微服务异步通信断路器

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

Service A(N 个实例)-> Queue(多个实例)-> Service B(N 个实例)

  • Service A enqueue events async
  • 服务 B 出队事件

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

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

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

我有两个问题:

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

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

谢谢

解决方法

问题

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

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

,

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。