RabbitMQ高可用

article/2025/10/12 17:36:19

RabbitMQ高可用

  • 各种消息队列对比
    • 使用推荐
  • RabbitMQ 高可用
    • 普通集群模式
    • 镜像集群模式
    • 保证消息队列的幂等性(消息不被重复消费)
    • 消息队列的可靠性传输
      • 生产者丢失数据
      • RabbitMQ丢失数据
      • 消费者丢失数据
    • 保证消息的顺序性
    • 消息积压问题

各种消息队列对比

特性ActiveMQRabbitMQRocketMQKafka
单机吞吐量万级, 吞吐量比RocketMQ和Kafka要低一个数量级万级, 吞吐量比RocketMQ和Kafka要第一个数量级10万级, RocketMQ也是可以支撑高吞吐的一种MQ10万级别, 这是Kafka最大的优点, 就是吞吐量搞, 一般配合大数据类的系统来进行实时数据计算, 日志采集等场景
可用性高, 基于主从架构实现高可用性高, 基于主从架构实现高可用性非常高, 分布式架构非常高, Kafka是分布式的, 一个数据多个副本, 少数机器宕机, 不会丢失数据, 不会导致不可用
消息可靠性有较低的概率丢失数据经过参数优化配置, 可以做到 0 丢失经过参数优化配置, 消息可以做到 0 丢失
时效性ms 级微秒级, 这是RabbitMQ的一大特点, 延迟是最低的ms 级延迟在 ms 级以内
功能支持MQ 领域的功能及其完备基于 erlang 语言开发, 所有并发能力强, 性能极其好, 延迟很低MQ 功能较为完善, 还是分布式的, 扩展性好功能较为简单, 主要支持简单的MQ 功能, 在大数据领域的实时计算以及日志采集被大规模使用, 是事实上的标准
优劣势总结非常成熟, 功能强大, 在业内大量的公司以及项目中都有应用. 偶尔会出现较低概率丢失消息, 而现在社区以及国内应用都越来越少, 官方社区现在对ActiveMQ5.x 维护越来越少, 几个月才发布一个版本而且缺少主要是基于解耦和异步来用的, 较少在大规模吞吐的场景中使用erlang 语言开发, 性能极其好, 延迟很低, 吞吐量到万级, MQ功能比较完备而且开源提供的管理界面非常棒, 用起了很好用, 社区相对比较活跃, 几乎每个月都会发布几个版本, 在国内一些互联网公司近几年用RabbitMQ也比较多, 但问题也显而易见, RabbitMQ确实吞吐量会低一些, 这是因为事先机制比较中, 而且 erlang 开发, 国内有实例做 erlang 源码基本的研究和定制不多, 基本只能依赖于开源社区的快速维护和修复bug, 而且 RabbitMQ集群动态扩展会比较麻烦.接口简单易用, 而且在阿里大规模应用过, 日处理消息上百亿, 可以做到大规模吞吐, 性能也非常好, 分布式扩展也很方便, 社区维护还可以, 可靠性和可用性都是OK的, 还可以支撑大规模的topic数量, 支撑复杂MQ业务场景, java语音开发, 可以自己阅读源码,进行定制化开发,社区活跃度相对较为一般, 文档简单, 接口不是按照标准 JMS 官方走的, 有些系统要迁移需要修改大量代码.Kafka 的特点很明显, 就是仅仅提供较少的核心功能, 但是提供超高的吞吐量, ms 级的延迟, 极高的可用性以及可靠性, 而且分布式可以任意扩展, 同事Kafka最好是支撑较少的 topic 数量即可. 保证超高吞吐量, 唯一劣势是有可能消息重复消费, 对数据准确性会造成极其轻微的影响. 在大数据领域中以及日志采集中, 这点轻微影响可以忽略这个特性, 天然适合大数据实时计算以及日志收集

