rabbitmq入门:工作原理使用场景简述和用docker安装rabbitmq


amqp

MQ全称为Message Queue,即消息队列,它是一种应用程序之间的通信方法,消息队列在分布式系统开发中应用非常广泛。常见的消息队列产品(消息队列中间件)ActiveMQ、RabbitMQ、Kafka、RocketMQ等。

消息队列应用场景:

任务异步处理,将不需要同步处理的并且耗时长的操作由消息队列通知消息接收方进行异步处理
应用程序解耦 ,MQ相当于一个中介,生产方通过MQ与消费方交互,它将应用程序进行解耦合
例如:
1.异步处理
在这里插入图片描述
2.应用解耦
传统模式:
在这里插入图片描述
引入消息队列以后:
在这里插入图片描述
订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功
库存系统:订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据下单信息,进行库存操作
假如在下单时库存系统不能正常使用。也不影响正常下单,因为下单后,订单系统写入消息队列就不再关心其他的后续操作了。实现订单系统与库存系统的应用解耦

3.流量削峰
流量削锋也是消息队列中的常用场景,一般在秒杀或团抢活动中使用广泛
应用场景:秒杀活动,一般会因为流量过大,导致流量暴增,应用挂掉。为解决这个问题,一般需要在应用前端加入消息队列。
可以控制活动的人数

可以缓解短时间内高流量压垮应用

用户的请求,服务器接收后,首先写入消息队列。假如消息队列长度超过最大数量,则直接抛弃用户请求或跳转到错误页面

秒杀业务根据消息队列中的请求信息,再做后续处理
在这里插入图片描述

RabbitMQ是由erlang语言开发,基于AMQP( Advanced Message Queuing Protocol,即高级消息队列协议)实现的消息队列产品。
在这里插入图片描述
AMQP模型的几大组件:

  • 交换器 (Exchange):消息代理服务器中用于把消息路由到队列的组件。
  • 队列 (Queue):用来存储消息的数据结构,位于硬盘或内存中。
  • 绑定 (Binding):一套规则,告知交换器消息应该将消息投递给哪个队列。

电商系统应用消息队列

示例:
在这里插入图片描述
消息队列采用高可用,可持久化的消息中间件。比如Active MQ,Rabbit MQ,Rocket Mq。
(1)应用将主干逻辑处理完成后,写入消息队列。消息发送是否成功可以开启消息的确认模式。(消息队列返回
消息接收成功状态后,应用再返回,这样保障消息的完整性)
(2)扩展流程(发短信,配送处理)订阅队列消息。采用推或拉的方式获取消息并处理。
(3)消息将应用解耦的同时,带来了数据一致性问题,可以采用最终一致性方式解决。比如主数据写入数据库,
扩展应用根据消息队列,并结合数据库方式实现基于消息队列的后续处理。

RabbitMQ的工作原理

在这里插入图片描述
组成部分说明如下:

Broker:消息队列服务进程,此进程包括两个部分:Exchange和Queue。
Exchange:消息队列交换机,按一定的规则将消息路由转发到某个队列,对消息进行过滤。
Queue:消息队列,存储消息的队列,消息到达队列并转发给指定的消费方。
Producer:消息生产者,即生产方客户端,生产方客户端将消息发送到MQ。
Consumer:消息消费者,即消费方客户端,接收MQ转发的消息。
Broker:它提供一种传输服务,它的角色就是维护一条从生产者到消费者的路线,保证数据能按照指定的方式进行传输,

Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来.
Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
vhost:虚拟主机,一个broker里可以有多个vhost,用作不同用户的权限分离。
Producer:消息生产者,就是投递消息的程序.
Consumer:消息消费者,就是接受消息的程序.
Channel:消息通道,在客户端的每个连接里,可建立多个channel.

拉取rabbitmq镜像

RabbitMQ安装和启动
拉取镜像:

docker pull rabbitmq:3.7.7-management

查看镜像:

docker images
启动:

启动服务:

docker run -d --name rabbitmq3.7.7 -p 5672:5672 -p 15672:15672 -v `pwd`/data:/var/lib/rabbitmq --hostname myRabbit -e RABBITMQ_DEFAULT_VHOST=my_vhost  -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin 2888deb59dfc

-d 后台运行容器;

–name 指定容器名;

-p 指定服务运行的端口(5672:应用访问端口;15672:控制台Web端口号);

-v 映射目录或文件;

–hostname 主机名(RabbitMQ的一个重要注意事项是它根据所谓的 “节点名称” 存储数据,默认为主机名);

-e 指定环境变量;(RABBITMQ_DEFAULT_VHOST:默认虚拟机名;RABBITMQ_DEFAULT_USER:默认的用户名;RABBITMQ_DEFAULT_PASS:默认用户名的密码)

在这里插入图片描述

访问web控制台:

http://服务ip:15672/

六种工作模式

RabbitMQ提供了6种工作模式,分别为:

1、简单模式 Hello World

2、工作队列模式 Work Queue

3、发布/订阅模式 Publish/Subscribe

4、路由模式 Routing

5、通配符模式 Topics

6、RPC模式(不建议使用)

简单模式
简单模式的特点为:一个生产者发送消息到队列,一个消费者接收。
在这里插入图片描述
工作队列模式
工作队列模式的特点为:存在一个生产者和多个消费者, 多个消费者共同消费同一个队列中的消息。在工作队列模式下,一条消息只能被一个消费者接收到。对于任务过重或任务较多的情况下使用工作队列模式可以提高任务处理的速度。 rabbitmq采用轮询的方式将消息平均发送给消费者。

在这里插入图片描述
发布/订阅模式/广播模式
发布/订阅模式的特点为:每个消费者监听自己的队列。生产者将消息发送给交换机,由交换机将消息转发到绑定此交换机的每个队列,结果就是每个绑定交换机的队列都将接收到消息。

任何发送到Fanout Exchange的消息都会转发到与该Exchange绑定(bingding)的所有queue上;这种模式不需要routkey
在这里插入图片描述
路由模式/直连模式
路由模式的特点为:

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

2、生产者将消息发给交换机,由交换机根据routingkey来转发消息到指定的队列。
传递时需要一个Routekey,通过Routkey寻找对应队列;这种模式Exchange不需要绑定(binding)queue
在这里插入图片描述

通配符模式(topic)的特点为:

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

2、生产者声明队列和交换机,并且绑定交换机和队列时设置通配符方式的routingkey。

3、生产者将消息发给交换机,由交换机根据routingkey来转发消息到指定的队列
需要指定routekey;exchange需要绑定(binding)queue;
在这里插入图片描述


版权声明:本文为qq_41358574原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。