系统解耦

最近更新时间:2019-08-28 19:06:40

以电商的IT架构作为例子,在传统紧耦合订单场景里,客户在电商网站下订单(如买一台手机),订单系统接收到请求后,立即调用库存系统接口,库存减一;但这种模式存在巨大风险:

  • 订单系统与库存系统强耦合,假如库存系统无法访问(升级、业务变更、故障等),则订单减库存将失败,从而导致订单失败;
  • 传统的解决方案是服务间通过订单系统与库存系建立 socket 连接,但是如果库存系统的 IP/端口变更、增加库存系统的接收者,都需要订单系统进行修改;
  • 短时间内大量的请求,对库存系统的 SQL,频繁查询库存,修改库存,库存系统负载极大;
  • 用户的感受:订单失败,重试,依然失败,导致顾客流失。

引入 CMQ 后的方案如下图:

其中几个系统分别工作,解除强耦合性:

  • 订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功。此时客户可以认为手机已经买到了。CMQ 提供异步的通信协议,消息的发送者将消息发送到消息队列后可以立即返回,不用等待接收者的响应。消息会被保存在队列中,直到被接收者取出。

  • 库存系统:从 CMQ 获取下单信息,库存系统根据下单信息进行库存操作。

这样,哪怕用户在下单时库存系统宕机,也不影响正常下单(库存系统修复后再从 CMQ 中取出订单进行操作)。订单系统写入腾讯云 CMQ 消息队列后,就无需再关心其他后续操作了。实现订单系统与库存系统的应用解耦。

像电商这样需要保证消息被可靠传递的业务,即使发送消息(订单系统)时,接收者(库存系统)由于断电、宕机或 CPU 负载过高等原因不可用,消息也可以在接收者恢复可用时被送达。腾讯云 CMQ 的分布式消息队列存储保证了消息的持久化保存,直到接收者成功获取它,而不用担心某些消息队列方案存储在单机内存中而导致的数据丢失。