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

文章目录

  • 集群架构
    • 概述
    • 仲裁队列的使用
      • 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 {@Autowiredprivate RabbitTemplate rabbitTemplate;@GetMappingpublic 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. 创建连接connectionConnection 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.pswp.cn/diannao/85439.shtml

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

相关文章

Prometheus + Grafana + Cadvisor:构建高效企业级服务监控体系

在现代软件开发和运维领域&#xff0c;容器化技术的应用越来越广泛&#xff0c;其中 Docker 作为最受欢迎的容器化解决方案之一&#xff0c;其容器的监控管理变得至关重要。本文将详细介绍如何使用 cadvisor、Prometheus 和 Grafana 来监控 Docker 容器的状态。 一、安装镜像 …

小提琴图绘制-Graph prism

在 GraphPad Prism 中为小提琴图添加显著性标记(如*P<0.05)的步骤如下: 步骤1:完成统计检验 选择数据表:确保数据已按分组排列(如A列=Group1,B列=Group2)。执行统计检验: 点击工具栏 Analyze → Column analyses → Mann-Whitney test(非参数检验,适用于非正态数…

【开源工具】跳过网页APP禁止粘贴限制:自动输入键盘模拟工具

&#x1f4cc; 【黑科技】跳过网页APP禁止粘贴限制&#xff1a;自动输入键盘模拟工具 &#x1f308; 个人主页&#xff1a;创客白泽 - CSDN博客 &#x1f525; 系列专栏&#xff1a;&#x1f40d;《Python开源项目实战》 &#x1f4a1; 热爱不止于代码&#xff0c;热情源自每一…

深度学习篇---face-recognition的优劣点

face_recognition库是一个基于 Python 的开源人脸识别工具&#xff0c;封装了 dlib 库的深度学习模型&#xff0c;具有易用性高、集成度强的特点。以下从技术实现、应用场景等维度分析其优劣势&#xff1a; 一、核心优势 1. 极简 API 设计&#xff0c;开发效率极高 代码量少…

Git深入解析功能逻辑与核心业务场景流程

一、Git核心功能逻辑架构 #mermaid-svg-9tj1iCr99u6QenJM {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-9tj1iCr99u6QenJM .error-icon{fill:#552222;}#mermaid-svg-9tj1iCr99u6QenJM .error-text{fill:#552222;st…

【大模型】情绪对话模型项目研发

一、使用框架&#xff1a; Qwen大模型后端Open-webui前端实现使用LLamaFactory的STF微调数据集&#xff0c;vllm后端部署&#xff0c; 二、框架安装 下载千问大模型 安装魔塔社区库文件 pip install modelscope Download.py 内容 from modelscope import snapshot_downlo…

Java基础 Day26

一、网络编程简介 1、概念 网络编程指在网络通信协议下&#xff0c;不同计算机上运行的程序&#xff0c;进行数据传输 2、软件架构 &#xff08;1&#xff09;CS架构&#xff08;客户端和服务端&#xff09; 在用户本地有一个客户端程序&#xff0c;在远程有一个服务器端程…

【Hot 100】45. 跳跃游戏 II

目录 引言跳跃游戏 IIdp解题贪心解题 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;算法专栏&#x1f4a5; 标题&#xff1a;【Hot 100】45. 跳跃游戏 II❣️ 寄语&#xff1a;书到用时方恨少&#xff0c;事非经过不知难&#xff01; 引言 跳跃…

计算机网络第1章(上):网络组成与三种交换方式全解析

目录 一、计算机网络的概念二、计算机网络的组成和功能2.1 计算机网络的组成2.2 计算机网络的功能 三、电路交换、报文交换、分组交换3.1 电路交换&#xff08;Circuit Switching&#xff09;3.2 报文交换&#xff08;Message Switching&#xff09;3.3 分组交换&#xff08;Pa…

[总结]前端性能指标分析、性能监控与分析、Lighthouse性能评分分析

前端性能分析大全 前端性能优化 LightHouse性能评分 性能指标监控分析 浏览器加载资源的全过程性能指标分析 性能指标 在实现性能监控前&#xff0c;先了解Web Vitals涉及的常见的性能指标 Web Vitals 是由 Google 推出的网页用户体验衡量指标体系&#xff0c;旨在帮助开发者量…

Windows商店中的免费扫雷游戏应用

《扫雷》是一款经典的单人益智小游戏&#xff0c;1992年微软发布的Windows 3.1中加入该游戏&#xff0c;从此风靡全世界。游戏目标是通过逻辑推理&#xff0c;在最短的时间内根据点击格子出现的数字找出所有非雷格子&#xff0c;同时避免踩雷。 此Windows应用实现了经典扫雷的…

ActiveMQ 可观测性最佳实践

ActiveMQ 介绍 ActiveMQ 是一款高性能、开源的消息中间件&#xff0c;支持多种消息协议&#xff08;如 JMS、AMQP、MQTT 等&#xff09;&#xff0c;能够实现应用程序之间的异步通信和消息传递。它提供点对点&#xff08;Queue&#xff09;和发布/订阅&#xff08;Topic&#…

【Linux命令】scp远程拷贝

文章目录 1. 基本语法与常用选项2. 使用场景和使用示例本地文件->远程主机远程主机文件->本地远程主机->另一台远程主机 3. 使用注意事项 scp&#xff08;Secure Copy Protocol&#xff09;是linux中基于ssh的安全文件传输工具&#xff0c;用于在本地和远程主机之前安…

如何优化 Harmony-Cordova 应用的性能?

以下是针对 ‌Harmony-Cordova 应用性能优化‌的完整方案&#xff0c;结合鸿蒙原生特性和Cordova框架优化策略&#xff1a; ‌⚡一、渲染性能优化‌ ‌减少布局嵌套层级‌ 使用扁平化布局&#xff08;如 Grid、GridRow&#xff09;替代多层 Column/Row 嵌套&#xff0c;避免冗…

c++学习之---模版

目录 一、函数模板&#xff1a; 1、基本定义格式&#xff1a; 2、模版函数的优先匹配原则&#xff1a; 二、类模板&#xff1a; 1、基本定义格式&#xff1a; 2、类模版的优先匹配原则&#xff08;有坑哦&#xff09;&#xff1a; 3、缺省值的设置&#xff1a; 4、ty…

SpringAI(GA):RAG下的ETL快速上手

原文链接&#xff1a;SpringAI(GA)&#xff1a;RAG下的ETL快速上手 教程说明 说明&#xff1a;本教程将采用2025年5月20日正式的GA版&#xff0c;给出如下内容 核心功能模块的快速上手教程核心功能模块的源码级解读Spring ai alibaba增强的快速上手教程 源码级解读 版本&a…

用dayjs解析时间戳,我被提了bug

引言 前几天开发中突然接到测试提的一个 Bug&#xff0c;说我的时间组件显示异常。 我很诧异&#xff0c;这里初始化数据是后端返回的&#xff0c;我什么也没改&#xff0c;这bug提给我干啥。我去问后端&#xff1a;“这数据是不是有问题&#xff1f;”。后端答&#xff1a;“…

DataAgent产品经理(数据智能方向)

DataAgent产品经理&#xff08;数据智能方向&#xff09; 一、核心岗位职责 AI智能体解决方案设计 面向工业/政务场景构建「数据-模型-交互」闭环&#xff0c;需整合多源异构数据&#xff08;如传感器数据、业务系统日志&#xff09;与AI能力&#xff08;如大模型微调、知识图…

Ubuntu取消开机用户自动登录

注&#xff1a;配置前请先设置登录密码&#xff0c;不同显示管理器配置方法不同&#xff0c;可用命令查看&#xff1a;cat /etc/X11/default-display-manager 一、LightDM 显示管理器&#xff0c;关闭 Ubuntu 系统用户自动登录 查找自动登录配置文件&#xff0c;可以看到类似 a…

使用lighttpd和开发板进行交互

文章目录 &#x1f9e0; 一、Lighttpd 与开发板的交互原理1. 什么是 Lighttpd&#xff1f;2. 与开发板交互的方式&#xff1f; &#x1f9fe; 二、lighttpd.conf 配置文件讲解⚠️ 注意事项&#xff1a; &#x1f4c1; 三、目录结构说明&#x1f4a1; 四、使用 C 编写 CGI 脚本…