通用技术 中间件学习—RabbitMQ 入门

爱老的虎油 · 2025年06月13日 · 150 次阅读

RabbitMQ 定位:高性能异步组件

同步和异步

同步:即时实时的通讯方式(视频通话,一对一实时)

异步:非实时得到结果(文字聊天,一对多)

使用 mq 异步处理之前:

使用 mq 做异步处理:

基础认知

同步调用

举例:黑马商城余额支付

  1. 第一步:用户操作支付,调用支付服务
  2. 第二步:支付服务调用用户服务扣减余额
  3. 第三步:更新支付状态
  4. 第四步:调用交易服务,更新订单状态
  5. 第五步:调用通知服务,给用户发送短信
  6. 第六步:调用积分服务,给用户增加积分

通过上述,可以发现,这种同步方式有一些缺点:

  1. 拓展性差: 每一次加新的需求都需要修改支付服务的逻辑
  2. 性能下降:每一步之间是同步的,要不断等上一步操作完成后再进行下一步动作
  3. 级联失败:下级服务失败导致上游服务失败

但是同步调用也有一些优势,比如时效性强,包括有些操作是必须同步调用的,比如上述的第二步,支付服务必须要等待用户服务完成工作,来判断余额扣减是否成功完成,否则如果支付失败,其他服务均无调用的必要性

异步调用

异步调用基于消息通知的方式,通常三个角色:

  1. 消息发送者:投递消息的人,即调用方
  2. 消息代理:管理、暂存、转发消息,比如微信服务器,外卖柜
  3. 消息接受者:接受和处理消息的人,即原来的服务方

异步调用的优势:

  1. 接触耦合,拓展性强
  2. 不需要等待,性能提高
  3. 故障隔离
  4. 缓存消息,流量削峰填谷(针对特殊的高并发、流量高峰场景)

缺点:

  1. 不能立刻收到调用结果,时效性差
  2. 不确定下有业务执行是不是成功了
  3. 业务安全依赖于 broker 的可靠性,broker 就是消息代理角色,如果消息代理挂了,那么许多服务就都挂了

MQ 技术选型

MessageQueue,消息队列,即上述的 broker

Spring 官方支持:RabbitMQ

Kafka:适用于吞吐量高的系统,比如日志平台

最受欢迎:RabbitMQ

RabbitMQ

基础架构

角色:

  1. publisher:消息发送者,发送消息
  2. consumer:消息消费者,监听消费消息
  3. queue:队列,存储消息
  4. exchange:交换机,负责路由消息(把消息路由给队列)

消息发送模型:

publisher 发送给 exchange,exchange 路由给 queue,通过队列被 consumer 消费

实际应用场景:

可能多个服务共用一个 mq,为了实现对不同服务对象的隔离,RabbitMQ 可以使用 virtualhost 进行隔离

快速入门

需求:需求:在 RabbitMQ 的控制台完成下列操作:

  1. 新建队列hello.queue1hello.queue2
  2. 向默认的amq.fanout交换机发送一条消息
  3. 查看消息是否到达hello.queue1nello.queue2
  4. 总结规律

实操步骤

第一步:安装并启动 rabbitmq

windows 安装 rabbitmq:https://blog.csdn.net/qq_41929714/article/details/146152629

第二步:使用管理员账户登录进入系统,创建两个队列:

第三步:找到交换机中的 amq.fanout,尝试使用 mq 管理平台中的测试功能发送一条消息:

报错了!消息发送,但是没有被路由!

别急别急,前边学习到,rabbitmq 的发送模式是,发送者将消息发送给交换机,交换机把消息路由到队列,也就是每一个角色之间要有关联才能成功运转,很明显刚才我们只顾着创建队列,发送消息,但是少了关联 exchange 和 queue 的步骤,导致发送的消息丢失了(见下图)!!!Damn!!!

如何绑定:


按照上边步骤把 hello.queue1 和 hello.queue2 都绑定 amq.fanout 交换机

第四步:重新发送消息,发送成功,并且消息已经进入队列

第五步:在管理平台尝试查看进入队列中的消息(并未消费),点击队列名称,查看消息

总结规律

通过上述举例,可以发现:

交换机可以配置绑定指定的队列

当绑定了队列,发送者像交换机发送一条消息,则该条消息会把这条消息路由到绑定的所有队列中

数据隔离

需求:在 RabbitMQ 的控制台完成下列操作:

  1. 新建一个用户 hmall
  2. 为 hmall 用户创建一个 virtual host
  3. 测试不同 virtual host,之间的数据隔离现象

上述已经提到 RabbitMQ 是可以通过 virtualhost 来实现数据的隔离的

实操演示

第一步:创建一个新用户(Tags 选择 Admin,赋予管理员角色):

第二步:退出并使用新建用户登录管理后台:hmall/123

新建的用户是没有访问虚拟主机的权限的,需要单独配置

此时可以重新进入队列列表,尝试查看队列中的消息,可以预期是无法查看的,因为存在有数据隔离:

此时进入 Admin/virtual hosts 创建一个新的虚拟主机来供新用户使用:

刷新页面,点击右上角的 virtual host 就可以看到新增的/hmall 虚拟主机了:

当切换为/hmall 虚拟主机,再分别查看交换机、队列、用户,可以发现交换机只展示了默认的交换机,队列为空(当前主机没有新建队列)、可以查看所有的用户

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册