消息中间件是用于分步式系统之间收发消息的组件。


消息中间件的作用

1. 应用解耦

2. 异步处理

比如用户注册场景,注册主流程完成以后,需要调用邮件系统发送邮件通知用户注册成功,可能还需要调用其他系统。这是串行的,如果一个系统依赖很多系统,那么这个主流程会比较长,耦合度高,整个系统维护成本也会越来越高。那么我们就可以使用消息中间件来进行解耦,通过发布订阅模式,完成用户注册之后,向中间件发送消息,这样就可以马上给用户返回,至于后续工作其他系统向中间件订阅这个消息并完成后续工作就好。这也就是一个解耦和异步处理过程。


中间件有下面两种模型

点对点模型

消息中间件(一)基础_第1张图片

发布订阅模型

消息中间件(一)基础_第2张图片


消息中间件的解耦和异步是两个最重要的需求点,除此之外还应该做一些其他事情比如:

  • 保证一致性,产生消息和发送消息是一致的,也就是如果操作成功,那么消息一定发送成功;如果业务操作没有成功那么就不能发送消息

  • 具备一定消息堆积能力,可以为后端挡住一些数据流保证后端不会被压垮

  • 具备消息实时性,保证消息的低延迟

  • 具备消息的可靠性,主要是可靠地存储和投递


消息系统里面应该有这样一个假设:消息一定会堆积。下游系统通常有很多,里面有重要的也不重要的,面对突发流量高峰,一定会有后端系统处理不过来的情况,从而造成消息堆积;当然还有一种情况是后端系统出现问题导致暂时无法消费消息从而造成消息中间件的消息堆积。所以中间件要起到蓄水池的作用。


数据一致性,这个很容易理解,因为是分布式异步的,但是又不能容忍数据出错,所以在性能和数据一致性方面就需要有所妥协,通常在互联网行业中采取最终一致性。需要注意的是最终一致性和弱一致性不同,弱一致性表示允许在异常情况下数据可能不一致,而最终一致性则是在某段时间内允许不一致但是最终会一致。