消息队列RabbitMQ
1、消息队列
消息队列是一种在分布式系统中常用的通信机制,简称为MQ,它允许不同的应用程序或服务之间通过发送和接收消息来进行异步通信。消息队列的主要优点包括:
- 解耦:消息队列使得生产者和消费者之间不需要直接通信,从而降低了它们之间的耦合度。
- 异步处理:生产者可以发送消息到队列后立即返回,而消费者可以在稍后的时间点处理这些消息。
- 流量削峰:消息队列可以缓冲大量的请求,从而避免系统因为突发流量而崩溃。
- 可扩展性:通过增加消费者,可以轻松地扩展系统的处理能力。
比较常见的MQ实现:
- ActiveMQ
- RabbitMQ
- RocketMQ
- Kafka
几种常见MQ的对比:
RabbitMQ | ActiveMQ | RocketMQ | Kafka | |
---|---|---|---|---|
公司/社区 | Rabbit | Apache | 阿里 | Apache |
开发语言 | Erlang | Java | Java | Scala&Java |
协议支持 | AMQP,XMPP,SMTP,STOMP | OpenWire,STOMP,REST,XMPP,AMQP | 自定义协议 | 自定义协议 |
可用性 | 高 | 一般 | 高 | 高 |
单机吞吐量 | 一般 | 差 | 高 | 非常高 |
消息延迟 | 微秒级 | 毫秒级 | 毫秒级 | 毫秒以内 |
消息可靠性 | 高 | 一般 | 高 | 一般 |
追求可用性:Kafka、 RocketMQ 、RabbitMQ
追求可靠性:RabbitMQ、RocketMQ
追求吞吐能力:RocketMQ、Kafka
追求消息低延迟:RabbitMQ、Kafka
据统计,目前国内消息队列使用最多的还是RabbitMQ,再加上其各方面都比较均衡,稳定性也好
2、RabbitMQ
RabbitMQ是基于Erlang语言开发的开源消息通信中间件
官网地址:https://www.rabbitmq.com/
2.1、安装RabbitMQ
基于Docker来安装RabbitMQ,使用下面的命令即可:
docker run \
-e RABBITMQ_DEFAULT_USER=xiaolin \
-e RABBITMQ_DEFAULT_PASS=123456 \
-v mq-plugins:/plugins \
--name mq \
--hostname mq \
-p 15672:15672 \
-p 5672:5672 \
--network hm-net\
-d \
rabbitmq:3.8-management
这个 docker run
命令用于在 Docker 容器中启动 RabbitMQ 服务器,并配置一些参数。下面是每个参数的解释:
-e RABBITMQ_DEFAULT_USER=xiaolin
: 设置 RabbitMQ 的默认用户名为xiaolin
。-e RABBITMQ_DEFAULT_PASS=123456
: 设置 RabbitMQ 的默认密码为123456
。-v mq-plugins:/plugins
: 将主机上的mq-plugins
目录挂载到容器内的/plugins
目录。这样可以在容器内使用主机上的插件。--name mq
: 给这个容器命名为mq
。--hostname mq
: 设置容器的主机名为mq
。-p 15672:15672
: 将主机的 15672 端口映射到容器的 15672 端口,这是 RabbitMQ 管理界面的端口。-p 5672:5672
: 将主机的 5672 端口映射到容器的 5672 端口,这是 RabbitMQ 的 AMQP 端口。--network hm-net
: 将容器连接到名为hm-net
的 Docker 网络。-d
: 以分离模式(后台模式)运行容器。rabbitmq:3.8-management
: 指定要运行的 Docker 镜像,这里是带有管理插件的 RabbitMQ 3.8 版本。
安装完成后,我们访问 http://主机IP:15672即可看到管理控制台。首次访问需要登录,默认的用户名和密码在配置文件中已经指定了。
登录后即可看到管理控制台总览页面:
2.2、架构图
RabbitMQ对应的架构如图:
其中包含几个概念:
publisher
:生产者,也就是发送消息的一方consumer
:消费者,也就是消费消息的一方queue
:队列,存储消息。生产者投递的消息会暂存在消息队列中,等待消费者处理exchange
:交换机,负责消息路由。生产者发送的消息由交换机决定投递到哪个队列。virtual host
:虚拟主机,起到数据隔离的作用。每个虚拟主机相互独立,有各自的exchange、queue
3、收发消息
3.1、交换机
Exchanges选项卡,可以看到已经存在很多交换机:
点击任意交换机,即可进入交换机详情页面。仍然会利用控制台中的publish message 发送一条消息:
这里是由控制台模拟了生产者发送的消息。由于没有消费者存在,最终消息丢失了,这样说明交换机没有存储消息的能力。
3.2、队列
打开Queues
选项卡,新建一个队列:
命名为hello.mq
,我这边使用的是hmall用户,默认是/
此时,我们再次向amq.fanout
交换机发送一条消息。会发现消息依然没有到达队列!!
怎么回事呢?
发送到交换机的消息,只会路由到与其绑定的队列,因此仅仅创建队列是不够的,我们还需要将其与交换机绑定。
3.3、绑定关系
点击Exchanges
选项卡,点击amq.fanout
交换机,进入交换机详情页,然后点击Bindings
菜单,在表单中填写要绑定的队列名称:
点击队列名称,进入详情页,查看队列详情,这次我们点击get message:
3.4、数据隔离
用户管理
点击Admin
选项卡,首先会看到RabbitMQ控制台的用户管理界面:
这里的用户都是RabbitMQ的管理或运维人员。目前只有安装RabbitMQ时添加的mqxiaolin
这个用户,我自己已经添加了hmall。仔细观察用户表格中的字段,如下:
Name
:mqxiaolin
,也就是用户名Tags
:administrator
,说明mqxiaolin
用户是超级管理员,拥有所有权限Can access virtual host
:/
,可以访问的virtual host
,这里的/
是默认的virtual host
对于小型企业而言,出于成本考虑,我们通常只会搭建一套MQ集群,公司内的多个不同项目同时使用。这个时候为了避免互相干扰, 我们会利用virtual host
的隔离特性,将不同项目隔离。一般会做两件事情:
- 给每个项目创建独立的运维账号,将管理权限分离。
- 给每个项目创建不同的
virtual host
,将每个项目的数据隔离。
比如,创建一个新的用户,命名为test
:
你会发现此时hmall用户没有任何virtual host
的访问权限:
接下来我们就来授权。我们先退出登录:
切换到刚刚创建的test用户登录,然后点击Virtual Hosts
菜单,进入virtual host
管理页:
可以看到目前只有一个默认的virtual host
,名字为 /
。
我们可以创建一个单独的virtual host
,而不是使用默认的/
。