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

相关推荐
每天一道题9 小时前
Kafka 是如何工作的?从 Broker、Partition、Offset 到 Consumer Group
分布式·kafka
用户14944848132011 小时前
为什么大厂很少直接用 2PC/TCC?聊聊分布式事务在真实业务里的落地套路
分布式·后端
code_slave(码畜)13 小时前
微服务架构落地:分库分表实战(下) —— 分布式主键、跨分片查询与分页聚合防坑
数据库·spring boot·分布式·spring cloud·微服务·架构·分库分表
德迅云安全-上官13 小时前
新一代智能分布式云接入:应用加速守护 TCP 业务安全与体验
分布式·tcp/ip·安全
凯凯姜13 小时前
分布式定时任务重复执行与故障恢复
分布式
Sayai15 小时前
Kafka 磁盘空间治理实战:retention 保留策略、log.dirs 在线扩容、分区跨盘迁移与不停机整体换盘
大数据·运维·分布式·kafka·消息队列
爱吃牛肉的大老虎16 小时前
Redis之分布式 Session问题
数据库·redis·分布式
阿标在干嘛16 小时前
分布式锁的“场景适配“:我们为什么在部分链路中选择了数据库乐观锁?
数据库·分布式
磐链科技17 小时前
Web3区块链开发需要哪些核心技术?解析分布式网络、数字钱包与跨链交互方案
分布式·web3·区块链
爱吃火鸡面呀17 小时前
PySpark 入门实战:从 DataFrame 到 SQL、DSL 与窗口函数
分布式·spark