Broker的主从架构

news2024/10/5 17:27:56

为了保证MQ的数据不丢失而且具备一定的高可用性,所以一般都是得将Broker部署成Master-Slave模式的,也就是—个Master Broker对应一个Slave Broker Master需要在接收到消息之后,将数据同步给Slave,这样一旦Master Broker挂了,还有Slave上有一份数据。

Master上有全量数据,但是去Master上消费,Master压力会很大,但去Slave上去读,数据不全,但是很快。

那RocketMQ如何取舍? ---》当然是两者相结合。

比如说,Master上有10w条数据,第一次先去Master上读,

  • 如果Master发现她只想读第5W条数据,那就直接让他去Slave上读,下次这个消费者也去Slave上读了,

  • 如果Master发现她要读第10W条数据,要读的比较新,那就让他去Master上读,下一次也是Master上读。

  • 如果Master负载很重,再从Master上拉取数据就不合适了。

1 Broker的主从架构有没有实现读写分离?

作为消费者的系统在获取消息的时候,是从Master Broker获取的?还是从Slave Broker获取的?其实都不是。答案是:有可能从Master Broker获取消息,也有可能从Slave Broker获取消息。

作为消费者的系统在获取消息的时候会先发送请求到Master Broker上去,请求获取一批消息,此时Master Broker是会返回一批消息给消费者系统的

Master Broker在返回消息给消费者系统的时候,会根据当时Master Broker的负载情况和Slave Broker的同步情况,向消费者系统建议下一次拉取消息的时候是从Master Broker拉取还是从Slave Broker拉取。

举个例子,要是这个时候Master Broker负载很重,本身要抗10万写并发了,你还要从他这里拉取消息,给他加重负担,那肯定是不合适的。所以此时Master Broker就会建议你从Slave Broker去拉取消息。或者举另外一个例子,本身这个时候Master Broker上都已经写入了100万条数据了,结果Slave Broke不知道啥原因,同步的特别慢,才同步了96万条数据,落后了整整4万条消息的同步,这个时候你作为消费者系统可能都获取到96万条数据了,那么下次还是只能从Master Broker去拉取消息。因为Slave Broker同步太慢了,导致你没法从他那里获取更新的消息了。

所以这一切都会由Master Broker根据情况来决定。

2 RocketMQ版本不同broker主从自动切换的区别

在RocketMQ 4.5版本之前,都是用Slave Broker同步数据,尽量保证数据不丢失,但是一旦Master故障了,Slave是没法自动切换成Master的。

所以在这种情况下,如果Master Broker宕机了,这时就得手动做一些运维操作,把Slave Broker重新修改一些配置,重启机器给调整为Master Broker,这是有点麻烦的,而且会导致中间一段时间不可用。

在RocketMQ 4.5之后,这种情况得到了改变,因为RocketMQ支持了一种新的机制,叫做Dledger。

简单来说,把Dledger融入RocketMQ之后,就可以让一个Master Broker对应多个Slave Broker,也就是说一份数据可以有多份副本,比如一个Master Broker对应两个Slave Broker。

此时一旦Master Broker宕机了,就可以在多个副本,也就是多个Slave中,通过Dledger技术和Raft协议算法进行leader选举,直接将一个Slave Broker选举为新的Master Broker,然后这个新的Master Broker就可以对外提供服务了。

整个过程也许只要几秒的时间就可以完成,这样的话,就可以实现Master Broker挂掉之后,自动从多个Slave Broker中选举出来一个新的Master Broker,继续对外服务,一切都是自动的。

3 Topic作为一个数据集合是怎么在Broker集群里存储的

首先我们来想一下,比如我们有一个订单Topic,可能订单系统每天都会往里面投递几百万条数据,然后这些数据在MQ集群上还得保留好多天,那么最终可能会有几千万的数据量,这还只是一个Topic。

那么如果有很多的Topic,并且里面都有大量的数据,最终加起来的总和也许是一个惊人的数字,此时这么大量的数据本身是不太可能存放在一台机器上的。如果一台机器没法放下那么多的数据,应该怎么办呢?

