- 与业务解藕:一个具有普适性质的消息队列组件不需要考虑上层的业务模型,只做好消息的分发就可以了,上层业务的不同模块反而需要依赖消息队列所定义的规范进行通信。
- FIFO:先投递先到达的保证是一个消息队列和一个buffer的本质区别。
- 支持容灾:对于普适的消息队列组件来说,节点的动态增删和消息的持久化,备份等
- 提高性能:消息队列的吞吐量上去了,整个系统的内部通信效率也会有提高。
二、消息队列的应用场景
当系统中出现“生产“和“消费“的速度或稳定性等因素不一致的时候,就需要消息队列,作为抽象层,弥合双方的差异。“ 消息 ”是在两台服务器间传送的数据单位。消息可以非常简单,例如只包含文本字符串;也可以更复杂,可能包含嵌入对象。消息被发送到队列中,“ 消息队列 ”是在消息的传输过程中保存消息的容器 。
实例:
(1)业务系统触发短信发送申请,但短信发送模块速度跟不上,需要将来不及处理的消息暂存一下,缓冲压力。就可以把短信发送申请丢到消息队列,直接返回用户成功,短信发送模块再可以慢慢去消息队列中取消息进行处理。
(2)调远程系统下订单成本较高,且因为网络等因素,不稳定,攒一批一起发送。
(3)任务处理类的系统,先把用户发起的任务请求接收过来存到消息队列中,然后后端开启多个应用程序从队列中取任务进行处理
三、消息队列的好处
- 提高系统响应速度(异步)
使用了消息队列,生产者一方,把消息往队列里一扔,就可以立马返回,响应用户了。无需等待处理结果。处理结果可以让用户稍后自己来取。也可以让生产者订阅(如:留下手机号码或让生产者实现listener接口、加入监听队列)。 - 提高系统稳定性(解耦,消峰)
双十一时,考虑电商系统下订单,发送数据给生产系统的情况。电商系统和生产系统之间的网络有可能掉线,生产系统可能会因维护等原因暂停服务或者请求太多处理不及时。如果不使用消息队列,电商系统数据发布出去,顾客无法下单,影响业务开展。两个系统间不应该如此紧密耦合,应该通过消息队列解耦。
四、常见的消息队列