RabbitMQ 核心详解

一、RabbitMQ 核心知识点

1.1 什么是 MQ

MQ(Message Queue,消息队列),也叫消息中间件,是存储消息的容器,用于分布式系统之间进行通信,实现系统解耦、异步通信、流量削峰等核心能力。

1.2 主流 MQ 对比选型

特性 RabbitMQ ActiveMQ RocketMQ Kafka
公司 / 社区 Rabbit Apache 阿里 Apache
开发语言 Erlang Java Java Scala&Java
协议 AMQP OpenWire、AUTO、Stomp、MQTT 自定义 自定义
单机吞吐量 万级 万级 (最差) 十万级 十万级
消息延迟 微秒级 毫秒级 毫秒级 毫秒以内
特性 并发能力强,延时低 老牌产品,文档多 功能完备,扩展性佳 主打大数据日志采集,仅支持核心 MQ 功能

选型建议

  • 中小型公司:首选 RabbitMQ(高并发、社区活跃、功能完备);
  • 大型公司:根据场景选择 RocketMQ(业务消息)或 Kafka(日志采集)。

1.3 RabbitMQ 基础

RabbitMQ 是采用 Erlang 语言开发实现 AMQP(高级消息队列)协议的消息中间件。

AMQP 协议组成

AMQP 协议定义了消息传递的规范,核心包含:

  • 生产者:发送消息的应用程序;
  • 交换机(Exchange):路由消息到队列;
  • 队列(Queue):存储消息的缓冲区;
  • 消费者:接收并处理消息的应用程序;
  • 绑定(Binding):交换机与队列的关联规则。

1.4 为什么使用MQ(RabbitMQ核心价值)

(1)解耦

传统模式:系统 A 直接调用系统 B/C 代码,新增系统 D 需修改 A 的代码;

MQ 模式:系统 A 将消息写入 MQ,其他系统从 MQ 订阅消息,A 无需修改代码。

(2)异步

传统模式:非核心业务同步执行,响应慢;

MQ 模式:非核心业务通过 MQ 异步执行,提升响应速度。

A服务把消息发送到MQ,B、C服务接受消息后以异步方式运行

(3)削峰

传统模式:高并发请求直接冲击数据库,导致连接异常;

MQ 模式:请求先写入 MQ,系统按数据库处理能力从 MQ 慢慢拉取消息,平稳消费。

1.5 RabbitMQ 安装(CentOS)

1.5.1 克隆 CentOS 虚拟机(可选)

通过 VMware 克隆 CentOS 虚拟机,作为 RabbitMQ 部署节点。

1.5.2 安装 Erlang(RabbitMQ 依赖)

上传安装包

bash

复制代码
# 依次执行
rpm -ivh esl-erlang-17.3-1.x86_64.rpm --force --nodeps
rpm -ivh esl-erlang_17.3-1~centos~6_amd64.rpm --force --nodeps
rpm -ivh esl-erlang-compat-R14B-1.el6.noarch.rpm --force --nodeps
1.5.3 安装 RabbitMQ

bash

bash 复制代码
​
# 安装包
rpm -ivh rabbitmq-server-3.4.1-1.noarch.rpm

# 启动/停止/重启/状态
service rabbitmq-server start
service rabbitmq-server stop
service rabbitmq-server restart
service rabbitmq-server status

# 开机自启
chkconfig rabbitmq-server on

# 防火墙开放15672端口(管理界面)
/sbin/iptables -I INPUT -p tcp --dport 15672 -j ACCEPT
/etc/rc.d/init.d/iptables save

# 开启web管理工具
rabbitmq-plugins enable rabbitmq_management
service rabbitmq-server restart

# 创建管理员账号
rabbitmqctl  add_user admin 1111
rabbitmqctl  set_user_tags admin  administrator
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"

# 查看用户
rabbitmqctl list_users

​
1.5.4 访问管理界面

浏览器访问:http://服务器IP:15672,使用 admin/1111 登录。

1.6 RabbitMQ 工程搭建

1.6.1 创建工程

新建 SpringBoot 工程springboot_rabbitmq

1.6.2 pom.xml 依赖

xml

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.2.RELEASE</version>
    </parent>
    <groupId>com.powershop</groupId>
    <artifactId>springboot_rabbitmq</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
    </dependencies>
