RabbitMQ:实践经验与常见问题

保证消息可靠性

生产者发送消息到broker的可靠性

服务端确认机制

  • channel设置为事务模式(transaction模式):缺点:阻塞、性能下降;消耗额外的性能,不建议生产环境使用。
  • confirm模式:waitForConfirm(),发送成功后会confirm;可以批量确认,提升性能;还可以异步确认,边发送边确认。

交换机的可靠性(路由保证)

  • mandatory设置成true,并添加ReturnListener,假如路由失败会收到回调消息(假如mandatory为false,路由失败会丢弃消息)。
  • 设置交换机的备份交换机。路由失败的时候会到对应的备份交换机。

队列的可靠性

  • 队列持久化
  • 交换机持久化
  • 消息持久化
  • 集群

消费端的可靠性

消费者确认机制

  • ACK机制,默认自动确认(接收到消息就确认,并不管后面的处理逻辑),可以设置成手动确认。

防止重复消费消息

为什么消息会重复?

消费端回调响应:假如生产者未收到回调,重发(重发间隔、重发次数)。

如何幂等处理消息

业务消息必须有唯一的业务id,消息id。即msgId、bizId。
数据库中的唯一业务id保证幂等。
redis存消息id保证幂等。

保证服务可靠

RabbitMQ集群

集群目的:高可用、负载拓展
集群如何识别:通过erlang.cookie
集群节点类型:disc(元数据存储在磁盘中)、RAM(元数据在内存中)。至少需要一个磁盘节点。

  • 普通集群

  • 镜像队列
    镜像队列会复制队列消息

VRRP 虚拟路由冗余协议

KeepAlived:负载、高可用

资源管理

谁来创建exchange、queue:消费者

面试题

消息队列的作用和使用场景

削峰、异步、解耦

Channel和vhost的作用是什么

复用连接、vhost提升硬件利用率,资源隔离

RabbitMQ有哪些路由方式,适合在什么场景使用

Direct、Topic、Fanout、Headers

交换机和队列、队列和消费者的绑定关系

多对多

无法被路由的消息去了哪里

备份交换机;假如设置了mandatory为true,有回调消息;假如没其他措施,则会丢失

消息在什么时候会变成死信

消息被拒绝;消息到达过期时间;队列已满。

RabbitMQ怎么实现延迟队列

通过死信队列+TTL,消息过期后会到死信交换机中,进一步到达死信队列。

消息丢失?

发送者->交换机->队列->消费者,从整个链路分析

一个队列最多可以存多少条消息

取决于硬件配置,和最大数量参数。

如何提高消费速率

增加消费者

如何动态创建消费者和队列

在ListenerContainer设置消费者数量

保证消息顺序性

一个队列对应一个消费者

消息堆积怎么处理

寻找堆积的原因,代码问题重启。速率问题,优化代码。清空队列之后重发消息。

MQ选型分析

  • 使用和管理
  • 性能:并发性,吞吐量,消息堆积能力
  • 功能
  • 可用,持久化,可靠性
posted @ 2020-07-31 00:20  挣扎一下  阅读(317)  评论(0)    收藏  举报