消息队列总结(3)- RabbitMQ Kafka RocketMQ高可用方案

目录

1. 什么是高可用?

1.1 常见的高可用方法

1.2 消息队列的高可用

2. RabbitMQ的高可用方案

2.1 镜像队列

2.2 消息生产的确认机制

2.3 消息的持久化

3. Kafka的高可用方案

3.1 消息备份

3.2 ISR & IEO & HW

3.3 消息生产的确认机制

4. RocketMQ的高可用方案

4.1 消息备份机制

5.RabbitMQ & Kafka & RocketMQ差异总结

6. 参考资料


1. 什么是高可用?

1.1 常见的高可用方法

高可用(High Availability,简称HA)是指一个系统、应用程序或服务可以在发生故障或其他异常情况时,仍然能够保持可用性和稳定性,确保用户能够无缝访问和使用。

我们通常实现高可用的方法包括:

  • 数据备份:为了保障数据的可靠性和可用性,在数据存储设备中,存储多个副本。在极端情况下一个存储设备故障时,可以使用其他副本进行数据恢复。
  • 服务冗余:常见的服务冗余方法包括:主备模型(1个活动主节点对应多个从节点)、双主模型(2个活动主节点,且两个节点互备)、N+1(包含N个活动主节点+1个备用节点)。此外服务冗余还需要配合负载均衡策略,避免单个服务过载或崩溃。
  • 容错设计:是指编写健壮的代码,容错设计中需要考虑的包括:异常处理、重试机制、幂等设计等。常见的做法是在服务端接口设计时,需要使用乐观锁、唯一标识等手段保障幂等。在客户端可以及时抛出异常让业务人员重试,或者捕获异常进行多次重试。
  • 故障检测:是指通过冗余侦测线,经过复杂的监听程序,逻辑判断,来判断是否故障。常见的方法包括:集群各节点之间的心跳检测、集群各节点与仲裁设备之间的心跳检测。
  • 故障转移(FailOver):是指检测到服务故障的前提下,通过调整负载均衡策略,避免流量路由到故障服务的方法。这里对于那些已经在执行中的请求可能会产生影响,需要配合客户端重试把影响降到最低。
  • 故障回转(FailBack):在故障恢复后,我们通常需要调整负载均衡策略,把流量重新路由到原服务。这里需要注意,若服务涉及到数据存储,需要追上丢失的数据,再切回流量。

1.2 消息队列的高可用

这里说的消息队列的高可用特指消息队列集群所做的高可用设计,无论是RabbitMQ、Kafka,还是RocketMQ,在高可用上都做到了数据备份、服务冗余,他们的核心差异在于不同的消息队列数据备份的力度、消息同步机制、消息持久化机制的设计思想上存在差异。

2. RabbitMQ的高可用方案

2.1 镜像队列

消息生产:如果生产者与Slave建立连接,Slave会把请求转发到Master,Master存储后再把请求转发到其他Slave进行存储。

消息消费如果消费者与Slave建立连接并进行订阅消费,实质上请求会被转发到Master上获取信息,只不过看似是从Slave上消费而己。这里的疑问是,这里的Master会不会压力比较大?答案是如果我们的各个队列的Leader能够平均分布在各个Broker,就不会给一个Broker带来特别大的压力。

Slave升级:当Master挂掉之后,会触发把消息队列最长的升级为Master。

此外,为了避免机房断电、断网等极端情况,RabbitMQ还提供了Shovel远程模式,把消息存储在跨地域的两个不同的数据中心,并让两个跨地域的两个MQ集群互联

2.2 消息生产的确认机制

镜像队列只是解决了一个节点宕机后,还有其他备用节点可用。但是RabbitMQ针对主从复制的机制是什么样的?是否能保障切换时主从节点的一致性呢?

在早期的RabbitMQ,主从复制的方案是异步复制,也就是当消息被存储到到Master节点后,会立刻给生产者进行ACK,表示消息已经被接收并写入成功,此时,Slave节点可能还没有完全同步数据。

但是,从 RabbitMQ 3.7 版本开始,RabbitMQ 增加了一个新的队列类型 quorum queue(法定队列),通过提供一种基于 Paxos 的一致性算法来保证数据在主从节点之间的强一致性。

