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 官方文档,核心逻辑类似,仅交换机 / 路由规则不同。)

相关推荐
giaz14n9X7 小时前
Redis 分布式锁进阶第五十七篇
数据库·redis·分布式
WyCAGy8ij8 小时前
Redis 分布式锁进阶第二篇讲解
数据库·redis·分布式
冰西瓜60010 小时前
深度学习的数学原理(四十二)—— 分布式训练
人工智能·分布式·深度学习
zzz_236811 小时前
【RabbitMQ】面试系列 · 第三期:从线上故障到架构选型
面试·架构·rabbitmq
小碗羊肉13 小时前
【RabbitMQ高级】如何保证消息的可靠性?
java·rabbitmq·java-rabbitmq
WyCAGy8ij19 小时前
Redis 分布式锁进阶第四篇讲解
数据库·redis·分布式
MrJson-架构师19 小时前
AgentScope Java 2.0:打造分布式、企业级智能体底座
java·开发语言·分布式
先跑起来再说19 小时前
Go 排行榜系统的工程化实现:分布式锁、快照表与定时刷新
分布式·go·gin
ACP广源盛1392462567320 小时前
GSV2231 三屏显示扩展芯片@ACP#RTX Spark AI 终端多屏协作专属解决方案
大数据·人工智能·分布式·信息可视化·spark·电脑·音视频
探客木木夕20 小时前
分布式全球类脑智能网络架构设计
网络·人工智能·分布式·边缘计算