RabbitMQ安装与介绍

文章目录

  • 一、docker安装
  • [二、RabbitMQ 六种模式](#二、RabbitMQ 六种模式)
    • [1. 简单模式(Simple Queue)](#1. 简单模式(Simple Queue))
    • [2. 工作队列模式 (Work Queue)](#2. 工作队列模式 (Work Queue))
    • [3. 发布/订阅模式(Publish/Subscribe)](#3. 发布/订阅模式(Publish/Subscribe))
    • [4. 路由模式(Routing)](#4. 路由模式(Routing))
    • [5. 主题模式(Topics)](#5. 主题模式(Topics))
    • [6. RPC 模式(远程调用,不常用)](#6. RPC 模式(远程调用,不常用))
  • [三、RabbitMQ 交换机类型](#三、RabbitMQ 交换机类型)
    • [1. Fanout 交换机](#1. Fanout 交换机)
    • [2. Direct 交换机](#2. Direct 交换机)
    • [3. Topic 交换机](#3. Topic 交换机)
    • [4. headers 交换机(不常用)](#4. headers 交换机(不常用))
    • [5. x-local-random 交换机 (不常用)](#5. x-local-random 交换机 (不常用))
  • 四、总结

参考文章:https://cloud.tencent.com/developer/article/1975744
参考视频: https://www.bilibili.com/video/BV1dX4y1V73G?spm_id_from=333.788.videopod.episodes\&vd_source=4085910f7c5c4dddcc04446ebf3aed6b\&p=18

一、docker安装

官网: https://www.rabbitmq.com/docs/download

创建文件夹

挂在数据目录

bash 复制代码
mkdir -p /usr/local/docker_data/rabbitmq-data

挂在配置文件rabbitmq.conf

bash 复制代码
mkdir -p /usr/local/docker_config

docker 命令

bash 复制代码
docker run -d --hostname my-rabbit -v /usr/local/docker_config/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf  -v /usr/local/docker_data/rabbitmq-data:/var/lib/rabbitmq --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:4-management

--hostname 必须指定

  • 如果不指定 --hostname,Docker 会随机生成一个主机名(比如 a7b3c9d1e2f),对应的 RabbitMQ 数据目录就会是 /usr/local/docker_data/rabbitmq-data/mnesia/rabbit@a7b3c9d1e2f。
    当容器重启或重建时,随机主机名会变,数据目录也会跟着变,原来的消息和配置就找不到了(相当于 "换了个数据文件夹")。
  • 指定之后 此时 RabbitMQ 的数据目录会固定为 /usr/local/docker_data/rabbitmq-data/mnesia/rabbit@my-rabbit,即使容器重启,只要主机名不变,数据就能被正确读取。

二、RabbitMQ 六种模式

RabbitMQ 不论哪种模式推送消息都是: 生产者-->交换机-->队列-->消费者,简单和工作队列虽然图示虽然没有表明交换机的存在,但其使用的是默认交换机direct

1. 简单模式(Simple Queue)

适用场景

  • 单一生产者 → 单一队列 → 单一消费者
  • 最简单的消息传递,无路由逻辑
  • 虽然图上没有体现交换机,但使用的默认交换机direct,因为RabbitMQ消息必须走交换机

Producer Queue Consumer

关键特性

  • 队列自动创建,无需绑定交换器(实际隐式绑定到默认交换器 "")
  • 消息默认轮询分发给消费者(若多个消费者监听同一队列)

2. 工作队列模式 (Work Queue)

适用场景

  • 生产者 → 单队列 → 多个消费者竞争消费
  • 任务分发、负载均衡(如耗时任务拆分)
  • 虽然图上没有体现交换机,但使用的默认交换机direct,因为RabbitMQ消息必须走交换机

Producer Queue Consumer1 Consumer2

关键特性

  • 消息默认轮询分发(Round-Robin)
  • 可配置公平分发(Prefetch Count=1)

与简单模式的区别

  • 消费者数量不同(工作队列允许多消费者)

3. 发布/订阅模式(Publish/Subscribe)

适用场景

  • 1条消息需要广播给多个消费者
  • 典型应用:日志广播、事件通知

Producer Fanout Exchange Queue1 Queue2 Consumer1 Consumer2

关键特性

  • 使用 Fanout 交换器(消息广播到所有绑定队列)
  • 队列需显式绑定到交换器:

4. 路由模式(Routing)

适用场景

  • 根据消息的 Routing Key 选择性投递
  • 典型应用:按错误级别过滤日志

error info Producer Direct Exchange Queue1 Queue2 Consumer1 Consumer2 Consumer3

关键特性

  • 使用 Direct 交换器
  • 绑定队列时指定 Routing Key
  • 其实也可以把路由模式的routing key 写成一样,就是发布订阅模式,

5. 主题模式(Topics)

适用场景

  • 基于 通配符 的复杂路由规则
  • 典型应用:消息分类(如:stock.us.nyse 或 weather.europe.fr

*.critical system.* Producer Topic Exchange Queue1 Queue2 Consumer1 Consumer2

关键特性

  • 使用 Topic 交换器
  • Routing Key 支持通配符:
    匹配1个单词(如 a.* 匹配 a.b 但不匹配 a.b.c)
    匹配0或多个单词(如 a.# 匹配 a、a.b、a.b.c)

6. RPC 模式(远程调用,不常用)

适用场景

  • 通过消息队列实现 请求-响应 交互
  • 替代 HTTP 调用,实现解耦

请求 响应 Client Request Queue Server Reply Queue

关键特性

使用 回调队列(Reply-To)和 Correlation ID 匹配请求

工作中最常用的模式就是 工作队列模式路由模式,其余都略显鸡肋。

三、RabbitMQ 交换机类型

标题二是根据模式进行分类,但究其根本其模式的区别是根据交换机的不同决定的,所以下面从交换机进行分类。

目前常用的有三种类型:fanout、 direct、topic

1. Fanout 交换机

  • Fanout 交换机相关的模式只有 发布/订阅模式(Publish/Subscribe)
  • 不会处理路由键,只要接收到消息,就广播到所有队列上。fanout类型转发消息是最快的。

2. Direct 交换机

  • 与 Direct 交换机相关的模式有:简单模式(Simple Queue)工作队列模式 (Work Queue)路由模式(Routing) 这三种模式。
  • Direct交换机 是在Fanout交换机的基础增加了过滤条件 routing key ,其不再像Fanout一样无条件广播给所有队列,而是广播给同样 绑定了routing key 的队列。

3. Topic 交换机

  • 与Topic交换机相关的模式只有主题模式(Topics)
  • Topic 交换机是在Direct 交换机的基础上把确定的过滤条件变为类似与正则表达式(仅仅是类似) 的表达式相关的过滤
    • 其将路由键和绑定键的字符串切分成单词,这些单词之间用.隔开。它会识别两个通配符: #* , #匹配0个或多个单词,*匹配一个单词

4. headers 交换机(不常用)

headers 交换机同样也是添加过滤条件,不过其不再是在routing key上过滤,而是在队列参数上进行过滤,比如headers交换机设置了 参数x=1 的过滤条件,队列中的参数有x=1的才会接收到消息

5. x-local-random 交换机 (不常用)

暂无

四、总结

自己总结,仅供参考。

综上所述,入门RabbitMQ其实很简单,两个重要组件,交换机和队列,至于其模式都是根据交换机的延申处理的,交换机常用就三种,fanout、direct、topic ,而这三种的区别也仅仅是过滤级别的区别,fanout无过滤(广播),direct 路由key过滤(确定的字符串),topic 类似于正则的过滤。也类似于nginx的server中正则路径一样,/ /prod-api/ /*api/

或者也可以这样理解,RabbitMQ 的核心就是消息在 交换机 消息队列 之间的传递(在这块队列就可以直接与消费者抽象为一体)交换机只能有一个,队列可以1个或多个,所以问题就可以归纳为交换机和队列之间的关系。

  1. 在只有1个交换机,1个队列时 ,可以分为 简单模式(一个消费者)和工作队列模式(多个消费者,队列默认轮询分发消息)
  2. 在有1个交换机,多个队列时, 此时交换机给队列分发消息
    是没有条件全部广播 (fanout 交换机, 发布订阅模式)?
    还是根据过滤条件指定过滤具体字符串发给特定的交换机(direct 交换机,路由模式)?
    还是根据过滤条件类似于正则匹配发给特定的交换机 (topic 交换机,主题模式)?

拓展说明
error info Producer Direct Exchange Queue1 Queue2 Consumer1 Consumer2 Consumer3

上图为路由模式,在路由模式下,Consumer1 和 Consumer3 订阅了同一个队列 Queue1,它们会以轮询的方式接收 Queue1 中的消息,但不会同时收到同一条消息。这种机制有助于实现消息的负载均衡和并行处理。

也就是说

  • 交换机--》队列 是根据交换机类型来分发消息的。
  • 队列--》消费者 是轮询分发消息的。(默认轮询,可以更改为 公平分发 或 优先级队列)
相关推荐
思辨共悟39 分钟前
Kafka简述及学习课程
分布式·kafka
Code季风2 小时前
从超卖到数据一致:分布式锁的最佳实践与演进历程
分布式·微服务·go
Code季风2 小时前
深入理解 Redis 分布式锁:实现互斥保障的最佳实践
redis·分布式·微服务
dessler2 小时前
RabbitMQ-镜像队列(Mirrored Queues)
linux·运维·rabbitmq
lifallen2 小时前
hadoop.yarn 带时间的LRU 延迟删除
java·大数据·数据结构·hadoop·分布式·算法
都叫我大帅哥3 小时前
RabbitMQ消息模式大揭秘:从入门到精通,一篇搞定!
java·rabbitmq
努力搬砖ll6 小时前
分布式弹幕系统设计
分布式
九伯都9 小时前
rabbitmq的安装和使用-windows版本
windows·分布式·rabbitmq
_oP_i10 小时前
RabbitMQ 队列配置设置 RabbitMQ 消息监听器的并发消费者数量java
java·rabbitmq·java-rabbitmq
你我约定有三12 小时前
分布式微服务--万字详解 微服务的各种负载均衡全场景以注意点
java·开发语言·windows·分布式·微服务·架构·负载均衡