rabbitmq介绍

RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。
在这里插入图片描述

为什么使用rabbitmq

使用rabbitmq可以用它来:解耦、异步、削峰。

优点:

1、应用解耦(系统拆分)
2、异步处理(预约挂号业务处理成功后,异步发送短信、推送消息、日志记录等)
3、消息分发
4、流量削峰
5、消息缓冲

缺点:

1、降低了系统的稳定性:那消息队列挂了,你的系统崩溃。因此,系统可用性会降低;
2、增加了系统的复杂性:加入了消息队列,要多考虑很多方面的问题,比如:一致性问题、如何保证消息不被重复消费、如何保证消息可靠性传输等。因此,需要考虑的东西更多,复杂性增大。

rabbitmq基础组件及概念

rabbitmq的架构图如下图所示
在这里插入图片描述

rabbitmq系统组件

1、Broker:简单来说就是消息队列服务器实体。

2、Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列

exchange进行消息路由是,有四种策略设定key和queue的绑定关系,实现一对一,一对多的绑定
四种路由策略分别为:direct, topic, headers and fanout
1、direct:转发消息到routigKey指定的队列
2、topic:按规则转发消息(最灵活)
3、fanout:转发消息到所有绑定队列
4、headers:(可以忽略不计)

消息生产者在声明exchange时,需要声明如下属性:
1、持久性:如果启用,交换器将会在server重启前都有效。
2、自动删除:如果启用,那么交换器将会在其绑定的队列都被删除掉之后自动删除掉自身。
3、惰性:如果没有声明交换器,那么在执行到使用的时候会导致异常,并不会主动声明。
(关于exchange会单独帖子详细介绍四种路由策略和细节,此处不展开)

3、Queue:消息队列载体,每个消息都会被投入到一个或多个队列。

队列是RabbitMQ内部对象,存储消息。队列的属性有:
1、持久性:如果启用,队列将会在server重启前都有效。
2、自动删除:如果启用,那么队列将会在所有的消费者停止使用之后自动删除掉自身。
3、惰性:如果没有声明队列,那么在执行到使用的时候会导致异常,并不会主动声明。
4、排他性:如果启用,队列只能被声明它的消费者使用。

4、Binding key:绑定

它的作用就是把exchange和queue按照路由规则绑定起来。

5、Routing Key:路由关键字

投递消息时携带,exchange根据这个关键字进行消息投递到对应的queue。

6、vhost:虚拟主机

一个broker里可以开设多个vhost,用作不同用户的权限分离。vhost 可以理解为虚拟 broker ,即 mini-RabbitMQ server。其内部均含有独立的 queue、exchange 和 binding 等,但最最重要的是,其拥有独立的权限系统,可以做到 vhost 范围的用户控制。当然,从 RabbitMQ 的全局角度,vhost 可以作为不同权限隔离的手段(一个典型的例子就是不同的应用可以跑在不同的 vhost 中)
特别注意,vhost默认有标记为“/”的vhost,不能删除。删除/以后,新建立的vhost不能正常使用。

7、producer:消息生产者

producer便是产生并投递消息的程序,他需要声明exchange、queue并设置相关属性,设置binding

8、consumer:消息消费者

consumer通过监听绑定的queue,当监听到有新产生的消息发送给queue,会主动获取到消息进行消费

9、channel:消息通道

在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。RabbitMQ使用信道的方式来传输数据。信道是建立在真实的TCP连接内的虚拟连接,且每条TCP连接上的信道数量没有限制

消息处理流程

消息队列的使用过程大概如下:
1、客户端连接到消息队列服务器,打开一个channel。
2、客户端声明一个exchange,并设置相关属性。
3、客户端声明一个queue,并设置相关属性。
4、客户端使用routing key,在exchange和queue之间建立好绑定关系binding
6、客户端投递消息到exchange。
7、exchange接收到消息,根据消息key和已经设置好的的binding,进行路由,将消息投递到一个或多个队列里。
8、消费者根据自己监听到队列,当queue有新的消息,自动会有消费者结束处理
在这里插入图片描述