RabbitMQ集群与负载均衡实战指南

news2025/5/31 21:04:25

文章目录

  • 集群架构
    • 概述
    • 仲裁队列的使用
      • 1. 使用Spring框架代码创建
      • 2. 使用amqp-client创建
      • 3. 使用管理平台创建
  • 负载均衡
    • 引入HAProxy 负载均衡:
    • 使用方法
      • 1. 修改配置文件
      • 2. 声明队列 test_cluster
      • 3. 发送消息

集群架构

概述

RabbitMQ支持部署多个结点,每个结点存储相同的数据,本质上没有区别。用户可以访问任意一个结点,其响应结果是一致的。每个结点都包含多个队列,队列的类型有很多,本博客主要探讨经典队列(Classic)和仲裁队列(Quorum)。不论什么类型的队列,都会存储两类消息:

  • 元数据:队列名称、交换机信息、绑定等
  • 消息数据:队列中存储的实际消息。

1. 经典队列(Classic Queues)

  • 特点
    • 元数据在集群所有节点共享,消息默认存储在主节点因此如果某个结点一旦宕机,对应存储的消息数据在该集群中将会丢失
    • 支持持久化(Durable)和非持久化。
    • 一致性较弱(最终一致性),性能高,灵活性强。
    • 适合通用场景,如任务分发、日志收集。

2. 仲裁队列(Quorum Queues)

  • 特点
    • 基于Raft 共识算法的高可用队列,消息数据会同步到集群中的其他节点,即使某个结点宕机,也能够保证集群的数据一致性。

    • 性能开销较高,不支持部分经典队列功能(如优先级)。

    • 适合对一致性要求高的场景,如金融交易、订单处理。

Raft 共识算法,这里用动画的方式形象的阐释了Raft保证数据一致性的执行流程,所以小编在这里偷个懒。

仲裁队列的使用

仲裁队列(Quorum Queue)是RabbitMQ中的一种高可用队列,它能够在节点故障时继续提供服务。以下是创建仲裁队列的三种方式:

1. 使用Spring框架代码创建

通过Spring的注解和配置,可以方便地创建仲裁队列。


@Configuration
public class QuorumConfig {
    @Bean("quorumQueue")
    public Queue quorumQueue() {
        return QueueBuilder.durable("quorum_queue").quorum().build();
    }
}

2. 使用amqp-client创建

通过Java代码直接使用amqp-client库来创建仲裁队列。


public class QuorumProducer {
    public static void main(String[] args) throws IOException {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setUsername("guest");
        factory.setPassword("guest");
        
        try (Connection connection = factory.newConnection();
             Channel channel = connection.createChannel()) {
            
            Map<String, Object> param = new HashMap<>();
            param.put("x-queue-type", "quorum");
            channel.queueDeclare("quorum_queue", true, false, false, param);
        }
    }
}

3. 使用管理平台创建

通过RabbitMQ的管理平台,可以图形化地创建仲裁队列。


负载均衡

虽然RabbitMQ支持集群部署,看似好像提升了流量的承载力。但是如果请求只发送给一个或者那几个负载过高的结点,羊毛一直往一处薅,这个结点一旦挂掉,那么用户无法访问了!

解决办法——

引入HAProxy 负载均衡:

在这里插入图片描述

它和我们之前在Spirng中学的LoadBalence类似会把请求路由到正常的结点,并且个可以设定路由策略,充分利用每一个结点资源。

使用方法

在现代微服务架构中,负载均衡是确保服务高可用性和性能的关键技术之一。本文将介绍如何使用RabbitMQ实现负载均衡,并通过示例代码展示其具体实现步骤。

1. 修改配置文件

首先,需要修改RabbitMQ的配置文件,将HAProxy的IP和端口设置为RabbitMQ的绑定地址。

spring:
  rabbitmq:
    addresses: amqp://study:study@124.71.229.73:15670/test

2. 声明队列 test_cluster

在Spring Boot应用中,我们需要声明一个队列,用于负载均衡。


@Configuration
public class ClusterConfig {
    @Bean("ClusterQueue")
    public Queue clusterQueue() {
        return QueueBuilder.durable(Constant.CLUSTER_QUEUE).quorum().build();
    }
}

3. 发送消息

接下来,我们可以通过控制器发送消息到声明的队列。


@RestController
@RequestMapping("/cluster")
public class ClusterController {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @GetMapping
    public String cluster() {
        rabbitTemplate.convertAndSend("", Constant.CLUSTER_QUEUE, "quorum test...");
        return "发送成功!";
    }
}

或者使用amqp客户端发送消息:


public class ClusterProducer {
    private static final String QUEUE_NAME = "hello_world";

