rocketmq源码-consumer负载均衡逻辑

news2025/1/16 21:16:57

前言

这篇笔记主要记录consumer在启动过程中,负载均衡的逻辑,多个消费者组成一个消费者组,对于集群模式,同一个消费者组中的多个消费者共同消费一个topic下的所有消息,所以每个consumer可能会处理N个messageQueue,至于哪个consumer消费哪个messageQueue,是由负载均衡策略决定的

源码

在消费者启动的时候,会通过负载均衡策略,来决定当前消费者处理哪几个messageQueue,入口是:

this.rebalanceService.start();

在run()方法中,会通过while循环,每20S,去进行一次负载均衡计算
在这里插入图片描述

在这里插入图片描述
无论是pull模式,还是push模式,都会调用到

org.apache.rocketmq.client.impl.consumer.RebalanceImpl#doRebalance

这个方法,是按照topic维度,进行负载均衡
在这里插入图片描述

广播模式

org.apache.rocketmq.client.impl.consumer.RebalanceImpl#rebalanceByTopic

在这个方法中,会先判断当前消费者的模式,是集群模式?还是广播模式
对于广播模式,无需进行负载均衡,因为广播模式,每个消费者都会消费所有的消息。也就是说,topic中的所有messageQueue,都是需要消费者去处理的
在这里插入图片描述

集群模式

对于集群模式,最重要的,就是这里根据负载均衡策略进行计算的逻辑
在这里插入图片描述

这里是根据负载均衡之后得到的结果,然后更新一些信息
在这里插入图片描述

这里更新的逻辑很重要,对于push模式,每个messageQueue会对应一个pullRequest请求,然后把pullRequest请求放到队列之后,线程会不停的从queue中拉取pullRequest,然后请求broker
updateProcessQueueTableInRebalance在这个方法中,就会去根据messageQueue,构建pullRequest请求,然后放到queue中

对于pull模式,是需要启动异步的pullTaskImpl任务,在这个任务中,会不停的去broker拉取消息,然后放到消费者主动拉取的队列中
messageQueueChanged() 这个方法,就会根据messageQueue,启动pullTaskImpl

所以,对于consumer,我们会发现,对于广播模式,无需进行负载均衡,每个消费者都会处理messageQueue中的消息,对于集群模式,同一个consumeGroup中的消费者,会分摊一个topic中所有的messageQueue

负载均衡策略

在consumer进行负载均衡时,默认提供了多个负载均衡策略;但是还没有仔细研究这几个负载均衡策略的细节,先列举出来

AllocateMachineRoomNearby

就近机房

AllocateMessageQueueAveragely

平均分配算法

AllocateMessageQueueAveragelyByCircle

平均轮询分配

AllocateMessageQueueByConfig

自定义配置

AllocateMessageQueueByMachineRoom

指定机房

AllocateMessageQueueConsistentHash

一致性hash算法

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

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

相关文章

【4】KVM管理 | 虚拟机的管理 | 克隆 | 快照

目录 1、虚机基本管理 2、虚机的克隆 3、增量镜像 4、虚机快照 1、虚机基本管理 查看正在运行的虚机 [rootlocalhost ~]# virsh list Id Name State ----------------------------------------------------查看所有的虚机 [rootlocalhost ~…

Apache Oozie(1):Apache Oozie简介

1 Oozie 概述 Oozie 是一个用来管理 Hadoop 生态圈 job 的工作流调度系统。由Cloudera 公司贡献给 Apache。Oozie 是运行于 Java servlet 容器上的一个 java web 应用。Oozie 的目的是按照 DAG(有向无环图)调度一系列的 Map/Reduce或者Hive 等任务。Ooz…

Java SE 进阶(二)之 HashSet底层原理

文章目录前言HashSet底层原理1.哈希表2.哈希值3.底层原理4.回答三个问题前言 关于Set和HashSet的API使用可参见 集合基础入门(Collection,ArrayList,HashSet,HashMap) HashSet底层原理 1.哈希表 HashSet集合底层采…

Vue组件 —— 单文件组件

追溯vue组件问题 在未讲项目之前,在 这一篇内容当中就讲到了组件引入使用,有内置的组件和动态组件以及封装一个swiper组件,组件也分为全局组件和局部组件,在讲在项目当中去使用组件之前先简单的回顾一下组件的编写: &…

89.【SpringBoot-02】

SpringBoot聊一聊如何构建一个网站(十四)、.SpringBoot整合数据库操作1.整合JDBC(1).SpringData简介(2).整合JDBC(3).JdbcTemplate ⭐2. 整合Druid数据源 (德鲁伊)(1).Druid简介(2).配置数据源(3).配置Druid数据源监控(4).配置Druid数据源过滤器(5).注解…

Echarts的Y轴添加定值横线的示例