2.3 消息的持久化

  • 什么时间需要持久化:1.队列本身就被配置为持久化时(队列的durable属性设置为true);2.针对非持久化队列,内存紧张时需要将部分内存中的消息转存到磁盘(内存换页)。
  • 什么时间触发持久化:1.写入磁盘之前会有Buffer,默认大小为1M,若Buffer已满则触发写入磁盘;2.无论Buffer满不满,有一个固定的刷盘实践(25ms);

3. Kafka的高可用方案

3.1 消息备份

 Kafka允许一个队列存在多个Partition,每个Partition存在一个Leader和多个Follower。生产者将消息直接发往对应Partition的Leader,Follower会周期地向Leader发送同步请求,Kafka的Leader机制在保障数据一致性地同时降低了消息备份的复杂度。

3.2 ISR & IEO & HW

  • ISR(In-Sync Replicas):指的是一个Partition中与Leader“保持同步”的Replica列表(实际存储的是副本所在Broker的BrokerId),这里的保持同步不是指与Leader数据保持完全一致,只需在replica.lag.time.max.ms时间内与Leader保持有效连接。
  • LEO(log end offset) :即日志末端偏移,指向了副本日志中下一条消息的位移值(即下一条消息的写入位置)。

  • HW(high watermark):即已同步消息标识,因其类似于木桶效应中短板决定水位高度,故取名高水位线。

下图详细的说明了当Producer生产消息至Broker后,ISR以及HW和LEO的流转过程: 

3.3 消息生产的确认机制

  • acks=0

生产者无需等待服务端的任何确认,消息被添加到生产者套接字缓冲区后就视为已发送,因此acks=0不能保证服务端已收到消息,使用场景较少。

  • acks=1

Leader将消息写入本地日志后无需等待Follower的消息确认就做出应答。如果Leader在应答消息后立即宕机且其他Follower均未完成消息的复制,则该条消息将丢失。

  • acks=all

Leader将等待ISR中的所有副本确认后再做出应答,因此只要ISR中任何一个副本还存活着,这条应答过的消息就不会丢失。acks=all是可用性最高的选择,但等待Follower应答引入了额外的响应时间。Leader需要等待ISR中所有副本做出应答,此时响应时间取决于ISR中最慢的那台机器。

4. RocketMQ的高可用方案

4.1 消息备份机制

为了保障RocketMQ不丢消息,RocketMQ一般是将Broker部署成Master-Slave模式。其中Master节点负责处理消息的写入和读取请求,Slave节点则进行数据的复制以及读取请求的负载均衡。通常RocketMQ的主从复制方案包括:

  • 同步复制:当Master节点接受到消息后,执行两个动作:消息持久化、发起主从同步。Master节点等待所有Slave节点都将该消息同步完成之后再返回执行结果。这样可以保证数据的一致性,但会对性能造成一定影响,因为需要等待所有的Slave节点都同步完成之后才能继续处理数据。
  • 异步复制(默认方案):异步复制使用一个后台不断运行的线程,主要包括两部分Slave节点向Master节点反馈主从复制进度、Master节点主动向Slave节点同步消息。

5.RabbitMQ & Kafka & RocketMQ差异总结

  • 消息备份机制:RabbitMQ是通过镜像队列实现高可用,Kafka是通过分区副本机制来实现高可用,RocketMQ是通过主从节点的复制来实现高可用。
  • 消息确认机制:RabbitMQ消息在Master节点写入之后,就可以给Producer进行ACK;Kafka提供了ACK=0(无需写入即ACK)、ACK=1(Leader节点写入后ACK)、ACK=all(所有节点写入后ACK)三种模式;RocketMQ支持同步复制(所有节点吸入后ACK)、异步复制(Master节点写入后ACK)两种模式
  • 消费者ACK处理机制:如果消息还未被ACK,此时Broker发生宕机,RabbitMQ、Kafka、RocketMQ的处理机制比较类似,都是通过重试把消息发送到新的消费者来消费。

6. 参考资料

镜像队列 - RabbitMQ 教程

基于MySql,Redis,Mq,ES的高可用方案解析

Kafka架构、高性能和高可用性分析_aijiudu的博客-CSDN博客

