队列和微服务的异步通信

什么是同步通信?

考虑以下微服务架构示例:

微服务架构

您让 Microservice1 调用 Microservice2,而 Microservice2 又调用 Microservice3。假设 Microservice3 提供简单的 Web 服务功能。因此,Microservice1 可以通过 HTTP 向其发送数据请求,并返回包含所请求数据的响应。

这两个微服务之间存在的通信称为同步通信。Microservice1发送请求,等待数据返回,然后继续。

同步通信的缺点

当响应几乎立即到达时,这种通信模式效果很好。但是,它对所涉及的微服务施加了限制。为了使 Microservice1 可用,Microservice2 也需要可用。

在某些情况下,同步通信甚至可能对用户不友好。

假设 Microservice2 宕机了。在这种情况下,需要告知提交请求的用户。你并不总是想这样做。在这种情况下,异步通信提供了更好的选择。

异步通信

看一下以下应用程序架构:

微服务应用架构

在上图中,我们使用了 ZipkinDistributedTracingServer。不同的微服务发送日志,最终在 Zipkin 跟踪服务中进行整合。每个微服务将其跟踪信息放入 RabbitMQ 消息队列中。服务器在消息进入队列时对其进行处理。

在此架构中,应用程序通过 RabbitMQ 进行通信。CurrencyCalculationService 将其自己的跟踪信息放入 RabbitMQ,然后忘记它。它不担心返回给它的响应。

现在,如果 ZipkinDistributedTracingServer 宕机会发生什么?

与之通信的服务一点也不担心。他们将继续向队列发送消息。当服务器恢复时,它会继续处理队列中存在的消息,并将它们保存到数据库中。

异步通信的优点

让我们看看异步通信的一些优点:

在涉及异步消息传递的系统中,服务器不需要始终启动并运行。放入消息队列的消息可以稍后批量处理。

您可以生成多个实例来减轻负载,而不是使用跟踪服务器的单个实例来处理消息队列。

如果您使用现代版本的消息队列,那么您很有可能使用重播功能。这有助于重新处理最初引发错误的消息。

异步通信对于需要最终一致性的系统来说非常有用。

最棒的是,只要我们修复错误并重新处理消息,发起错误请求的服务的用户甚至不需要知道它们。

异步通信的局限性

如果处理需要实时,即如果对某个请求的响应时间存在严格限制,则不能使用异步通信。

概括

相关推荐
Lee川10 小时前
深度拆解:基于面向对象思维的“就地编辑”组件全模块解析
javascript·架构
勤劳打代码10 小时前
Flutter 架构日记 — 状态管理
flutter·架构·前端框架
AI攻城狮15 小时前
OpenClaw 里 TAVILY_API_KEY 明明写在 ~/.bashrc,为什么还是失效?一次完整排查与修复
人工智能·云原生·aigc
子兮曰16 小时前
后端字段又改了?我撸了一个 BFF 数据适配器,从此再也不怕接口“屎山”!
前端·javascript·架构
卓卓不是桌桌18 小时前
如何优雅地处理 iframe 跨域通信?这是我的开源方案
javascript·架构
Qlly18 小时前
DDD 架构为什么适合 MCP Server 开发?
人工智能·后端·架构
阿里云云原生1 天前
零配置部署顶级模型!函数计算一键解锁 Qwen3.5
云原生
AI攻城狮2 天前
Kimi Bot + OpenClaw 完整配置指南:5 步实现本地 AI Agent 集成
人工智能·云原生·aigc
用户881586910912 天前
AI Agent 协作系统架构设计与实践
架构
鹏北海2 天前
Qiankun 微前端实战踩坑历程
前端·架构