    public static void main(String[] args) throws IOException, TimeoutException {
        // 1. 创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        // 2. 设置参数
        factory.setHost("124.71.229.73"); // HAProxy 地址
        factory.setPort(5670); // HAProxy 端口
        factory.setUsername("host"); // 用户名,默认
        factory.setPassword("study"); // 密码,默认
        // 3. 创建连接connection
        Connection connection = factory.newConnection();
        // 4. 创建channel通道
        Channel channel = connection.createChannel();
        // 5. 声明队列
        Map<String, Object> param = new HashMap<>();
        param.put("x-queue-type", "quorum");
        channel.queueDeclare("test_cluster", true, false, false, param);
        // 6. 通过channel发送消息到队列中
        String msg = "hello cluster...";
        // 简单模式下,使用的是默认交换机,使用默认交换机时,routingKey要和队列名称一致,才可以路由到对应的队列中去
        channel.basicPublish("", "test_cluster", null, msg.getBytes());
        // 7. 释放资源
        System.out.println("消息发送成功!");
        connection.close();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2391852.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux安装ffmpeg7.0.2全过程

​编辑 白眉大叔 发布于 2025年4月16日 评论关闭 阅读(341) centos 编译安装 ffmpeg 7.0.2 &#xff1a;连接https://www.baimeidashu.com/19668.html 下载 FFmpeg 源代码 在文章最后 一、在CentOS上编译安装FFmpeg 以常见的CentOS为例&#xff0c;FFmpeg的编译说明页面为h…

Java中的设计模式实战:单例、工厂、策略模式的最佳实践

Java中的设计模式实战&#xff1a;单例、工厂、策略模式的最佳实践 在Java开发中&#xff0c;设计模式是构建高效、可维护、可扩展应用程序的关键。本文将深入探讨三种常见且实用的设计模式&#xff1a;单例模式、工厂模式和策略模式&#xff0c;并通过详细代码实例&#xff0…

2025.05.28【Parallel】Parallel绘图:拟时序分析专用图

Improve general appearance Add title, use a theme, change color palette, control variable orders and more Highlight a group Highlight a group of interest to help people understand your story 文章目录 Improve general appearanceHighlight a group探索Paralle…

自动驾驶与智能交通:构建未来出行的智能引擎

随着人工智能、物联网、5G和大数据等前沿技术的发展&#xff0c;自动驾驶汽车和智能交通系统正以前所未有的速度改变人类的出行方式。这一变革不仅是技术的融合创新&#xff0c;更是推动城市可持续发展的关键支撑。 一、自动驾驶与智能交通的定义 1. 自动驾驶&#xff08;Auto…

ELectron 中 BrowserView 如何进行实时定位和尺寸调整

背景 BrowserView 是继 Webview 后推出来的高性能多视图管理工具&#xff0c;与 Webview 最大的区别是&#xff0c;Webview 是一个 DOM 节点&#xff0c;依附于主渲染进程的附属进程&#xff0c;Webview 节点的崩溃会导致主渲染进程的连锁反应&#xff0c;会引起软件的崩溃。 …

深兰科技董事长陈海波率队考察南京,加速AI大模型区域落地应用

近日&#xff0c;深兰科技创始人、董事长陈海波受邀率队赴南京市&#xff0c;先后考察了南京高新技术产业开发区与鼓楼区&#xff0c;就推进深兰AI医诊大模型在南京的落地应用&#xff0c;与当地政府及相关部门进行了深入交流与合作探讨。 此次考察聚焦于深兰科技自主研发的AI医…

《深度关系-从建立关系到彼此信任》

陈海贤老师推荐的书&#xff0c;花了几个小时&#xff0c;感觉现在的人与人之间特别缺乏这种深度的关系&#xff0c;但是与一个人建立深度的关系并没有那么简单&#xff0c;反正至今为止&#xff0c;自己好像没有与任何一个人建立了这种深度的关系&#xff0c;那种双方高度同频…

IT选型指南:电信行业需要怎样的服务器?

从第一条电报发出的 那一刻起 电信技术便踏上了飞速发展的征程 百余年间 将世界编织成一个紧密相连的整体 而在今年 我们迎来了第25届世界电信日 同时也是国际电联成立的第160周年 本届世界电信日的主题为:“弥合性别数字鸿沟,为所有人创造机遇”,但在新兴技术浪潮汹涌…

【ConvLSTM第二期】模拟视频帧的时序建模(Python代码实现)

目录 1 准备工作&#xff1a;python库包安装1.1 安装必要库 案例说明&#xff1a;模拟视频帧的时序建模ConvLSTM概述损失函数说明&#xff08;python全代码&#xff09; 参考 ConvLSTM的原理说明可参见另一博客-【ConvLSTM第一期】ConvLSTM原理。 1 准备工作&#xff1a;pytho…

【论文解读】DETR: 用Transformer实现真正的End2End目标检测

1st authors: About me - Nicolas Carion‪Francisco Massa‬ - ‪Google Scholar‬ paper: [2005.12872] End-to-End Object Detection with Transformers ECCV 2020 code: facebookresearch/detr: End-to-End Object Detection with Transformers 1. 背景 目标检测&#…

ElasticSearch简介及常用操作指南

一. ElasticSearch简介 ElasticSearch 是一个基于 Lucene 构建的开源、分布式、RESTful 风格的搜索和分析引擎。 1. 核心功能 强大的搜索能力 它能够提供全文检索功能。例如&#xff0c;在海量的文档数据中&#xff0c;可以快速准确地查找到包含特定关键词的文档。这在处理诸如…

纤维组织效应偏斜如何影响您的高速设计

随着比特率继续飙升&#xff0c;光纤编织效应 &#xff08;FWE&#xff09; 偏移&#xff0c;也称为玻璃编织偏移 &#xff08;GWS&#xff09;&#xff0c;正变得越来越成为一个问题。今天的 56GB/s 是高速路由器中最先进的&#xff0c;而 112 GB/s 指日可待。而用于个人计算机…

Rust使用Cargo构建项目

文章目录 你好&#xff0c;Cargo&#xff01;验证Cargo安装使用Cargo创建项目新建项目配置文件解析默认代码结构 Cargo工作流常用命令速查表详细使用说明1. 编译项目2. 运行程序3.快速检查4. 发布版本构建 Cargo的设计哲学约定优于配置工程化优势 开发建议1. 新项目初始化​2. …

Python训练营打卡Day39

DAY 39 图像数据与显存 知识点回顾 1.图像数据的格式&#xff1a;灰度和彩色数据 2.模型的定义 3.显存占用的4种地方 a.模型参数梯度参数 b.优化器参数 c.数据批量所占显存 d.神经元输出中间状态 4.batchisize和训练的关系 作业&#xff1a;今日代码较少&#xff0c;理解内容…

UE5蓝图中播放背景音乐和使用代码播放声音

UE5蓝图中播放背景音乐 1.创建背景音乐Cube 2.勾选looping 循环播放背景音乐 3.在关卡蓝图中 Event BeginPlay-PlaySound2D Sound选择自己创建的Bgm_Cube 蓝图播放声音方法二&#xff1a; 使用代码播放声音方法一 .h文件中 头文件引用 #include "Kismet/GameplayS…

AI 赋能数据可视化:漏斗图制作的创新攻略

在数据可视化的广阔天地里&#xff0c;漏斗图以其独特的形状和强大的功能&#xff0c;成为展示流程转化、分析数据变化的得力助手。传统绘制漏斗图的方式往往需要耗费大量时间和精力&#xff0c;对使用者的绘图技能和软件操作熟练度要求颇高。但随着技术的蓬勃发展&#xff0c;…

用 Python 模拟下雨效果

用 Python 模拟下雨效果 雨天别有一番浪漫情怀&#xff1a;淅淅沥沥的雨滴、湿润的空气、朦胧的光影……在屏幕上也能感受下雨的美妙。本文将带你用一份简单的 Python 脚本&#xff0c;手把手实现「下雨效果」动画。文章深入浅出&#xff0c;零基础也能快速上手&#xff0c;完…

C#对象集合去重的一种方式

前言 现在AI越来越强大了&#xff0c;有很多问题其实不需要在去各个网站上查了&#xff0c;直接问AI就好了&#xff0c;但是呢&#xff0c;AI给的代码可能能用&#xff0c;也可能需要调整&#xff0c;但是自己肯定是要会的&#xff0c;所以还是总结一下吧。 问题 如果有一个…

在ROS2(humble)+Gazebo+rqt下,实时显示仿真无人机的相机图像

文章目录 前言一、版本检查检查ROS2版本 二、步骤1.下载对应版本的PX4(1)检查PX4版本(2)修改文件名(3)下载正确的PX4版本 2.下载对应版本的Gazebo(1)检查Gazebo版本(2)卸载不正确的Gazebo版本(3)下载正确的Gazebo版本 3.安装bridge包4.启动 总结 前言 在ROS2的环境下&#xff…

github双重认证怎么做

引言 好久没登陆github了&#xff0c; 今天登陆github后&#xff0c;提醒进行2FA认证。 查看了github通知&#xff0c;自 2023 年 3 月起&#xff0c;GitHub 要求所有在 GitHub.com 上贡献代码的用户启用一种或多种形式的双重身份验证 (2FA)。 假如你也遇到这个问题&#xf…