消息队列 总结
Posted 寂静花开
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了消息队列 总结相关的知识,希望对你有一定的参考价值。
目 录
什么是消息队列
一般来说,消息队列是一种异步的服务间通信方式,是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构。主流的的消息队列有RabbitMQ,Kafka,RocketMQ等
消息(Message):传输的数据。
队列(Queue):队列是一种先进先出的数据结构。
生产者:把数据放到消息队列
消费者:从消息队列里边取数据
为什么使用消息队列
- 通过异步处理提高系统性能(减少响应所需时间)。
- 削峰/限流。
- 降低系统耦合性。
使用消息队列有哪些优缺点?
优点
-
解耦:将系统按照不同的业务功能拆分出来,消息生产者只管把消息发布到 MQ 中而不用管谁来取,消息消费者只管从 MQ 中取消息而不管是谁发布的。消息生产者和消费者都不知道对方的存在;
-
异步:主流程只需要完成业务的核心功能;对于业务非核心功能,将消息放入到消息队列之中进行异步处理,减少请求的等待,提高系统的总体性能;
-
削峰/限流:将所有请求都写到消息队列中,消费服务器按照自身能够处理的请求数从队列中拿到请求,防止请求并发过高将系统搞崩溃;
缺点
- 系统可靠性降低:解耦后,多个系统通过消息中间件交互,消息中间件挂了整个系统就挂了;
- 系统开发复杂度提升:需要考虑消息的处理,包括消息幂等性(重复消费问题),消息保序性(一个订单多条消息问题),以及消息中间件本身的持久化和稳定性可靠性;
- 消息一致性问题:如果一个功能发给多个系统,要所有系统都执行成功才算成功时,需要确保一个功能多个消息的完整一致性;
如何保证消息消费的幂等性?
幂等性:就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。
MQ 消费者的幂等性的解决一般使用全局 ID 或者写个唯一标识比如时间戳 或者 UUID 或者订单消费者消费 MQ 中的消息也可利用 MQ 的该 id 来判断,或者可按自己的规则生成一个全局唯一 id,每次消费消息时用该 id 先判断该消息是否已消费过。
- 唯一 ID+指纹码机制,利用数据库主键去重
- 利用 redis 的原子性
利用 redis 执行 setnx 命令,天然具有幂等性,从而实现不重复消费。
消息队列有哪些路由模型?
RabbitMQ共支持4种消息路由模式,分别为direct、fanout、topic和head。其中
- direct:交换器和队列是一对一的关系,消费者在接收消息的时候交换器和队列的名称必须和生产者定义的完全匹配。
- fanout:把消息投递给所有绑定在此交换器上的队列。
使用此模式时,生产者可以在发布消息的时候,只在信道上声明fanout类型的交换器而不绑定队列给交换器,绑定的操作留给消费者去完成。 - topic:交换器和队列可以通过模糊绑定,“#”表示0个或若干个关键字,“*”表示一个关键字。关键字之间通过“.”分隔。
- head模式是基于消息的head信息进行投递的,应用场景并不多,这里着重介绍前面三种模式。
以上是关于消息队列 总结的主要内容,如果未能解决你的问题,请参考以下文章