MQ相关(RabbitMQ)

Lewis
2022-02-14 / 0 评论 / 111 阅读 / 正在检测是否收录...

1. MQ的优点

答:异步处理,应用解耦,流量削峰,日志处理,消息通讯。

2. MQ的缺点

答:系统可用性降低,系统复杂度增加,一致性问题。

3. Kafka、ActiveMQ、RabbitMQ、RocketMQ 有什么优缺点?

kzm1al50.png

4. 如何处理消息重复消费问题?

答:消费端处理消息的业务逻辑需要保持幂等性,保证每条消息都有唯一的编号(消息ID),利用一张日志表记录消息处理的结果。

5. RabbitMQ相关概念

kywrsvio.png

标志中文名英文名描述
P生产者Producer消息的发送者,可以将消息发送到交换机
C消费者Consumer消息的接收者,从队列中获取消息并进行消费
X交换机Exchange接收生产者发送的消息,并根据路由键发送给指定队列
Q队列Queue存储从交换机发来的消息
type交换机类型type不同类型的交换机转发消息方式不同
fanout发布/订阅模式fanout广播消息给所有绑定交换机的队列
direct路由模式direct根据路由键发送消息
topic通配符模式topic根据路由键的匹配规则发送消息

6. RabbitMQ 五种工作模式

答:简单模式,工作模式,发布订阅模式,路由模式,通配符(主题)模式。
参考我的另一篇文章: RabbitMQ的5种工作模式

7. 如何保证RabbitMQ消息的顺序性?

kzm220hz.png
答:拆分多个 queue(消息队列),每个 queue(消息队列) 一个 consumer(消费者),就是多一些 queue(消息队列)而已,确实是麻烦点;
或者就一个 queue (消息队列)但是对应一个 consumer(消费者),然后这个 consumer(消费者)内部用内存队列做排队,然后分发给底层不同的 worker 来处理。

8. 如何保证消息不丢失?

答:按照三种场景回答:

  • 生产者发送消息给MQ的时候丢失。
    在生产者端开启confirm模式,每次写的消息会分配一个唯一的id,如果写入了MQ,MQ会返回ack信息。
  • MQ内部丢失,暂存内存中,还没消费,自己挂掉,数据会都丢失。
    MQ设置为持久化。将内存数据持久化到磁盘中
  • 消费者接收后未处理,消费者DIE,消息丢失
    利用MQ提供的ACK机制,关闭MQ的自动ACK,消费者端如果没有ack的话,MQ会重新分配给其他的consumer,不过要保证消息不被重复消费。

9. 消息基于什么传输?

答:由于TCP连接的创建和消费开销较大,切并发收系统资源的限制,有性能瓶颈。RabbitMQ使用信道的方式来传输数据。信道是建立在真实的 TCP 连接内的虚拟连接,且每条 TCP 连接上的信道数量没有限制。

10. 如何解决消息队列的延时以及过期失效问题?消息队列满了以后该怎么处理?有几百万消息持续积压几小时,怎么办?

答:

  • 消息积压处理办法:临时紧急扩容
  • 先修复 consumer 的问题,确保其恢复消费速度,然后将现有 cnosumer 都停掉。新建一个 topic,partition 是原来的 10 倍,临时建立好原先 10 倍的 queue 数量。然后写一个临时的分发数据的 consumer 程序,这个程序部署上去消费积压的数据,消费之后不做耗时的处理,直接均匀轮询写入临时建立好的 10 倍数量的 queue。接着临时征用 10 倍的机器来部署 consumer,每一批 consumer 消费一个临时 queue 的数据。这种做法相当于是临时将 queue 资源和 consumer 资源扩大 10 倍,以正常的 10 倍速度来消费数据。等快速消费完积压数据之后,得恢复原先部署的架构,重新用原先的 consumer 机器来消费消息。
  • MQ中消息失效:假设你用的是 RabbitMQ,RabbtiMQ 是可以设置过期时间的,也就是 TTL。如果消息在 queue 中积压超过一定的时间就会被 RabbitMQ 给清理掉,这个数据就没了。那这就是第二个坑了。这就不是说数据会大量积压在 mq 里,而是大量的数据会直接搞丢。我们可以采取一个方案,就是批量重导,这个我们之前线上也有类似的场景干过。就是大量积压的时候,我们当时就直接丢弃数据了,然后等过了高峰期以后,比如大家一起喝咖啡熬夜到晚上12点以后,用户都睡觉了。这个时候我们就开始写程序,将丢失的那批数据,写个临时程序,一点一点的查出来,然后重新灌入 mq 里面去,把白天丢的数据给他补回来。也只能是这样了。假设 1 万个订单积压在 mq 里面,没有处理,其中 1000 个订单都丢了,你只能手动写程序把那 1000 个订单给查出来,手动发到 mq 里去再补一次。
  • mq消息队列块满了:如果消息积压在 mq 里,你很长时间都没有处理掉,此时导致 mq 都快写满了,咋办?这个还有别的办法吗?没有,谁让你第一个方案执行的太慢了,你临时写程序,接入数据来消费,消费一个丢弃一个,都不要了,快速消费掉所有的消息。然后走第二个方案,到了晚上再补数据吧。
0

评论 (0)

取消