消息队列RabbitMQ

消息队列RabbitMQ

1、消息队列

消息队列是一种在分布式系统中常用的通信机制,简称为MQ,它允许不同的应用程序或服务之间通过发送和接收消息来进行异步通信。消息队列的主要优点包括:

  1. 解耦:消息队列使得生产者和消费者之间不需要直接通信,从而降低了它们之间的耦合度。
  2. 异步处理:生产者可以发送消息到队列后立即返回,而消费者可以在稍后的时间点处理这些消息。
  3. 流量削峰:消息队列可以缓冲大量的请求,从而避免系统因为突发流量而崩溃。
  4. 可扩展性:通过增加消费者,可以轻松地扩展系统的处理能力。

比较常见的MQ实现:

  • ActiveMQ
  • RabbitMQ
  • RocketMQ
  • Kafka

几种常见MQ的对比:

RabbitMQActiveMQRocketMQKafka
公司/社区RabbitApache阿里Apache
开发语言ErlangJavaJavaScala&Java
协议支持AMQP,XMPP,SMTP,STOMPOpenWire,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即可看到管理控制台。首次访问需要登录,默认的用户名和密码在配置文件中已经指定了。

登录后即可看到管理控制台总览页面:

image-20240729203109678

2.2、架构图

RabbitMQ对应的架构如图:

image-20240729203210989

其中包含几个概念:

  • publisher:生产者,也就是发送消息的一方
  • consumer:消费者,也就是消费消息的一方
  • queue:队列,存储消息。生产者投递的消息会暂存在消息队列中,等待消费者处理
  • exchange:交换机,负责消息路由。生产者发送的消息由交换机决定投递到哪个队列。
  • virtual host:虚拟主机,起到数据隔离的作用。每个虚拟主机相互独立,有各自的exchange、queue
3、收发消息
3.1、交换机

Exchanges选项卡,可以看到已经存在很多交换机:

image-20240729203518671

点击任意交换机,即可进入交换机详情页面。仍然会利用控制台中的publish message 发送一条消息:

image-20240729203720193

这里是由控制台模拟了生产者发送的消息。由于没有消费者存在,最终消息丢失了,这样说明交换机没有存储消息的能力。

3.2、队列

打开Queues选项卡,新建一个队列:

image-20240729203925466

命名为hello.mq,我这边使用的是hmall用户,默认是/

image-20240729204044264

此时,我们再次向amq.fanout交换机发送一条消息。会发现消息依然没有到达队列!!

怎么回事呢?

发送到交换机的消息,只会路由到与其绑定的队列,因此仅仅创建队列是不够的,我们还需要将其与交换机绑定。

3.3、绑定关系

点击Exchanges选项卡,点击amq.fanout交换机,进入交换机详情页,然后点击Bindings菜单,在表单中填写要绑定的队列名称:

image-20240729204944455

image-20240729205004005

点击队列名称,进入详情页,查看队列详情,这次我们点击get message:

image-20240729205332267

3.4、数据隔离

用户管理

点击Admin选项卡,首先会看到RabbitMQ控制台的用户管理界面:

image-20240729205510611

这里的用户都是RabbitMQ的管理或运维人员。目前只有安装RabbitMQ时添加的mqxiaolin这个用户,我自己已经添加了hmall。仔细观察用户表格中的字段,如下:

  • Namemqxiaolin,也就是用户名
  • Tagsadministrator,说明mqxiaolin用户是超级管理员,拥有所有权限
  • Can access virtual host/,可以访问的virtual host,这里的/是默认的virtual host

对于小型企业而言,出于成本考虑,我们通常只会搭建一套MQ集群,公司内的多个不同项目同时使用。这个时候为了避免互相干扰, 我们会利用virtual host的隔离特性,将不同项目隔离。一般会做两件事情:

  • 给每个项目创建独立的运维账号,将管理权限分离。
  • 给每个项目创建不同的virtual host,将每个项目的数据隔离。

比如,创建一个新的用户,命名为test

image-20240729205740116

你会发现此时hmall用户没有任何virtual host的访问权限:

image-20240729205757292

接下来我们就来授权。我们先退出登录:

image-20240729205847915

切换到刚刚创建的test用户登录,然后点击Virtual Hosts菜单,进入virtual host管理页:

可以看到目前只有一个默认的virtual host,名字为 /

我们可以创建一个单独的virtual host,而不是使用默认的/

image-20240729210032111

image-20240729210319838

image-20240729210346236

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小林学习编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值