很简单,分布式存储。

我们可以在创建Topic的时候指定让他里面的数据分散存储在多台Broker机器上,比如一个Topic里有1000万条数据,此时有2台Broker,那么就可以让每台Broker上都放500万条数据。

这样就可以把一个Topic代表的数据集合分布式存储在多台机器上了。

4 生产者系统是如何将消息发送给Broker的?

在发送消息之前,得先有一个Topic,然后在发送消息的时候你得指定你要发送到哪个Topic里面去。

接着既然你知道你要发送的Topic,那么就可以跟NameServer建立一个TCP长连接,然后定时从他那里拉取到最新的路由信息,包括集群里有哪些Broker,集群里有哪些Topic,每个Topic都存储在哪些Broker上。

然后生产者系统自然就可以通过路由信息找到自己要投递消息的Topic分布在哪几台Broker上,此时可以根据负载均衡算法,从里面选择一台Broke机器出来,比如round robine轮询算法,或者是hash算法,都可以。

总之,选择一台Broker之后,就可以跟那个Broker也建立一个TCP长连接,然后通过长连接向Broker发送消息即可。

生产者一定是投递消息到Master Broker的,然后Master Broker会同步数据给他的Slave Brokers,实现一份数据多份副本,保证Master故障的时候数据不丢失,而且可以自动把Slave切换为Master提供服务。

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

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

相关文章

YOLOV10阅读总结

GitHub - THU-MIG/yolov10: YOLOv10: Real-Time End-to-End Object Detection YOLOv10 - Ultralytics YOLO Docs https://arxiv.org/pdf/2405.14458 论文地址 最近yolo又出了个yolov10了,不得不感慨CV是真卷,毕竟yolov9也才没多久。记录一下阅读笔记。…

【JVM】一次JVM内存泄露分析处理

一次内存泄露分析 背景情况 编写了一个大数据基础组件的可用性监控程序,采用Bootstrap监测端口的方式,使得方法常驻(main线程常驻),通过一个调度线程ScheduledThreadPoolExecutor,定时的调动监测任务。 …

短视频拍摄方式有哪些:四川鑫悦里文化传媒有限公司

​短视频拍摄方式有哪些 在数字化时代,短视频以其短小精悍、传播迅速的特点,成为了人们表达自我、分享生活的重要工具。然而,想要制作出引人入胜的短视频,除了创意和构思,拍摄方式的选择也至关重要。四川鑫悦里文化传…

详谈 Java中的list.forEach()和list.stream().forEach() 异同点

涉及的文章链接:ArrayList 循环Remove遇到的坑 一、想总结本篇博客的原因 在日常开发中,需要对集合数据进行或多或少的赋值修改,那么循环赋值或者做一些处理就是最常见的一种操作了,但是用习惯了stream流,所以在循环的…

聚合网卡和Wondershaper限速的一些问题(速度减半问题)

首先我们来了解一下聚合网卡: 聚合网卡,又称为链路聚合组(LAG, Link Aggregation Group)、端口汇聚(Port Trunking)、以太通道(Ethernet Bonding)等,是一种网络技术&…

【OpenCV】图形绘制与填充

介绍了绘制、填充图像的API。也介绍了RNG类用来生成随机数。相关API: line() rectangle() circle() ellipse() putText() 代码: #include "iostream" #include "opencv2/opencv.hpp"using namespace std; using namespace cv…

Git和plink

安装git的话首先进入到git官网进行下载Git - Downloading Package (git-scm.com) ,点击便会自动进行下载。 安装plink时也是根据自己电脑的版本号选择进行安装,我的是windows的64位,由此选择以上版本进行安装,这一个下载完成之后不…

react中子传父信息