第010个点击查看专栏目录Echarts折线图的y轴要画一条横线,主要是在series中设置markLine的图表标线参数,具体的参考源代码。文章目录示例效果示例源代码(共142行)相关资料参考专栏介绍示例效果 示例源代码(共142行&…

怎么在Windows电脑更新 DirectX ?

玩游戏的人应该都对DirectX不陌生,它可以提高游戏或多媒体程序的运行效率,增强3d图形和声音效果。但很多人都不知道DirectX该如何更新,这篇文章将以Win10为例,教大家怎么在电脑上更新DirectX。 一、检查当前DirectX版本 如果你不…

简单聊一聊组件封装

封装一个思维导图组件 最近封装了一个简单的思维导图组件,在此简单记录一下心里历程 组件样式 组件结构设计 节点之间的线分成三部分,分别是竖线左边的横线A、竖线B、竖线右边的横线C,所以一个节点可以包含以下几个元素: 横线…

VBA提高篇_18 VBA代码录制优化Select(tion)及表格合并Merge(cells()/Rows()/Columns()

文章目录1. Cells(1,1)2. Rows(Str)和Columns(Str)3. VBA合并单元格3.1 Range.MergeCells属性:3.2 Range.Merge/UnMerage属性:3.3 Range.Merge(参数True/False)3.4 操作合并/取消合并单元格的两种方法4. Select / Selection 和 录制宏的代码优化4.1 Select / Selection4.2 录制…

anconda的pip下载包出现的问题

问题一: 在anconda里面如何创建新的python环境(也就是更换新的python版本) 1.先打开anconda软件,创建需要的环境 2. 环境创建好之后,去pycharm里面进行配置解释器 3. 这样就可以用了 问题二:pip的安装软件时出现包找不到的问题? 注意:因为我们刚刚创建了一个python环境,等…

Python基于已知的分幅条带号筛选出对应遥感影像文件的方法

本文介绍基于Python语言,结合已知研究区域中所覆盖的全部遥感影像的分幅条带号,从大量的遥感影像文件中筛选落在这一研究区域中的遥感影像文件的方法。 首先,先来明确一下本文所需实现的需求。现已知一个研究区域(四川省&#xff…

【C++】C++入门 函数重载

前言 自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了。 函数重载一、函数重载定义二、函数重载的条件1. 参数类型不同2. 参数个数不同3. 参数类型顺序不同三、函数重载的原理--名字修饰(name Mangl…

怎么把网页变成灰色?怎么让头像或某一部分不变灰色?filter/backdrop-filter/mix-blend-mode/svg/grayscale(1)

在国家公祭日,我们哀悼沉思,势要勿忘国耻振兴中华;在国家重要人物逝世后,举国哀悼;这些时段很多网站都会积极呼应,给与自己的网页设置成灰色;那给网页设置成灰色是经过怎样的设置来实现的呢&…

利用pandas_udf加速机器学习任务

note pandas udf和python udf区别:前者向量化是在不同partition上处理pandas_udf使用panda API来处理分布式数据集,而toPandas()将分布式数据集转换为本地数据,然后使用pandas进行处理,如果Pyspark的dataframe非常大,…

快速排序和归并排序哪个快?

两个排序的基本思想都是分治(分而治之),实现一般都使用递归实现。1.快速排序双边指针(交换法):记录分界值 ,创建左右指针(记录下标)。以第一个元素为分界值,先从右向左找…

C语言指针变量作为函数参数

在C语言中,函数的参数不仅可以是整数、小数、字符等具体的数据,还可以是指向它们的指针。用指针变量作函数参数可以将函数外部的地址传递到函数内部,使得在函数内部可以操作函数外部的数据,并且这些数据不会随着函数的结束而被销毁…

ocelot的单节点解决方案

ocelot的问题前面我们解决了consul的单节点的集群扩建。这里讨论如果在多客户端访问时,单网关也会有瓶颈。如果单台挂掉,那么也会麻烦,所以根据项目需要解决问题。ocelot多节点部署最简单的粗暴解决,多部署几台网关。但是我们需要…

mac环境和windows环境下GeoServer如何安装部署

geoserver是从事GIS行业都应当了解的一个gis服务器。 所以说学会geoserver是一个非常必要的事情。那么这篇文章呢我就带着大家来一起学习如何在Mac机器上和windows机器上安装并部署Geoserver。 首先不管是哪个环境我们都需要去官网上先下载安装包。 第一步我们要去geoserver的…

【计算机组成原理】y = a * b + c 的执行具体流程

文章目录1.2.2 认识各个硬件部件1. 主存储器的基本组成2. 运算器的基本组成3. 控制器的基本组成4. 计算机的工作流程1.2.2 认识各个硬件部件 1. 主存储器的基本组成 存储体:存放数据和指令地址寄存器:用来存放读取存储体数据时存放的具体位置数据寄存器…

12、字符(串)输入、输出

目录 一、字符数据输入/输出 1. 字符数据输入 2. 字符数据输出 二、字符串输入/输出 1. 字符串输入函数 2. 字符串输出函数 一、字符数据输入/输出 1. 字符数据输入 字符数据输入使用的是getchar函数,其作用是从终端&…