Listening to the Words

勉强 の rabbitmq

消息队列 Message Queue

人们将一种有条不紊的处理工作的行为叫消息队列

看下面的图,从左到右一条完成的生产流程,不论有多少商品未交工,不论有多少商品未装运,生产线的速度都是恒规定的,因此网络工程师们灵机一动把这个场景运用到了计算机领域。

《勉强 の rabbitmq》

所有的功能都基于人们对真实生产场景的想象,并且加以细化运用。而他的特点就是稳定和可控,也就是人们常说的为了应对不确定性

进一步来讲有了这样的工作模式,我们可以用来做什么?

  • 异步任务
  • 流量削峰
  • 应用解耦
  1. 张伟早晨出门,发现衣服好几天都没洗,于是将衣服放进了洗衣机,一步(异步)点击启动后走人
  2. 到了地铁站排了安检排了很长的队伍,张伟抱怨了几句:干嘛要限制人流;工作人员回到说:因为大侠萧峰背着音响出场了,以免伤及无辜,所以决定限制进场的人数。
  3. 张伟来到工位准备工作,按下叫号器:“请1号请到3号窗口办理业务”。不一会,一对夫妻吵吵闹闹的准备办理离婚(解耦)手续。 办理完他们俩就成了路人甲和路人乙

RabbitMQ简介

《勉强 の rabbitmq》

RabbitMQ是使用Erlang语言来编写的,并且RabbitMQ是基于AMQP协议的。Erlang语言在数据交互方面性能优秀,有着和原生Socket一样的延迟,这也是RabbitMQ高性能的原因所在。可谓“人如其名”,RabbitMQ像兔子一样迅速。

RabbitMQ的核心

看一看下面的图是不是开篇生产线的具体应用:生产者 消费者和 服务端

《勉强 の rabbitmq》

交换器

交换器是RabbitMQ的核心之一,它的作用就是消息转发到队列中去,当时是根据一定的规则了。
《勉强 の rabbitmq》

这张亚马逊的智能物流识别系统就是一个大型的交换机,将不同的包裹,根据不同的规则(地区,重量,分类等)(规则就是路由)运输到不同的传送带上去。

RabbitMQ常用的交换器类型有direct、topic、fanout、headers四种,分别对应不同的工作模式

工作模式

Rabbitmq 五种工作模式

简单模式

一个生产者,一个消费者

《勉强 の rabbitmq》

工作流程大致如下:

(1)生产者将消息发送给交换机;

(2)交换机把消息交给绑定的队列hello

(3)监听队列的消费者从消息队列中获取消息。

常见的应用场景:

(1)聊天;

(2)短信;

工作模式

一个生产者对应多个消费者,但是只能有一个消费者获得消息!

竞争消费者模式

《勉强 の rabbitmq》

工作流程大致如下:

(1)生产者将消息发送给交换机;

(2)交换机把消息交给绑定的队列

(3)同时监听队列的多个消费者竞争资源,只有其中一个消费者能够获得消息。

常见的应用场景:

(1)抢红包;

(2)效率高的消费者消费消息多。可以用来进行负载均衡。

工作模式就是简单模式的升级版,多线程来监听一个队列,但只有一个线程拿到消费数据。

发布订阅(publish/fanout)模式

一个消费者将消息首先发送到交换器,交换器绑定到多个队列,然后被监听该队列的消费者所接收并消费。
《勉强 の rabbitmq》

工作的大致流程如下:

(1)生产者将消息发送给交换机;

(2)交换机根据自身的类型,会把所有消息复制同步到所有的绑定队列上;

(3)监听队列的消费者(一个队列一个消费者)可以获取消息。

常见的应用场景:

(1)用户在一个平台获得奖励后要通知他,有两种方式:邮件和SMS,这两种方式就是两个不同的消费者,而发生的事件就是生产者。

路由模式(routing/direct)

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

《勉强 の rabbitmq》

工作的大致过程:

(1)生产者将消息发送给交换机(消息头携带着路由键);

(2)交换机根据消息头中的routingKey 将消息发送相对应的与之绑定且routingkey相同的队列;

(3)消费者获取消息。

常见应用场景:
(1)用户在一个平台获得奖励后要通知用户,有两种方式:邮件和SMS,但是有的用户只接受邮件,有的用户全都接受,此时就可以使用路由方式。

topic主题模式

上面的路由模式是根据路由key进行完整的匹配(完全相等才发送消息),这里的通配符模式通俗的来讲就是模糊匹配。

 *符号“#”表示匹配一个或多个词,符号“”表示匹配一个词。**

《勉强 の rabbitmq》

工作的大致过程:

(1)生产者发送消息到交换器

(2)交换器根据消息头中的routingkey转发消息到相对应的队列中; 如上.orange.可以匹配的路由键可以为:hello.orange.hello,a.oragne.e等

(3)监听队列相对应的消费者获取消息

常见应用场景:
topic 模式是路由模式的升级版,可以完全替代路由模式,同时也可以替代发布订阅和工作模式等,它十分强大。

[1]官方文档
[2]Rabbitmq 五种工作模式

点赞