使用推荐

  • ActiveMQ 没有经历过大规模吞吐量场景验证, 社区也不是很活跃, 不推荐
  • RabbitMQ 有比较稳定的支持, 社区活跃度搞, 中小型公司推荐
  • RocketMQ 阿里出品,社区活跃度没有 RabbitMQ 搞, 需要二次开发, 推荐大型公司使用
  • Kafka 大数据领域的业内标准, 实时计算, 日志采集等

RabbitMQ 高可用

  • 单机模式
  • 普通集群模式
  • 镜像集群模式(高可用)

普通集群模式

在多台机器上启动多个RabbitMQ实例,每个机器启动一个创建queue只会放在一个RabbitMQ实例上, 但是每个实例都会同步queue的元数据, 消费的时候, 实际上如果连接通道另一个实例, 呢么就会从queue所在的实例上去拉取数据, 如果那个放queue的实例宕机了, 就会导致其他实例无法从这个实例上拉取实际, 这个方案主要是提高吞吐量, 就是让集群中多节点来服务耨个queue的读写操作

普通集群模式

镜像集群模式

该模式才是高可用模式, 在镜像集群模式下, 创建的queue会存在多个实例, 每个节点都会有一份万总的queue镜像, 每次写消息到queue时, 会自动把消息同步到多个实例的queue上.开启该模式就是新增一个镜像集群模式策略

好处: 任何一个机器宕机, 可以到其他节点去消费数据

坏处: 性能开销太大, 需要同步到所有集群, 不是分布式的

镜像集群模式

保证消息队列的幂等性(消息不被重复消费)

结合业务分析

  • 比如拿个数据要写库, 先根据主键查询, 如果该数据已存在, 就不插入, 而是进行修改
  • 如果是写入Redis, 那就没问题, 因为每次set天然幂等性
  • 如果需要让生产者发送每天数据的时候, 里面加一个全局唯一 ID, 到消费这里, 先根据这个id去查询判断之前是否有过消费, 如果没有消费那就进行处理, 如果消费过就不进行处理
  • 基于数据的唯一键来保证重复数据不会重复插入多条, 有了唯一键约束, 重复数据插入会报错, 不会导致脏数据出现

消息队列的可靠性传输

在这里插入图片描述
在这里插入图片描述

生产者丢失数据

事务机制

使用RabbitMQ的事务功能, 在生产者发送数据之前开启RabbitMQ事务,然后发送消息, 如果消息没有发送成功被RabbitMQ接收到, 那么生产者会收到异常报错, 此时就可以回滚事务, 然后重试发送. 如果收到可以提交事务就可以提交事务. 缺点是吞吐量会下来, 太耗性能

confirm 机制

还可以开启 confirm 模式, 每次写的消息都会被分配一个唯一id, 然后写入 RabbitMQ 中, RabbitMQ 会回传一个 ack 消息, 告诉你消息OK了, 如果 RabbitMQ 没有处理这个消息, 会回调 nack 接口, 告诉你消息接收失败, 可以重试

事务机制和 confirm 机制区别

  • 事务是同步的, 提交一个事务后会阻塞在那
  • confirm 机制是异步的, 发送这个消息后就可以发送下一个消息, 然后 RabbitMQ接收后会异步回调接口通知消息已接收

一般推荐使用 confirm 机制

RabbitMQ丢失数据

开启RabbitMQ的持久化, 恢复之后会自动读取之前存储的数据, 一般不会丢失数据, 除非RabbitMQ还没完成持久化就挂了, 可能会丢失少量数据, 概率太小

设置持久化步骤

  1. 创建queue时将其设置为持久化, 保证 queue的元数据, 但是不会持久化queue里的数据
  2. 发送消息的时候将消息的 deliverMode 设置为 2 . 就是持久化消息

必须同时设置上面两个才能持久化, 还可以跟生产者那边的 confirm 机制配合, 只有消息被持久化到磁盘后才通知生产者 ack

消费者丢失数据

消费者刚拿到数据, 还没开始处理系统就挂了

可以使用 RabbitMQ 提供的 ack机制, 关闭RabbitMQ的自动ack, 在处理完后手动ack, 没手动确认ack的话, RabbitMQ会认为还没处理完, 消息是不会丢失的

