消息队列

简介: 消息队列

正文


消息队列

什么是消息队列:消息队列(Message Queue,简称MQ),从字面意思上看,本质是个队列,FIFO先入先出,只不过队列中存放的内容是message而已。

为什么要使用消息队列?

首先,不同进程(process)之间传递消息时,两个进程之间耦合程度过高,改动一个进程,引发必须修改另一个进程,为了隔离这两个进程,在两进程间抽离出一层(一个模块),所有两进程之间传递的消息,都必须通过消息队列来传递,单独修改某一个进程,不会影响另一个。

其次,不同进程(process)之间传递消息时,为了实现标准化,将消息的格式规范化了,并且,某一个进程接受的消息太多,一下子无法处理完,并且也有先后顺序,必须对收到的消息进行排队,因此诞生了事实上的消息队列.

常见的消息队列有很多,接下来我们介绍第一种消息队列:RabbitMQ。

Rabbit MQ

一、简单队列

0.png

在上图的模型中,有以下概念:

P:生产者,也就是要发送消息的程序

C:消费者:消息的接受者,会一直等待消息到来。

queue:消息队列,图中红色部分。可以缓存消息;生产者向其中投递消息,消费者从其中取出消息

1.png

二、工作队列

工作队列或者竞争消费者模式

特点:每一个消费只能被一个消费者进行消费。

work queues与入门程序相比,多了一个消费端,两个消费端共同消费同一个队列中的消息,但是一个消息只能被一个消费者获取。

三、Publish/subscribe(交换机类型:Fanout,也称为广播)

2.png

生产者:

1) 声明Exchange,不再声明Queue

2) 发送消息到Exchange,不再发送到Queue

消费者使用不同的队列的名称,但是绑定在一个交换的节点上:

思考:

1、publish/subscribe与work queues有什么区别。

1)work queues不用定义交换机,而publish/subscribe需要定义交换机。

2)publish/subscribe的生产方是面向交换机发送消息,work queues的生产方是面向队列发送消息(底层使用默认交换机)。

3)publish/subscribe需要设置队列和交换机的绑定,work queues不需要设置,实际上work queues会将队列绑定到默认的交换机。

相同点:

所以两者实现的发布/订阅的效果是一样的,多个消费端监听同一个队列不会重复消费消息。

2、实际工作用 publish/subscribe还是work queues?

建议使用 publish/subscribe,发布订阅模式比工作队列模式更强大(也可以做到同一队列竞争),并且发布订阅模式可以指定自己专用的交换机。

四、Routing 路由模型(交换机类型:direct)

3.png

P:生产者,向Exchange发送消息,发送消息时,会指定一个routing key。

X:Exchange(交换机),接收生产者的消息,然后把消息递交给 与routing key完全匹配的队列

C1:消费者,其所在队列指定了需要routing key 为 error 的消息

C2:消费者,其所在队列指定了需要routing key 为 info、error、warning 的消息。

我们发送sms的RoutingKey,发现结果:只有指定短信的消费者1收到消息了

五、Topics 通配符模式(交换机类型:topics)

4.png

每个消费者监听自己的队列,并且设置带统配符的routingkey,生产者将消息发给broker,由交换机根据routingkey来转发消息到指定的队列。

Routingkey一般都是有一个或者多个单词组成,多个单词之间以“.”分割,例如:inform.sms

#:匹配一个或多个词

*:匹配不多不少恰好1个词

根据匹配的规则寻找我们的消费者。

相关文章
|
6月前
|
消息中间件 存储 数据可视化
消息队列使用的四种场景介绍(一)
消息队列使用的四种场景介绍
104 0
|
9月前
|
消息中间件 存储 数据库
消息队列有什么用
通过异步处理提高系统性能(减少响应所需时间) 削峰/限流 降低系统耦合性。
71 0
|
6月前
|
消息中间件 开发框架 Java
消息队列使用的四种场景介绍(二)
消息队列使用的四种场景介绍
|
10月前
|
消息中间件 分布式计算 Hadoop
在实际应用中使用消息队列
在实际应用中使用消息队列
90 2
|
11月前
|
消息中间件 负载均衡 Java
什么是优秀的消息队列
简述消息队列,优秀的消息队列的特质及RoketMQ
|
消息中间件 数据库
|
消息中间件 存储 中间件
消息队列(四)
消息队列(四)
177 0
消息队列(四)
|
消息中间件 Java 数据库
消息队列(五)
消息队列(五)
120 0
消息队列(五)
|
消息中间件 存储 缓存
消息队列(六)
消息队列(六)
213 0
消息队列(六)
|
消息中间件 存储 数据库

热门文章

最新文章