Kafka的存储机制和可靠性_kafka作为数据缓存区_Lion Long的博客-CSDN博客

解开Kafka神秘的面纱(二):Kafka的高效读写与消息安全_kafaka_毛奇志的博客-CSDN博客

RocketMQ保证高可用和高性能的几种措施

RocketMQ原理:RocketMQ高可用原理 - 墨天轮

我理解的RocketMQ:主从复制HA(high availability)的机制分析_rocketmq的ha机制_xiaojkql的博客-CSDN博客

高可用集群_高可用集群实现高可用性的方法主要有_尐譽的博客-CSDN博客

实现高可用的 11 个关键技巧_如何实现高可用_a1405的博客-CSDN博客

高可用架构设计的六个方法_梯度科技的博客-CSDN博客

服务容错设计:流量控制、服务熔断、服务降级_张维鹏的博客-CSDN博客

可靠性设计:容错设计_软件容错_徐步陌上行的博客-CSDN博客

RabbitMQ的高可用方案_rabbitmq高可用方案_倔强100%的博客-CSDN博客

RabbitMQ的高可用、高可靠保证_rabbitmq高可用_柠檬丶Ewing的博客-CSDN博客

RabbitMQ持久化机制_琦彦的博客-CSDN博客

RabbitMQ VS Apache Kafka (九)—— RabbitMQ集群的分区容错性与高可用性-腾讯云开发者社区-腾讯云

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序开发使用echarts报错Cannot read property ‘getAttribute‘ of undefined

如图,我在小程序圈中的区域渲染echarts图标报错了,报错提示Cannot read property getAttribute of undefined 这里的canvas ,width ,height,dpr获取为 undefined 分析问题: 初始化图表时传递错误的参数: 在 onShow 生…

Vue第四篇:html和js基础知识查漏补缺

1、a标签 定义超链接,用于从一个页面链接到另一个页面 target属性:打开目标URL的方式,_top为再当前窗口打开,_blank为新窗口打开 2、span标签 对文档中的行内元素进行组合,它提供了一种将文本的一部分或者文档的一部分…

MySQL 数据抽稀 每分钟取一条

假如原始数据为每5秒一个数据,现在想展示为每4分钟一条数据,先按照分钟数把除以4余数为0的行选出来,在按照 年月日 时分,做组内排序(窗函数ROW_NUMBER),最后再拿出序号为1的行。 WITH data_01 …

了解Unity编辑器之组件篇UI(一)

UI组件:提供了用户交互,信息展示,用户导航等功能 一、Button:用于响应用户的点击事件 1.Interactable(可交互):该属性控制按钮是否可以与用户交互,如果禁用则按钮无法被点击。可以通…

go使用gin结合jwt做登录功能

