Rabbit MQ 基础知识:
Rabbit MQ 组成部分:1. 交换机 2. 消息队列 3. 消费者 4. 提供者
简单介绍一下消息执行流程,提供者将数据发送到交换机,交换机将数据推送到相关队列中,消费者去消息队列中获取数据完成业务流程,消息提供者怎么知道将消息发送到那个队列中?消息消费者怎么知道去那个队列拿信息?下面介绍一下信息执行的具体流程
1. 消息提供者在发送消息时会带上交换机的名字 以及 路由 key (RoutingKey)
2. 交换机拿到信息后将信息保存到绑定的队列中 , 不同的交换机推送数据到队列中的规则不一致,RabbitMQ 提供多种交换机,如 Direct 、Funout 、Topic 等常用交换机类型
2.1 Direct 交换机会根据 路由key 与 绑定key 进行比较,如果两个key 一致才会将信息发送到绑定的队列中
2.2 Funout 交换机直接将信息发送给所有绑定到该交换机的队列中
2.3 Topic 交换机支持 绑定key 匹配,路由key 可以使用 "." 进行单词分割,Topic 交换机拿到 路由key 后与绑定队列的 绑定key 进行匹配,如果匹配成功将消息发送到队列中
匹配规则:# 可以匹配任意多个单词, * 可以匹配任意一个单词, 如: 路由 key: chain.news.a
可以与绑定key #.a 、*.news.a 匹配成功
3. 队列获取到消息后会将信息推送给订阅当前队列的消费者
Rabbit MQ 数据持久化 (信息丢失问题):
消息提供者将消息发布后,消息可能在任意一个阶段丢失,导致怎个任务失败,为了确保数据不丢失,Rabbit MQ 提供了 确认机制与数据持久化 保证消息不丢失
1. 消费者将消息发送给交换机,如果保交换机接受消息失败会返回一个 publisher-cofirm nack 给消息提供者,交换机接受消息成功将消息发送给队列,如果队列接受消息失败会返回一个 publisher-return ack 给消息提供者,消息发送失败后需要根据当前的业务有程序员自己处理,例如:重试、保存到数据库定时发送 等解决方案
2. 队列接受到消息但是消息还没有消费,队列宕机了,因为Rabbit MQ 默认数据保存在内存中,所有导致数据丢失,解决方案开启持久化,Rabbit MQ 持久化包括三个部分,持久化队列、持久化交换机、持久化数据,建议生产上三个部分都要持久化,确保服务重启后数据的可传递性
3. 消费者获取到消息还没有消费宕机了导致数据丢失,使用确认机制确保数据丢失,如果队列没有收到消费者返回的确认信息,不删除队列中的消息
Rabbit MQ 消息重复消费(幂等性问题):
消息重复消费一般是消费者拿到消息业务流程执行完毕,但是在向 MQ 发送消费成功信息时,出现消息丢失或者MQ宕机没有接受到确认信息,导致 MQ 中的消息没有删除,继续推送给消费者,解决方案:消息唯一ID校验、分布式锁
消息唯一ID校验:消息消费完再数据库中保存一个消息消费记录,在拿到任务执行消息之前先去数据库查数据,如果有记录表示当前消息被消费过,返送确认信息给MQ删除数据就可以了,数据库没有记录正常任务执行
分布式锁:执行任务之前先使用唯一ID或者根据消息内容生成ID,然后根据ID 获取所资源,如果获取到锁资源正常执行任务,未获取到锁资源返回消息消费确认信息给MQ删除信息
推荐使用消息唯一ID校验,因为分布式锁释放锁资源会删掉缓存信息,如果是 MQ 宕机导致的重复消费,可能 MQ 重启时间较长,导致缓存数据已经被删除无法做重复消费校验了
Rabbit MQ 死信队列、延迟队列:
死信队列:消息提供者在发布消息时设置消息存活时间,在存活时间内没有消费者消费该信息,则该信息为死信,如果当前队列没有绑定死信交换机该消息会被抛弃,绑定有死信交换机,该信息会被存放到死信队列中,被死信队列消费者消费
延迟队列: Rabbit MQ 有两种延迟队列实现方式
1. 使用死信交换机 加 消息过期时间实现,提供者在发送消息时给消息设置一个过期时间,消息在队列一直未被消息,等到消息过期后将消息发给死信交换机存到死信队列中,让死信队列消费者消费打到消息延迟消费
2. 使用 Rabbit MQ 延迟交换机,需要下载延迟交换机插件,只是在普通交换机添加延迟功能,在消息提供者发送消息时,在消息头加上延迟时间属性(x-delay)和过期时间
Rabbit MQ 消息堆积:
消息提供中发布消息的效率大于消费者消费的效率,导致消息堆积在队列中可能出现队列满了新的消息无法存储问题,解决这种问题可以从俩个层次考虑,提高消费者消费信息效率、增大队列容积
提高消费者消费信息效率:消费者只接受消息使用多线程处理任务
增大队列容积:使用惰性队列,它会把消息写道磁盘中等需要处理消息时,把消息从磁盘中读出来,此盘的容积是非常大
Rabbit MQ 集群:
Rabbit MQ 提供两种集群处理高可用问题,分别为 普通集群、镜像集群
普通集群:多个服务共享 交换机、队列等元信息,但是不共享队列中存储的数据,而是其它服务保存指向存有真实数据队列的地址, 在保存或访问数据,访问节点中没有真实数据,会将信息转发到有真是信息的节点保存或获取数据,如果真实保存数据的节点宕机了,就无法保存获取数据了
镜像集群:每个服务都会相同的 交换机、队列、队列数据等信息,在保存和获取数据操作只在主节点(创建队列服务为主节点,其它备份数据的为镜像节点或从节点)操作,数据会同步到其它从节点,当主机点宕机会选着一个从节点主做主节点
镜像集群:每个服务都会相同的 交换机、队列、队列数据等信息,在保存和获取数据操作只在主节点(创建队列服务为主节点,其它备份数据的为镜像节点或从节点)操作,数据会同步到其它从节点,当主机点宕机会选着一个从节点主做主节点
注意:镜像集群主节点在同步数据时宕机了,会出现主从节点数据不一致问题,可以使用仲裁队列解决,仲裁队列通过 Raft 协议保持数据一致性
本文转载自: https://blog.csdn.net/sdfsfaffs/article/details/136721755
版权归原作者 怎么面试 所有, 如有侵权,请联系我们删除。
版权归原作者 怎么面试 所有, 如有侵权,请联系我们删除。