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

news2024/11/28 9:28:52

目录

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集群的分区容错性与高可用性-腾讯云开发者社区-腾讯云

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

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

相关文章

在虚拟机中安装anaconda和pytorch

首先我用的是VMware&#xff0c;ubuntu16.04. 首先建议安装anaconda,登录官网Free Download | Anaconda 下载完成后&#xff0c;来到安装文件目录处&#xff0c;打开终端&#xff0c; 然后在终端输入bash <anaconda文件名> 然后就一直enter和yes到底&#xff0c;直到安…

【后端面经】微服务构架 (1-3) | 熔断:熔断-恢复-熔断-恢复,抖来抖去怎么办?

文章目录 一、前置知识1、什么是熔断?2、什么是限流?3、什么是降级?4、怎么判断微服务出现了问题?A、指标有哪些?B、阈值如何选择?C、超过阈值之后,要不要持续一段时间才触发熔断?5、服务恢复正常二、面试环节1、面试准备2、面试基本思路三、总结 在微服务构架中…

【OC总结 面向对象 + 内存管理 + runtime】

文章目录 前言面向对象1.1 一个NSObject对象占用多少内存&#xff1f;1.2 iOS的继承链 & 对象的指针指向了哪里&#xff1f;1.3 OC的类的信息存放在哪里&#xff1f;-isa指针1.4 isMemberOfClass & isKindOfClass Runtime1.4 讲一下OC的消息机制1.5 消息转发机制流程1.…

React 中 {} 的应用

列表渲染&#xff1a; 1.使用数组的 map 方法&#xff08;因为map 可以映射&#xff09; 2、列表要添加 key 属性&#xff0c;值要唯一 // 导入 // 用来获取 dom元素 import { createRoot } from "react-dom/client";// 内容 const contentArr [{ id: 1, name: &…

Spring Cloud【分布式配置中心(Spring Cloud Config 、Config配置总控中心搭建、Config配置读取规则)】(九)

目录 服务网关Gateway实现用户鉴权_网关全局过滤器加入JWT 鉴权 分布式配置中心_Spring Cloud Config 分布式配置中心_Config配置总控中心搭建 分布式配置中心_Config配置读取规则 服务网关Gateway实现用户鉴权_网关全局过滤器加入JWT 鉴权 配置跳过验证路由 org:my:jwt…

C++笔记之函数对象functors与可调用对象

C笔记之函数对象functors与可调用对象 code review! 文章目录 C笔记之函数对象functors与可调用对象0.函数对象&#xff08;Function Objects&#xff09;&#xff0c;也称为functors1.函数对象与可调用对象的关系2.可调用对象几种形式2.1. 使用函数对象2.2. 使用普通函数指针…

Linux 打包Qt程序到无Qt环境Linux系统下运行,问题记录

Linux 环境下Qt开发的摄像头程序用到了opencv的库&#xff0c;需要跟Qt环境一起打包。 1.打包所有关联库用的是脚本程序。 #!/bin/bashLibDir$PWD"/lib" Target$1lib_array($(ldd $Target | grep -o "/.*" | grep -o "/.*/[^[:space:]]*"))$(m…

谈谈跨域?!

1.什么是跨域 跨域是一个网页脚本访问另外一个网页的内容&#xff0c;如果这两个网页的协议、端口&#xff0c;域名有一个不同就会产生跨域问题&#xff0c;浏览器具有一个同源策略&#xff0c;是一个安全策略&#xff0c;为了避免被恶意修改数据或者操作dom。 2.如何解决跨域…

为什么学习SpringSpring框架核心与设计思想(IOC与DI)?

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE进阶 目录 文章目录 一、Spring是什么&#xff1f; 二、为什么要学习框架&#xff1f; 三、Spring核心概念 3.1 什么是容器&#xff1f; 3.2 什么是IOC&#xff1f; 四、再谈Spring中的 IOC 五…

高阶SQL语句