1、安装gin go get -u github.com/gin-gonic/gin 2、安装session go get github.com/gin-contrib/sessions 3、安装JWT鉴权 go get "github.com/golang-jwt/jwt/v4" 4、创建一个jwt的工具文件 package utilsimport ("errors""github.com/golan…

ubuntu挂载ext4文件系统

文章目录 1.虚拟机分配10G磁盘用来挂载ext4文件系统2.磁盘分区3.创建文件系统4.挂载文件系统5.卸载文件系统6.使用ior测试ext4三种日志模式(1)ordered(2)journal(3)writeback 1.虚拟机分配10G磁盘用来挂载e…

Flutter动画库:animations(路由过渡动画或者页面切换动画)

animations animations 是一个 Flutter 库,它提供了一组用于创建动画效果的工具和组件。这个库的核心重点是路由过渡动画或者页面切换动画 地址 https://pub-web.flutter-io.cn/packages/animations 安装 flutter pub add animations看了下官方文档和官方例子&a…

【深度学习】【Image Inpainting】Free-Form Image Inpainting with Gated Convolution

模型:DeepFillv2 (CVPR’2019) 论文:https://arxiv.org/abs/1806.03589 代码:https://github.com/JiahuiYu/generative_inpainting 文章目录 效果AbstractIntroductionRelated WorkAutomatic Image InpaintingGuided Image Inpainting and Sy…

第1章 获取数据库中的数据

CoreShop源程序是以数据库优先进行定义的,所以其本身不包含代码优先的定义,但本从更习惯于代码优先,所以为其定义了代码优先的定义。 1 CoreCms.Net.Model.Entities.SysRole using SqlSugar; using System.ComponentModel.DataAnnotations…

三十章:Segmenter:Transformer for Semantic Segmentation ——分割器:用于语义分割的Transformer

0.摘要 图像分割在单个图像块的级别上经常存在歧义,并需要上下文信息来达到标签一致性。在本文中,我们介绍了一种用于语义分割的Transformer模型- Segmenter。与基于卷积的方法相比,我们的方法允许在第一层和整个网络中对全局上下文进行建模。…

《PyTorch深度学习实践》

文章目录 1.线性模型2.梯度下降算法3.反向传播3.1原理3.2Tensor in PyTorch 4.用PyTorch实现线性模型 1.线性模型 2.梯度下降算法 # 梯度下降x_data [1.0,2.0,3.0] y_data [2.0,4.0,6.0]w 3.0def forward(x):return x*w# 损失函数 def cost(xs,ys):cost 0for x,y in zip(x…

基于 Flink SQL CDC 数据处理的终极武器

文章目录 一、传统的数据同步方案与 Flink SQL CDC 解决方案1.1 Flink SQL CDC 数据同步与原理解析1.2 基于日志的 CDC 方案介绍1.3 选择 Flink 作为 ETL 工具 二、 基于 Flink SQL CDC 的数据同步方案实践2.1 CDC Streaming ETL2.2 Flink-CDC实践之mysql案例 来源互联网多篇文…

华为OD机试真题 Java 实现【文件目录大小】【2023 B卷 100分】,附详细解题思路

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明4、再输入5、再输出6、说明 华为OD机试 2023B卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题…

spring-cloud-alibaba——nacos-server搭建

前言:组件版本关系,官方:组件版本关系 1,nacos-server搭建(windows环境),下载地址nacos 选择对应的版本,这里以目前最新版2.2.3为例子,下载后解压 单机模式 修改\nacos-server-2.2.3\nacos\bin\startup.c…

分布式调用与高并发处理 Nginx

一、初识Nginx 1.1 Nginx概述 Nginx是一款轻量级的Web服务器、反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用。Nginx 专为性能优化而开发,使用异步非阻塞事件驱动模型。 常见服务…

(2)前端控制器的扩展配置, 视图解析器类型以及MVC执行流程的概述

SpringMVC入门程序的扩展说明 注册前端控制器的细节 在web.xml文件注册SpringMVC的前端控制器DispatcherServlet时使用url-pattern标签中使用/和/*的区别 /可以匹配.html或.js或.css等方式的请求路径,但不匹配*.jsp的请求路径/*可以匹配所有请求(包括.jsp请求), 例如在过滤器…

【Linux Shell】基础知识

Linux Shell基础知识 一、Linux Shell基础概念1.1 Shell定义1.2 命令行提示符 二、初识Shell2.1 Shell定义2.2 登录Shell相关文件2.3 Shell中的变量变量类型变量的引用单引号\ 与双引号\" \"变量的删除与检查 2.4 Shell中的扩展大括号扩展{ }其他扩展 一、Linux Shel…

使用springboot进行后端开发100问

properties和yaml文件怎么互转 安装插件 properties文件和yaml文件区别 properties 文件通过“.”和“”赋值,值前不加空格,yaml通过“:”赋值,值前面加一个空格;yaml文件缩进用空格; properties只支持键值对&#x…

flash attention 2论文学习

flash attention作者Tri Dao发布了flash attention 2,性能为flash attention的2倍。 优化点主要如下: 一、减少 non-matmul FLOPs A00中由于tensor core的存在,使得gpu对于浮点矩阵运算吞吐很高,如FP16/BF16可以达到312 TFLOPs/…

LINUX中的myaql(一)安装

目录 前言 一、概述 二、数据库类型 三、数据库模型 四、MYSQL的安装 (一)yum安装MYSQL (二)rpm安装MYSQL 五、MYSQL本地登录 rpm安装MYSQL本地登录 六、重置密码 总结 前言 MySQL是一种常用的开源关系型数据库管理系统&#xff…