RabbitMQ消息队列:高可用集群搭建与消息幂等处理

RabbitMQ高可用集群需完成环境准备、集群组建、镜像队列配置,并结合负载均衡与幂等处理,确保消息可靠与系统稳定。

一、环境准备与基础配置

1. 服务器规划与依赖安装
  • 服务器信息(3节点示例):

    主机名 IP地址 部署服务
    rabbit-node1 192.168.0.12 RabbitMQ、HAProxy、KeepAlived
    rabbit-node2 192.168.0.14 RabbitMQ、HAProxy、KeepAlived
    rabbit-node3 192.168.0.15 RabbitMQ
  • 安装步骤:

    复制代码
    bash

    # 安装Erlang(版本需与RabbitMQ匹配,如Erlang 26.2.3 + RabbitMQ 3.13.0) sudo rpm -ivh erlang-26.2.3-1.el7.x86_64.rpm # 安装RabbitMQ sudo rpm -ivh rabbitmq-server-3.13.0-1.el8.noarch.rpm # 启动并设置开机自启 sudo systemctl start rabbitmq-server && sudo systemctl enable rabbitmq-server

2. 主机解析与Cookie同步
  • 配置hosts(所有节点):

    复制代码
    bash

    sudo vim /etc/hosts # 添加 192.168.0.12 rabbit-node1 192.168.0.14 rabbit-node2 192.168.0.15 rabbit-node3

  • 同步Erlang Cookie(集群认证密钥):

    复制代码
    bash

    # 在rabbit-node1执行,拷贝Cookie到其他节点 sudo scp /var/lib/rabbitmq/.erlang.cookie root@rabbit-node2:/var/lib/rabbitmq/ sudo scp /var/lib/rabbitmq/.erlang.cookie root@rabbit-node3:/var/lib/rabbitmq/ # 设置权限(所有节点) sudo chmod 600 /var/lib/rabbitmq/.erlang.cookie

---

二、集群搭建与高可用配置

1. 组建普通集群
  • 加入集群(在rabbit-node2和rabbit-node3执行):

    复制代码
    bash

    # 停止应用→重置节点→加入集群→启动应用 rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl join_cluster rabbit@rabbit-node1 # 以rabbit-node1为基准节点 rabbitmqctl start_app

  • 验证集群状态:

    复制代码
    bash

    rabbitmqctl cluster_status # 应显示3个节点,状态为running

2. 配置镜像队列(核心高可用步骤)
  • 设置镜像策略(所有队列同步至所有节点):

    复制代码
    bash

    rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all", "ha-sync-mode":"automatic"}' # 参数说明: # ha-all:策略名称 # "^":匹配所有队列(正则表达式) # ha-mode: all:镜像到集群所有节点 # ha-sync-mode: automatic:自动同步队列数据

---

三、负载均衡与故障转移

1. HAProxy负载均衡
  • 安装与配置 (在rabbit-node1和rabbit-node2部署):

    复制代码
    bash

    sudo yum install haproxy -y sudo vim /etc/haproxy/haproxy.cfg
    配置示例 :

    复制代码
    ini

    listen rabbitmq_cluster bind 0.0.0.0:5672 # 对外服务端口 mode tcp balance roundrobin # 轮询负载均衡 server rabbit-node1 192.168.0.12:5672 check inter 5s rise 2 fall 3 server rabbit-node2 192.168.0.14:5672 check inter 5s rise 2 fall 3 server rabbit-node3 192.168.0.15:5672 check inter 5s rise 2 fall 3

2. KeepAlived故障转移
  • 配置虚拟IP(VIP),确保HAProxy高可用,客户端通过VIP访问集群。

---

四、消息幂等处理

1. 唯一ID + 去重表
  • 创建去重表:

    复制代码
    sql

    CREATE TABLE message_idempotency ( id VARCHAR(36) PRIMARY KEY, # 消息唯一ID(UUID) create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP );

  • Java代码实现:

    复制代码
    java

    public class IdempotencyService { // 检查消息是否已处理 public boolean isProcessed(String msgId) { // 查询数据库,存在则返回true } // 标记消息为已处理 public void markProcessed(String msgId) { // 插入数据库 } }

相关推荐
迅猛龙办公室12 分钟前
python实现倒序输出数字
开发语言·python
夏幻灵6 小时前
JavaScript this 面试:五种绑定规则、优先级与常见面试陷阱
开发语言·javascript·面试
程序猿编码6 小时前
榨干 RTX5090 算力!Qwen3 专用单卡推理引擎,手写C++/CUDA 算子实现 MTP 推测解码
开发语言·c++·大模型推理·qwen3·多模态推理
苍何7 小时前
开源微信流 Windows,微信聊天记录,可以直接给 Codex 和 Obsidan 了
后端
bkspiderx8 小时前
Qt 插件机制:动态扩展应用功能的核心框架
开发语言·qt·元数据·qt 插件·qpluginloader
代码什么用8 小时前
Spring基础使用
java·后端·spring
程序员老陆8 小时前
深入理解 C++ thread_local:线程私有存储的正确打开方式
开发语言·c++·程序设计
沐晓时光8 小时前
C语言入门,深入理解指针(3)
c语言·开发语言
明月_清风8 小时前
Deno 终局来了:从挑战 Node 到被 Cloudflare 收编
前端·后端·node.js
码云数智-园园8 小时前
unique_ptr 还是 shared_ptr?C++ 智能指针选型与内存泄漏实战分析
java·开发语言