RabbitMq学习

RabbitMq学习

1.RabbitMq优势与应用场景

优势

1.使用简单,功能强大(学习成本低)

2.基于AMQP协议(Advanced Message Queue 高级消息队列协议,一个通用的标准)

3.社区简单,文档完善

4.高并发性能好,因为它是由erlang语言开发(Erlang是一种通用的面向并发的编程语言,它主要就是为了解决并发的问题而研究出来的,业界叫做二郎神)

5.spirngboot默认集成了RabbitMq(方便)

应用场景:

1.任务异步处理(同步就是打电话异步就是发短信)

将不需要同步处理的并且耗时长的操作由消息队列通知消息接收方进行异步处理。提高应用程序的响应时间

2.应用程序解耦(解耦就就本来紧密相连的分开)

MQ相当于一个中介,生产方通过MQ与消费方交互,这样MQ就将应用程序进行了解耦合

解释:

就比如我有一个页面发布的程序p需要发布到三个服务器(a,b,c)上面,如果我们直接发布的话

就会造成一个同步的情况.因为只有我们成功把发布这个消息发送到了a服务器上我们程序才能

继续把这个消息再发布到b服务器上。

但是如果我们用一个消息队列MQ在a,b,c服务器上部署一个监听MQ的程序,然后我们把程序p要发布页面

的这个消息发送MQ上,然后这个MQ就把这个消息通知给监听它的每一个服务器(a,b,c)

这样既提高了应用程序的响应时间,也将p和服务器a,b,c的紧密结合个分开了进行了解耦合

2.工作原理

基本解释:

生产者(Producer)将消息发送给mq,然后mq将消息转发给消费者(Consumer)

RabbitMq学习

详细解释:

1、生产者(Producer)和RabbitMq中的Broker(消息队列服务进程)建立sockct链接(connection),将消息发送给RabbitMq

生产者想要发布一个消息在大连接(connection)中会有多次会话每次会话都是在这个channel通道中进行的会话。

就是每个生产者都会在大连接connection通过小的channel会话通道中与mq建立连接这样就可以实现多个生产者多个消费者跟它通信的一种机制

2、消费者(Consumer)也是和RabbitMq中的Broker建立sockct链接(connection),然后消费者会去监听Broker中Exchange

(交换机)中的Queue(存储的消息队列)

3、一旦mq中有消息,然后mq就会将消息转发给Exchange然后这个Exchange会把得到的消息通过不同的工作

模式转发到指定的Queue(消息队列)中.

如果消费者还没有监听这个Queua(消息队列)那这个消息就会一直存在这个Queua中等待者消费者来消费

组成部分说明如下:
1、Broker:消息队列服务进程,此进程包括两个部分:Exchange和Queue。

2、Exchange:消息队列交换机,按一定的规则将消息路由转发到某个队列,对消息进行过虑。

3、Queue:消息队列,存储消息的队列,消息到达队列并转发给指定的消费方。 (相当于一个消息暂存的地方)

4、Producer:消息生产者,即生产方客户端,生产方客户端将消息发送到MQ。

5、Consumer:消息消费者,即消费方客户端,接收MQ转发的消息。

-----发送消息----

1、生产者和Broker建立TCP连接。 (connection)

2、生产者和Broker建立通道。 (channel)

3、生产者通过通道消息发送给Broker,由Exchange将消息进行转发。

4、Exchange将消息转发到指定的Queue(队列)通过工作模式转发

----接收消息----

1、消费者和Broker建立TCP连接 (connection)

2、消费者和Broker建立通道(channel)

3、消费者监听指定的Queue(队列)

4、当有消息到达Queue时Broker默认将消息推送给消费者。

5、消费者接收到消息。

3.生产者,消费者

生产者:发布消息的那一方

消费者:一般为服务器端,接收mq转发的消息的那一方

4.工作模式

1、Work queues

2、Publish/Subscribe

3、Routing 路由工作模式

RabbitMq学习

路由工作模式:

一个生产者p,一个交换机x,每个队列(amqp.gen…)都绑定到交换机x上,每个消费者都监听了自己的队列

1、一个交换机x绑定多个队列,每个队列设置routingkey,并且一个队列可以设置多个routingkey

2、每个消费者监听自己的队列

3、生产者将消息发布给交换机,发送消息时需要指定routingkey的值,交换机通过这个值来判断应该和那个队列

的routingkey相等,如果相等则将消息转发给该队列

路由工作模式的流程与方式解释:

生产者与mq中消息队列服务(Broker)建立连接,然后再在这个大连接(connection)里面建立一个小通道(channel)通过这个通道并且指定一个routingkey值把这个消息发送给MQ中消息队列服务(Broker)中的交换机(Exchange),然后交换机(Exchange)通过这个routingkey去判断这个消息要发送到那个队列中(Queue)

因为消费者与消息队列服务(Broker)建立完连接监听队列(Queue)时也绑定了一个routingkey并指定了值

所以说我们可以通过这个routingkey去判断这个消息到底该发送到那个队列中。

注意:(routingkey每个队列是可以设置多个routingkey的所以只要队列中有routingkey我们就会把消息发过去)

然后就可以通过这个队列通知监听了这个队列的消费者去完成这个发布的操作

交换机的类型是(type:direct)direct对应的就是路由模式

交换机的类型一共有四种,对应各种工作模式可以百度查看

Direct:

处理路由键,需要将一个队列绑定到交换机上,要求该消息与一个特定的路由键完全匹配。这是一个完整的匹配。如果一个队列绑定到该交换机上要求路由键为 “green”,则只有路由键为“green”的消息才被转发,不会转发路由键为"red",只会转发路由键为"green"。

RabbitMq学习

4、Topics

5、Header

6、RPC

其他工作模式懒得敲了有空补上