微服务异步通信断路器

1szpjjfi  于 2021-08-20  发布在  Java
关注(0)|答案(2)|浏览(338)

我有2个服务使用spring boot运行,我有以下情况:
服务a(n个示例)->队列(多个示例)->服务b(n个示例)
服务a异步排队事件
服务b出列事件
交通量在增加,我们注意到事件会花很多时间排队。我们需要更快地处理事件。每个事件的负载都很小,这个解决方案已经运行了好几年,几年前他们认为拥有一个队列是个好主意,但现在我遇到了这个性能问题。
我正在考虑在服务b中创建一个端点,并从服务a中点击该端点。
这个调用应该是异步的,并且还实现了一个断路器,以避免在b下降时丢失消息。如果b下降,我可以使用队列来保存消息,一旦b运行并再次上升,就可以从队列中提取消息。
我有两个问题:
是否可以为异步调用实现断路器或故障切换机制?
你认为还有其他更好的方法吗?
谢谢

xt0899hw

xt0899hw1#

有疑问
是的,这是可能的,我假设您正在使用SpringBoot,正如您在标记中提到的java一样,因此有一种称为retrytemplate的机制,您也可以用于异步调用,您可以在这里找到更多详细信息->https://www.openprogrammer.info/2019/09/03/using-spring-boot-async-with-retry/
有更好的方法,我会说,当你说这里排队时,你实现了什么?像是后进先出还是aws sqs?如果是这样,那么您可以尝试寻找基于主题的队列机制,如ApacheKafka

55ooxyrt

55ooxyrt2#

如果瓶颈在队列中,我认为您不应该将其移除。您可以尝试使用sqs或其他基于云的队列,这没有问题。
如果服务a直接调用服务b,而服务b关闭,会发生什么情况?请求将丢失。对于队列,消息将保留在那里,直到服务b恢复。
断路器用于避免请求压倒失败的服务(以允许其恢复)。因此,当它启动时,显然会出现数据丢失。

相关问题