RabbitMQ的高可用机制
RabbitMQ通过多种机制提供高可用性(HA)支持,以确保消息系统的稳定性和可靠性。下面将详细介绍这些机制,并提供代码示例。
集群(Clustering)
RabbitMQ的集群提供了高可用性和负载均衡。集群中的节点共享同一个Erlang分布式数据库,队列可以在多个节点上进行镜像,以提供冗余。
%% 加入到集群的命令
rabbitmqctl join_cluster rabbit@<master-hostname>
镜像队列(Mirrored Queues)
镜像队列是RabbitMQ实现HA的核心特性。它们确保队列中的消息在多个节点上复制,这样即便一个节点失败,消息也不会丢失。这是通过设置队列的参数来启用的。
Map<String, Object> args = new HashMap<String, Object>();
args.put("x-ha-policy", "all");
channel.queueDeclare("myQueue", true, false, false, args);
持久化(Persistence)
通过将消息和队列设置为持久化,可以确保即使RabbitMQ服务器重启,消息也不会丢失。
boolean durable = true;
channel.queueDeclare("myDurableQueue", durable, false, false, null);
channel.basicPublish("", "myDurableQueue", MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());
自动故障转移(Automatic Failover)
客户端可以配置为连接到一个节点列表,如果当前节点不可用,客户端会自动尝试连接列表中的下一个节点。
客户端自动恢复(Automatic Client Recovery)
某些RabbitMQ客户端支持自动恢复,它们能在连接断开后尝试重新连接,并恢复队列、交换器和绑定。
ConnectionFactory factory = new ConnectionFactory();
factory.setAutomaticRecoveryEnabled(true);
细节详尽
在部署高可用RabbitMQ系统时,需要考虑的细节包括:
-
网络延迟和分区: 在节点间同步状态时,网络延迟和分区会影响性能和可靠性。
-
资源占用: 镜像队列需要额外的内存和磁盘空间。
-
同步策略: 需要平衡同步的即时性和对系统性能的影响。
-
故障检测和恢复: 必须有健全的监控系统来快速检测故障并采取相应措施。
-
版本兼容性: 确保集群中的所有节点运行兼容的RabbitMQ和Erlang版本。
代码演示:
下面是一个使用Java客户端创建和使用持久化镜像队列的示例:
import com.rabbitmq.client.*;import java.util.HashMap;
import java.util.Map;public class HighAvailabilityExample {public static void main(String[] argv) throws Exception {ConnectionFactory factory = new ConnectionFactory();factory.setHost("my.rabbitmq.host");factory.setUsername("guest");factory.setPassword("guest");factory.setVirtualHost("/");factory.setAutomaticRecoveryEnabled(true); // Enable automatic connection recoverytry (Connection connection = factory.newConnection();Channel channel = connection.createChannel()) {// 设置队列镜像参数Map<String, Object> args = new HashMap<>();args.put("x-ha-policy", "all"); // 队列在所有节点上镜像// 创建一个持久化的镜像队列boolean durable = true;channel.queueDeclare("haQueue", durable, false, false, args);// 发布持久化消息String message = "Highly Available Message";channel.basicPublish("", "haQueue", MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes("UTF-8"));System.out.println("Sent '" + message + "'");}}
}
在这个示例中,我们使用了queueDeclare方法的args参数来设置队列为镜像队列。x-ha-policy参数设置为"all",意味着队列将在集群中所有的节点上进行镜像。同时,我们设置了MessageProperties.PERSISTENT_TEXT_PLAIN来确保消息持久化。
源码解析:
在RabbitMQ的Erlang源码中,高可用性相关的实现集中在几个关键组件:
-
rabbit_mirror_queue_master 和 rabbit_mirror_queue_slave 模块处理队列镜像逻辑,包括消息复制和故障转移机制。
-
rabbit_amqqueue 模块处理队列操作,如声明、绑定和消息传递。
-
rabbit_queue_index 模块负责持久化队列状态,确保消息不会因为服务器重启而丢失。
在部署和维护RabbitMQ集群时,一定要注意上述组件的配置和性能影响。通过精心设计和监控,可以确保RabbitMQ集群提供稳定的高可用性服务。
相关文章:
RabbitMQ的高可用机制
RabbitMQ通过多种机制提供高可用性(HA)支持,以确保消息系统的稳定性和可靠性。下面将详细介绍这些机制,并提供代码示例。 集群(Clustering) RabbitMQ的集群提供了高可用性和负载均衡。集群中的节点共享同一个Erlang分布式数据库…...
人机协同中的贝叶斯和马尔可夫
人机协同中的马尔可夫链是指在人与机器之间协同工作过程中,可能涉及到的状态转移概率模型。马尔可夫链是一种数学模型,描述了在给定当前状态下,未来状态的概率分布只依赖于当前状态,而与过去状态无关的随机过程。在人机协同工作中…...
STM32的SDIO
一.SDIO简介 SDIO,全称Secure Digital Input/Output,是一种用于在移动设备和嵌入式系统中实现输入/输出功能的接口标准。它结合了SD卡的存储功能和I/O功能,允许设备通过SD卡槽进行数据输入输出和外围设备连接。 SDIO接口通常被用于连接各种…...
Unity中的Lerp插值的使用
Unity中的Lerp插值使用 前言Lerp是什么如何使用Lerp 前言 平时在做项目中插值的使用避免不了,之前一直在插值中使用存在误区,在这里浅浅记录一下。之前看的博客或者教程还多都存在一个“永远到达不了,只能无限接近”的一个概念。可能是之前脑…...
年后上来面了一个来字节要求月薪23K,明显感觉他背了很多面试题...
最近有朋友去字节面试,面试前后进行了20天左右,包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说,80%的人都会栽在第一轮面试,要不是他面试前做足准备,估计都坚持不完后面几轮面试。 其实&…...
代码随想录算法训练营DAY20 | 二叉树 (8)
一、LeetCode 701 二叉搜索树中的插入操作 题目链接: 701.二叉搜索树中的插入操作https://leetcode.cn/problems/insert-into-a-binary-search-tree/description/ 思路:见缝插针罢辽。 class Solution {public TreeNode insertIntoBST(TreeNode root, i…...
2023年全球软件开发大会(QCon北京站2023)2月:核心内容与学习收获(附大会核心PPT下载)
本次峰会是一个汇集了最新技术趋势、最佳实践和创新思维的盛会。对于从事软件开发和相关领域的专业人士来说,参加这样的大会将有助于他们了解行业动态、提升技能水平、拓展职业视野,并与同行建立联系和合作。 本次峰会包含:AI基础架构、DevO…...
键盘输入4个数,从小到大排序
题目 键盘输入4个整数,从小到大排序 思路 代码 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h>//键盘输入4个整数,从小到大排序 int main() {int n1, n2, n3, n4;scanf_s("%d %d %d %d", &n1, &n2, &n3, &n4);…...
Day11-Linux系统iNode及链接知识及企业按哪里精讲
Day11-Linux系统iNode及链接知识及企业按哪里精讲 1. 文件核心 属性知识1.1 什么是索引节点(inode)。1.2 索引节点作用1.3 inode是怎么产生的?1.4 inode的特点?1.5 Linux系统读取文件的原理1.6 企业生产案例:No space …...
C# Thread的使用
在C#中,线程用于实现程序的并发执行。通过创建和管理多个线程,可以同时处理不同的任务或操作,从而提高程序性能和响应性。以下是如何在C#中使用线程的基本步骤: 创建新线程 // 使用System.Threading命名空间 using System.Threa…...
ETL数据集成工具DataX、Kettle、ETLCloud特点对比
ETL数据集成工具 对于数据仓库,大数据集成类应用,通常会采用ETL工具辅助完成。ETL,是英文 Extract-Transform-Load 的缩写,用来描述将数据从来源端经过抽取(extract) 、交互转换(transform) 、加载(load)至的端的过程当前的很多应…...
OpenAI:Sora视频生成模型技术报告(中文)
概述 视频生成模型作为世界模拟器 我们探索视频数据生成模型的大规模训练。具体来说,我们在可变持续时间、分辨率和宽高比的视频和图像上联合训练文本条件扩散模型。我们利用transformer架构,在视频和图像潜在代码的时空补丁上运行。我们最大的模型Sor…...
Java基于微信小程序的乐室预约小程序,附源码
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...
Linux常见指令(一)
目录 一、基本指令 1.1ls指令 1.2pwd指令 1.3cd指令 1.4touch指令 1.5mkdir指令 1.6rmdir指令、rm指令 1.7man指令 1.8cp指令 1.9mv指令 1.10cat 一、基本指令 1.1ls指令 语法 : ls [ 选项 ][ 目录或文件 ] 功能:对于目录,该命令…...
大端和小端传输字节完整版
大端和小端传输字节序 大端和小端一、最高有效位、最低有效位1.MSB(Most significant Bit)最高有效位2.LSB(Least Significant Bit)最低有效位 二、内存地址三、大端和小端四、网络字节序和主机字节序五、C#位操作符六、C#中关于大端和小端的转换七、关于负数八、关于汉字编码以…...
华为23年9月笔试原题,巨详细题解,附有LeetCode测试链接
文章目录 前言思路主要思路关于f函数的剖析Code就到这,铁子们下期见!!!! 前言 铁子们好啊!今天阿辉又给大家来更新新一道好题,下面链接是23年9月27的华为笔试原题,LeetCode上面的ha…...
ES实战--性能提升
触发冲刷的条件: 1.内存缓冲区已满 2.自上次冲刷后超过了一定时间 3.事务日志达到了一定阀值 对名为get-together的Elasticsearch索引执行优化操作,将索引中的数据段(segments)合并到指定的数量1 GET /get-together/_optimize?max_num_segm…...
解决ModuleNotFoundError: No module named ‘pysqlite2‘
目录 一、问题描述: 二、问题分析: 三、问题解决: 四、参考文章: 一、问题描述: 在重新安装的anaconda环境中自建了一个新虚拟环境,再安装完jupyter后(pip install jupyter)&am…...
腾讯云4核8G服务器够用吗?能支持多少人?
腾讯云4核8G服务器支持多少人在线访问?支持25人同时访问。实际上程序效率不同支持人数在线人数不同,公网带宽也是影响4核8G服务器并发数的一大因素,假设公网带宽太小,流量直接卡在入口,4核8G配置的CPU内存也会造成计算…...
React 的调度系统 Scheduler
原文地址1 原文地址2 其中startTime是任务开始的时间,默认是-1,任务开始时将任务开始时间赋值给了startTime, 这里意思是判断这个任务执行时间是否超过5ms(写死的)。若超过,则要交出。...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
Python竞赛环境搭建全攻略
Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型(算法、数据分析、机器学习等)不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...
医疗AI模型可解释性编程研究:基于SHAP、LIME与Anchor
1 医疗树模型与可解释人工智能基础 医疗领域的人工智能应用正迅速从理论研究转向临床实践,在这一过程中,模型可解释性已成为确保AI系统被医疗专业人员接受和信任的关键因素。基于树模型的集成算法(如RandomForest、XGBoost、LightGBM)因其卓越的预测性能和相对良好的解释性…...