保证消息的顺序性

才分多个queue, 每个queue对应一个消费者, 然后在这个消费者内用内存队列排队, 然后分给不同的worker来处理
在这里插入图片描述

消息积压问题

  • 仅仅是消费者消费速度落后于生产速度, 可以扩容消费者群组
  • 积压严重
    • 修复现有消费者问题,然后停掉
    • 重新创建一个容量更大topic, 比如分区是原来的10倍
    • 编写一个临时消费者程序, 消费来源积压的队列, 不做任何耗时处理, 将消息均写入新创建的队列中
    • 将修复好的消费者部署到原来10倍的机器上消费新队列
    • 解决后恢复原有架构
  • 消息有过期失效机制, 已经丢失大量数据, 只能将丢失的数据写入程序查询出来后重新写入MQ中

http://chatgpt.dhexx.cn/article/RLkT6g0F.shtml

相关文章

系统高可用

系统高可用 1. 什么是高可用?可用性的判断标准是啥?1.1 可用性的判断标准是啥? 2. 哪些情况会导致系统不可用?3. 有哪些提高系统可用性的方法?3.1 注重代码质量,定时Review代码3.2 使用集群,减少…

HBase高可用

一、HBase高可用简介 HBase集群如果只有一个master,一旦master出现故障,将导致整个集群无法使用,所以在实际的生产环境中,需要搭建HBase的高可用,也就是让HMaster高可用,也就是需要再选择一个或多个节点也…

你管这破玩意儿叫高可用

大家好,我是坤哥 今天我们来聊一下互联网三高(高并发、高性能、高可用)中的高可用,看完本文相信能解开你关于高可用设计的大部分困惑 前言 高可用(High availability,即 HA)的主要目的是为了保障…

什么是高可用?高可用介绍:

前言: 高可用(High availability,即 HA)的主要目的是为了保障「业务的连续性」,即在用户眼里,业务永远是正常(或者说基本正常)对外提供服务的。高可用主要是针对架构而言&#xff0c…

HTML Responsive Web Page

注&#xff1a;参考网站 https://www.w3schools.com HTML Responsive Web Page index.html <!DOCTYPE html> <html><head><link rel"stylesheet" href"style.css"><title>Responsive web page</title><meta lan…

响应式布局【Responsive】 与 自适应布局 【adaptive】、单页面【SPA】 和多页面【MPA】

1、响应式布局 是一个网址能兼容多个terminate【终端】&#xff0c;而不是为每个终端做一个特定的版本 优点&#xff1a; 用户体验好节约开发时间、节省设计seo友好可以适用所有设备屏幕 缺点 设计与风格有局限性《自由度太低&#xff0c;局部性较大》灵活性有所欠缺 基于不…

Bootstrap:Responsive Design with Bootstrap(一)

1.Use Responsive Design with Bootstrap Fluid Containers 现在让我们回到我们的Cat Photo应用。这次&#xff0c;我们将用流行的响应式框架Bootstrap来美化它。 Bootstrap将会根据你的屏幕的大小来调整HTML元素的大小 —— 强调 响应式设计的概念。 通过响应式设计&#x…

responsive tables

以上内容原本是整理为ppt格式的&#xff0c;贴过来格式有点乱&#xff0c;请见谅。 其他responsive tables参考&#xff1a; http://gergeo.se/RWD-Table-Patterns/ 3种类型的代码参考 unseen column&#xff1a; http://runjs.cn/code/zrhodpx5 flip scroll&#xff1a; ht…

CSS之responsive image gallery

responsive image gallery 这次实例主要是练习如何讲不同的图片设置为一个栏目&#xff0c;并且能够根据屏幕的大小进行自适应的变换。需要注意的是&#xff0c;本次实例中运用到的重要的关键的内容是&#xff1a;float-left&#xff1b;box-sizing; media screen and (max-wi…

html5 响应式表格插件,响应式表格jQuery插件 – Responsive tables

