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 中的消息,但不会同时收到同一条消息。这种机制有助于实现消息的负载均衡和并行处理。

也就是说

  • 交换机--》队列 是根据交换机类型来分发消息的。
  • 队列--》消费者 是轮询分发消息的。(默认轮询,可以更改为 公平分发 或 优先级队列)
相关推荐
用户8307196840821 天前
RabbitMQ vs RocketMQ 事务大对决:一个在“裸奔”,一个在“开挂”?
后端·rabbitmq·rocketmq
初次攀爬者3 天前
RabbitMQ的消息模式和高级特性
后端·消息队列·rabbitmq
初次攀爬者5 天前
ZooKeeper 实现分布式锁的两种方式
分布式·后端·zookeeper
让我上个超影吧6 天前
消息队列——RabbitMQ(高级)
java·rabbitmq
塔中妖6 天前
Windows 安装 RabbitMQ 详细教程(含 Erlang 环境配置)
windows·rabbitmq·erlang
断手当码农6 天前
Redis 实现分布式锁的三种方式
数据库·redis·分布式
初次攀爬者6 天前
Redis分布式锁实现的三种方式-基于setnx,lua脚本和Redisson
redis·分布式·后端
业精于勤_荒于稀6 天前
物流订单系统99.99%可用性全链路容灾体系落地操作手册
分布式
Ronin3056 天前
信道管理模块和异步线程模块
开发语言·c++·rabbitmq·异步线程·信道管理
Asher05096 天前
Hadoop核心技术与实战指南
大数据·hadoop·分布式