</project>
1.6.3 连接工具类

java

运行

复制代码
package com.powershop.util;

import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Connection;

public class ConnectionUtil {
    /**
     * 建立与RabbitMQ的连接
     * @return
     * @throws Exception
     */
    public static Connection getConnection() throws Exception {
        //定义连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //设置服务地址
        factory.setHost("192.168.233.132");
        //端口
        factory.setPort(5672);
        //设置账号信息
        factory.setUsername("admin");
        factory.setPassword("1111");
        factory.setVirtualHost("/");
        // 获取连接
        Connection connection = factory.newConnection();
        return connection;
    }
}

1.7 RabbitMQ 五种消息模型

RabbitMQ 提供 5 种核心消息模型(排除 RPC),其中 3/4/5 属于订阅模型,仅路由方式不同。

5.1 Simple - 简单模型

核心角色

  • P(生产者):发送消息;
  • C(消费者):接收消息;
  • 队列:存储消息的缓冲区。
(1)生产者发送消息

java

复制代码
package com.powershop.simple;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.powershop.util.ConnectionUtil;

public class Send {
    private final static String QUEUE_NAME = "simple_queue";

    public static void main(String[] argv) throws Exception {
        // 获取连接和通道
        Connection connection = ConnectionUtil.getConnection();
        Channel channel = connection.createChannel();
        // 声明队列(幂等性)
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        // 消息内容
        String message = "Hello World!";
        channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
        System.out.println(" [x] Sent '" + message + "'");
        //关闭资源
        channel.close();
        connection.close();
    }
}
(2)消费者接收消息

java

复制代码
package com.powershop.simple;

import java.io.IOException;
import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.powershop.util.ConnectionUtil;

public class Recv {
    private final static String QUEUE_NAME = "simple_queue";

    public static void main(String[] argv) throws Exception {
        // 获取连接
        Connection connection = ConnectionUtil.getConnection();
        // 创建通道
        Channel channel = connection.createChannel();
        // 声明队列
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        // 定义消费者
        DefaultConsumer consumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, 
                          BasicProperties properties,byte[] body) throws IOException {
                String msg = new String(body);
                System.out.println(" [x] received : " + msg + "!");
            }
        };
        // 监听队列(自动确认)
        channel.basicConsume(QUEUE_NAME, true, consumer);
    }
}

说明:消费者启动后会持续监听队列,有新消息立即消费,消费后消息从队列移除。

(注:其余 4 种消息模型可参考 RabbitMQ 官方文档,核心逻辑类似,仅交换机 / 路由规则不同。)

相关推荐
RemainderTime3 小时前
(十二)Spring Cloud Alibaba 2023.x:基于 Filebeat 构建轻量级 ELK日志追踪体系
分布式·elk·elasticsearch·微服务·架构·logback
可编程芯片开发3 小时前
基于Qlearning强化学习和牵制一致性的分布式光伏集群优化调度算法matlab仿真
分布式·matlab·qlearning·牵制一致性·分布式光伏集群·光伏集群调度
芋只因3 小时前
Kafka详解
分布式·kafka
您^_^4 小时前
专家(二):Claude Code 数据工程实战:dbt + Airflow + Spark 全流程,$0.22 搭完电商分析管道
大数据·分布式·spark·claudecode·claude code全栈
fengxin_rou4 小时前
【Kafka 核心概念深度详解】:分区、消费者组、位点及存储消费实战指南
分布式·kafka
若兰幽竹4 小时前
【HarmonyOS 6.1 全场景实战】《灵犀厨房》实战(十四)之【分布式流转】让菜谱“飞”:手机选、平板看、智慧屏播的全场景秘诀
分布式·华为鸿蒙系统·harmonyos6.1.0·灵犀厨房
Yeats_Liao4 小时前
BLE Mesh能承载AI推理吗?分布式边缘AI节点部署实战
服务器·人工智能·分布式·架构·边缘计算
还在忙碌的吴小二14 小时前
XXL-JOB - 分布式任务调度平台新手入门指南
分布式
ClouGence21 小时前
TiCDC 够用吗?聊聊 TiDB 同步的几个关键问题
数据库·分布式·后端