响应式表格jQuery插件 – Responsive tables 4月 24, 2014 评论 (1) Sponsor 这个Responsive tables jQuery插件依赖于Bootstrap 3使用&#xff0c;比BS自带的自适应多了一些好用的功能&#xff0c;比如筛选显示&#xff0c;Focus选定、Table头滑动固定等&#xff0c;下来看看介…

SAP Fiori 设计准则里的 Responsive 表格概述

Responsive Table 是 SAP Fiori 中的默认表控件。 它包含一组 Line item 并且完全响应(fully responsive)。 根据具体情况&#xff0c;用户还可以从行项目导航到更多详细信息页面。 一个行项目包含多个数据点(data point)&#xff0c;这些数据点被分类到列中。 数据点是指一个…

Responsive Web测试

什么是Responsive Web设计 Ethan Marcotte曾于2010年5月25日在A List Apart发表了文章《Responsive Web Design》&#xff0c;首次提出了RWD(Responsive Web Design)的概念。其理念是&#xff0c;Web页面的设计能够自适应多种设备、平台和浏览器&#xff0c;同时减少缩放、平移…

CSS之Responsive设计的关键三步

下面我们就通过这篇教程&#xff0c;帮助大家从三个步骤来了解和学习“Responsive”设计 第一步&#xff1a;Meta标签 大家都知道&#xff0c;现在智能手机上浏览web页面会让页面适应屏幕的大小&#xff0c;显示在屏幕上。不过我们可以通过“meta”标签对他进行重置&#xff…

CSS之Responsive网页设计的三个特性

Responsive网页设计无疑是网页设计中的一个热门话题。某种程度上&#xff0c;他将是一个最受欢迎的网页设计概念&#xff0c;因为随着网站用户日渐多样化的访问方法&#xff0c;比如说“iPad”、“iPhone”、“Android移动设备”、“平板电脑”、“台式机”以及“ 笔记本”等不…

下载Django中文官方文档

点击?地址&#xff0c;2.2是版本号&#xff0c;后续更新需自行更改对应的版本 https://docs.djangoproject.com/zh-hans/2.2/ 点击下载 HTML&#xff0c;即可下载全中文官方文档 有部分没有中文翻译的页面&#xff0c;请自行安装谷歌翻译插件

Django 文档 | Django

项目介绍 一款 Python 语言基于Django、Layui、MySQL等框架精心打造的一款模块化、高性能、企业级的敏捷开发框架&#xff0c;本着简化开发、提升开发效率的初衷触发&#xff0c;框架自研了一套个性化的组件&#xff0c;实现了可插拔的组件式开发方式&#xff1a;单图上传、多…

Django文档4.0(通俗易懂)

欢迎访问个人博客http://www.jkraise.top 初识 django project 01. 进入虚拟环境 创建Django 工程 使用django-admin.py 来创建 xxx 项目 django-admin startproject xxxx 创建完成后 我们查看 项目结构 目录说明&#xff1a; test——djgo_001: 项目容器 manage.py: 一…

Django技术文档

安装Django 安装python环境并添加到系统环境中 注意&#xff1a;安装的时候尽量避免路径中含有中文 virtualenv虚拟环境的使用 安装virtualenv pip install virtualenv创建virtualenv虚拟环境 CMD创建虚拟环境 cmd进入自己创建的虚拟环境文件夹输入virtualenv 虚拟环境名…

django-rest-framework文档导读

django-rest-framework文档导读 技巧反序列化校验数据保存数据ModelSerializer简化代码 APIViewrequest/responseGenericAPIViewMixinListAPIViewCreateAPIViewRetrieveAPIViewDestroyAPIViewUpdateAPIViewListCreateAPIViewRetrieveUpdateAPIViewRetrieveDestroyAPIViewRetrie…

Django Rest Framework中文文档:Serializer relations

文章目录 一&#xff0c;django模型间的关系二&#xff0c;检查序列化器实例详情三&#xff0c;序列化关系字段&#xff08;一&#xff09;StringRelatedField&#xff08;二&#xff09;PrimaryKeyRelatedField&#xff08;三&#xff09;HyperlinkedRelatedField&#xff08;…