创建一个表一、按关键字排序1.1 单字段排序1.1.1 按分数排序&#xff0c;默认不指定是升序排列1.1.2 分数按降序排列1.1.3 结合where进行条件过滤&#xff0c;筛选地址是nanjing的学生按分数升序排列 1.2 多字段排序1.2.1 查询学生信息先按兴趣id降序排列&#xff0c;相同分数的…

C# List 详解三

目录 11.Equals(Object) 12.Exists(Predicate) 13.Find(Predicate) 14.FindAll(Predicate) 15.FindIndex(Int32, Int32, Predicate) 16.FindIndex(Int32, Predicate) 17.FindIndex(Predicate) C# List 详解一 1.Add(T)&#xff0c;2.AddRa…

信息管理系统---Servlet+javaBean+Druid+DButil

这里是学习了Servlet后结合数据库进行增删查改–登录等作为练手项目非常适合 准备工作&#xff1a; 1.数据准备 这张表是用户表&#xff0c;用于登录 CREATE TABLE users (id int NOT NULL AUTO_INCREMENT,username varchar(25) DEFAULT NULL,password varchar(20) DEFAULT…

【C++基础(四)】内联函数和auto关键字

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C初阶之路⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; 内联函数 1. 前言2. 内联函数概念3. 内联函数的特性…

数字IC实践项目(7)—CNN加速器的设计和实现(付费项目)

数字IC实践项目&#xff08;7&#xff09;—基于Verilog的CNN加速器&#xff08;付费项目&#xff09; 写在前面的话项目整体框图神经网络框图完整电路框图 项目简介和学习目的软件环境要求 资源占用&板载功耗总结 写在前面的话 项目介绍&#xff1a; 卷积神经网络硬件加速…

基于深度学习的高精度六类海船检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度六类海船检测识别系统可用于日常生活中检测与定位海船目标&#xff08;散装货船&#xff08;bulk cargo carrier&#xff09;、集装箱船&#xff08;container ship&#xff09;、渔船&#xff08;fishing boat&#xff09;、普通货船&…

[golang gin框架] 41.Gin商城项目-微服务实战之后台Rbac微服务(用户登录 、Gorm数据库配置单独抽离、 Consul配置单独抽离)

上一节抽离了captcha验证码功能,集成了验证码微服务功能,这一节来看看后台Rbac功能,并抽离其中的用户登录,管理员管理,角色管理,权限管理等功能作为微服务来调用 一.引入 后台操作从登录到后台首页,然后其中的管理员管理,角色管理,权限管理等功能可以抽离出来作为 一个Rbac微服…

视频画面尺寸怎么裁剪?裁剪视频画面方法分享

如果我们的视频将在不同的平台或设备上播放&#xff0c;而这些设备具有不同的屏幕比例&#xff08;如16:9、4:3、1:1等&#xff09;&#xff0c;则可能需要裁剪来适应目标屏幕。这样观看起来会体验效果更佳&#xff0c;但是该怎么裁剪视频的画面呢&#xff1f;给大家分享几种裁…

力扣热门100题之最长连续序列【中等】

题目描述 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1&#xff1a; 输入&#xff1a;nums [100,4,200,1,3,2] 输出&…

Kotlin多平台最佳架构指南

在这篇文章中&#xff0c;我们将对 Kotlin 多平台移动端的最佳架构进行深入探讨。在2023年&#xff0c;作为 Android 开发者&#xff0c;我们会倾向于采用 MVVM 架构&#xff0c;因为它简单、灵活且易于测试。而作为 iOS 开发者&#xff0c;我们可能会选择 MVC、Viper 等架构。…

解决FLink:Missing required options are: slot.name

[ERROR] Could not execute SQL statement. Reason: org.apache.flink.table.api.ValidationException: One or more required options are missing.Missing required options are:slot.name解决 https://ververica.github.io/flink-cdc-connectors/release-2.4/content/connec…