思路是: 在父组件定义一个函数接受参数,接收的参数用于接收子组件的信息,把函数传给子组件,子组件调用父亲传来的函数并把要告诉父亲的话传到函数中,就实现了子传父消息 import { useState } from reactimport { use…

JavaWeb笔记整理+图解——服务器渲染技术之EL表达式与JSTL

上一篇我们讲解了什么是服务器渲染技术和jsp,今天我来整理一下EL表达式和JSTL的笔记与图解,让我们的jsp页面更加的简洁与可维护。 没看过上一期的小伙伴可以看上一期的笔记: JavaWeb笔记全整理——JSP服务器渲染技术-CSDN博客 一、EL表达式…

揭开 SOCKS5 有哪些强大的功能?

在在线隐私和安全领域,SOCKS5 是一种多功能且功能强大的协议,为用户提供了一种无缝的方式来加密他们的互联网流量、绕过防火墙并以增强的匿名性和灵活性访问网络。无论您是担心在线监控、地理封锁还是数据隐私,了解如何利用 SOCKS5 的功能都可…

Apache-Doris单机部署

参考: 快速体验 Apache Doris - Apache Doris 1、Apache Doris是一款 基于MPP架构的高性能、实时的分析型数据库,以高效、简单、统一的特点被人们所熟知,仅需 亚秒级响应时间即可返回海量数据下的查询结果,不仅可以支持高并发的点…

ue引擎游戏开发笔记(46)——简单UI设计

1.需求分析: 玩家操作界面应该有基本的准星和血量显示等内容,告知玩家角色的基本状态。 2.操作实现: 1.较为简单的内容,在控件面板建立相应内容,之后链接到游戏中即可! 2.先做准星,在画布上搞个…

Day 56 647. 回文子串 516.最长回文子序列

回文子串 给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。 示例 1: 输入:“abc”输出:3解释&#xf…

蓝桥杯Web开发【大学组:国赛】2022年真题

1.分一分 如果给你一个数组,你能很快将它分割成指定长度的若干份吗? 1.1 题目问题 请在 js/index.js 文件中补全函数 splitArray 中的代码,最终返回按指定长度分割的数组。 具体要求如下: 将待分割的(一维&#x…

“星战之父”乔治・卢卡斯吐槽好莱坞“几乎没有原创思维”,AI 将“不可避免”用于电影制作

《星球大战》系列的创作者乔治・卢卡斯(George Lucas)在 1977 年奠定了电影制作传奇人物的地位,他对当今电影的状况及其发展方向有一些自己的看法。 他在 2024 年戛纳电影节上谈到了当前的电影行业。现年 80 岁的卢卡斯在接受法国媒体 Brut …

STM32建立工程问题汇总

老版本MDK,例如MDK4 工程内容如下: User文件夹中存放main.c文件,用户中断服务函数(stm32f1xx.it.c),用户配置文件(stm32f1xx_hal_conf.h)等用户程序文件,或者mdk启动程序…

GIT提交:.husky/pre-commit: line 2: .husky/_/husky.sh: No such file or directory

GIT提交:.husky/pre-commit: line 2: .husky/_/husky.sh: No such file or directory 一些项目添加了代码提交校验和格式化,在windows下会忽略.husky下文件提交导致git数据丢失。 处理方案: 方案01:补齐缺失的文件 1.1 项目根…

最新斗音评论区截流拓客,自动引流【引流软件+使用教程】

面对社交媒体的蓬勃生长,加粉和拓展客户群成为品牌及个体的当务之急。新推出的一款技术工具恰到好处地迎合了这一需求,提供了一个多功能、适用性强的增粉与互动解决方案。该工具与抖音平台的所有版本兼容,消除了对特定版本的依赖。 利用这一…

微服务架构-聚合设计模式

微服务架构-聚合设计模式 聚合器(Aggregator)设计模式:用于将来自多个微服务的数据,聚合成一个统一的响应,提供给客户端。 聚合模式的核心思想:是使用一个聚合器服务(Aggregator Service&#…

greendao实现增删改查

说明:最近碰到一个需求,在安卓上使用greendao框架,实现增删改查数据 效果图: step1: // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript {repositories {go…