消息队列中间件很多,比如ActiveMQ、Kafka 等,这里介绍的是RabbitMQ。
(一)基本概念
RabbitMQ消息模型图
所有消息队列产品的基本服务流程就是消费者(publisher)订阅某个队列,生产者(producer)创建消息,然后发布到队列(queue)中,最后将消息发送到监听的消费者。但RabbitMQ加入了一个Exchange交换器的概念,可以使得生产者先发消息到Exchange交换器,交换器再根据路由规则把消息发送到监听的消费者。
(二)rabbitmq的两大基本工作模式:
首先看下官网文档的截图(P指消息生产者,C代表消息消费者,红色长方形代表queue队列,X代表exchange交换器):
可看到有七种工作模式!
而我们开发中比较常用的主要为前面5种,然后根据是否引入exchange交换器,还可以分为以下两大类:
1.生产者、队列、消费者
一对一:生产者将消息发送到队列,单个消费者从队列中消费消息(即截图中的1——“Hello World”简单模式)。
一对多:生产者将消息发送到队列,多个消费者从队列中平均分摊消费消息,也就是说多个消费者竞争消费消息(即截图中的2——Work queues工作队列模式)。
2.生产者、交换器、队列(可多个)、消费者(可多个)
生产者将信息发送到exchange交换器,交换器根据路由规则(routing-key)转发到与其绑定的队列,然后被监听该队列的消费者从队列中取出消息并消费。
Exchange交换器主要有四种类型:direct、fanout、topic、headers,开发中常用的有以下三种:
- fanout:把所有发送到该Exchange的消息投递到所有与它绑定的队列中(即截图中的3—— Publish/Subscribe发布/订阅模式)。
- direct:把消息投递到那些binding-key与routing-key完全匹配的队列中(即截图中的4——Routing路由模式)。
- 说明:binding-key为生产者发送消息到交换器时需要绑定的key;routing-key为消费者监听的队列与交换器绑定的路由key;当binding-key与routing-key完全匹配时,exchange交换器会将消息投递到该routing-key所属的队列,那么监听这个队列的消费者就会接受消息并消费。
- topic:与direct 类型的交换器相似,在匹配规则上进行了扩展,用 * 和 # 来进行模糊匹配,* 可以替代一个单词,# 可以替换一个或多个单词;比如lazy.# 可以匹配lazy.abc或者lazy.abc.def,但lazy.* 只能匹配lazy.abc或者lazy.def(即截图中的5—— Topics主题模式,也叫通配符模式)。
例子:
上图中Q1的binding-key为*.orange.,Q2的binding-key为.*.rabbit和lazy.#
假如发送routing-key为quick.orange.dog的消息给交换器,那么交换器会转发消息到队列Q1;
假如发送routing-key为lazy.orange.rabbit的消息给交换器,那么交换器会转发消息到队列Q1和Q2;