新来个技术总监,把 RabbitMQ 讲得那叫一个透彻,佩服


新来个技术总监,把 RabbitMQ 讲得那叫一个透彻,佩服

文章插图
整体阅读时间,在 40 分钟左右 。
常见的消息队列很多,主要包括 RabbitMQ、Kafka、RocketMQ 和 ActiveMQ,相关的选型可以看我之前的系列,这篇文章只讲 RabbitMQ,先讲原理,后搞实战 。
文章很长,如果你能一次性看完,“大哥,请收下我的膝盖”,建议大家先收藏,啥时需要面试,或者工作中遇到了,可以再慢慢看 。
不 BB,直接上思维导图:
新来个技术总监,把 RabbitMQ 讲得那叫一个透彻,佩服

文章插图
1. 消息队列1.1 消息队列模式消息队列目前主要 2 种模式,分别为“点对点模式”和“发布/订阅模式” 。
1.1.1 点对点模式一个具体的消息只能由一个消费者消费,多个生产者可以向同一个消息队列发送消息,但是一个消息在被一个消息者处理的时候,这个消息在队列上会被锁住或者被移除并且其他消费者无法处理该消息 。
需要额外注意的是,如果消费者处理一个消息失败了,消息系统一般会把这个消息放回队列,这样其他消费者可以继续处理 。
新来个技术总监,把 RabbitMQ 讲得那叫一个透彻,佩服

文章插图
1.1.2 发布/订阅模式单个消息可以被多个订阅者并发的获取和处理 。一般来说,订阅有两种类型:
  • 临时(ephemeral)订阅:这种订阅只有在消费者启动并且运行的时候才存在 。一旦消费者退出,相应的订阅以及尚未处理的消息就会丢失 。
  • 持久(durable)订阅:这种订阅会一直存在,除非主动去删除 。消费者退出后,消息系统会继续维护该订阅,并且后续消息可以被继续处理 。

新来个技术总监,把 RabbitMQ 讲得那叫一个透彻,佩服

文章插图
1.2 衡量标准对消息队列进行技术选型时,需要通过以下指标衡量你所选择的消息队列,是否可以满足你的需求:
  • 消息顺序:发送到队列的消息,消费时是否可以保证消费的顺序,比如A先下单,B后下单,应该是A先去扣库存,B再去扣,顺序不能反 。
  • 消息路由:根据路由规则,只订阅匹配路由规则的消息,比如有A/B两者规则的消息,消费者可以只订阅A消息,B消息不会消费 。
  • 消息可靠性:是否会存在丢消息的情况,比如有A/B两个消息,最后只有B消息能消费,A消息丢失 。
  • 消息时序:主要包括“消息存活时间”和“延迟/预定的消息”,“消息存活时间”表示生产者可以对消息设置TTL,如果超过该TTL,消息会自动消失;“延迟/预定的消息”指的是可以延迟或者预订消费消息,比如延时5分钟,那么消息会5分钟后才能让消费者消费,时间未到的话,是不能消费的 。
  • 消息留存:消息消费成功后,是否还会继续保留在消息队列 。
  • 容错性:当一条消息消费失败后,是否有一些机制,保证这条消息是一种能成功,比如异步第三方退款消息,需要保证这条消息消费掉,才能确定给用户退款成功,所以必须保证这条消息消费成功的准确性 。
  • 伸缩:当消息队列性能有问题,比如消费太慢,是否可以快速支持库容;当消费队列过多,浪费系统资源,是否可以支持缩容 。
  • 吞吐量:支持的最高并发数 。
2. RabbitMQ 原理初探RabbitMQ 2007 年发布,是使用 Erlang 语言开发的开源消息队列系统,基于 AMQP 协议来实现 。
2.1 基本概念提到RabbitMQ,就不得不提AMQP协议 。AMQP协议是具有现代特征的二进制协议 。是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计 。
先了解一下AMQP协议中间的几个重要概念: