1.从源码看RocketMQ的码分消费端负载均衡和Rebalance机制
2.WorldPartition中的HLOD
3.List的拆分的几种方式
从源码看RocketMQ的消费端负载均衡和Rebalance机制
RocketMQ消费端的负载均衡设计旨在均匀分布partition,确保各个consumer承担合理负载。码分如图所示,码分各个partition分布于多个consumer之间,码分确保均衡消费。码分此实现依赖于RebalanceImpl类,码分实时公告界面源码具体通过doRebalance方法执行负载均衡策略,码分此方法调用rebalanceByTopic方法实现负载均衡逻辑。码分核心算法在AllocateMessageQueueStrategy类中,码分使用默认构造器可见,码分其默认策略是码分AllocateMessageQueueAveragely实现,遵循连续分配原则,码分确保负载均衡。码分
在不同场景下,码分RocketMQ提供了多种负载均衡策略供选择,码分以适应特定需求。例如,对于消费多个topic的场景,尤其是在线报修项目源码topic数量多且partition与机器数量非整数倍情况,自定义负载均衡策略更为合适,以避免部分consumer承担过重负担,导致集群内机器水位差异过大。
关于何时重新执行负载均衡(Rebalance),涉及MQClientInstance类的监控机制。在DefaultMQPushConsumerImpl的start方法中,通过创建RebalanceService对象实现定时负载均衡。RebalanceService类的run方法中,默认设置每秒执行一次doRebalance操作,skynet框架源码分析通过ServiceThread的实现确保在consumer出现宕机或新consumer连接时,能在秒内完成负载均衡,确保集群内负载分布的动态平衡。
WorldPartition中的HLOD
WorldPartition HLOD是专门用于Cell层LOD的技术,在创建WorldPartition场景时,已经预设了一个HLOD的配置文件。
配置文件位置如下:
然而,默认情况下并没有生成与HLOD相关的资源,需要手动进行Build操作。灵巧噪声 仿真源码
完成Build后,您会发现场景中新增了以下内容:
Cook后,子关卡文件也会相应增加。
运行游戏后,不再会出现Cell加载时突然显示的问题。
关于相关源码,我们可以从新增的Actor和场景文件推测,HLOD同样采用了LevelStreaming系统。从创建StreamingCell的c 源码转为软件流程开始分析,我们可以看到它将LODLayer_Instance下的所有Actor放置到RuntimeGrid中。这些Actor都是AWorldPartitionHLOD类型,其Bound与Cell大小保持一致。WorldPartitionHLOD可以被视为一个Cell的LOD,它将Cell上的所有Mesh合并为一个Mesh。
在每帧获取要显示的Cell时,流程与普通Cell保持一致。
List的拆分的几种方式
在开发过程中,处理大型集合时常常需要将其拆分成小块,这种操作被称作分片或List的分割。其实,许多大神已经为我们提供了现成的工具,省去了自定义代码的繁琐。以下是Java中常用的三种分片实现方法:
1. Google的Guava框架:在pom.xml中添加Guava支持后,通过Lists.partition()方法实现切片,代码示例如下:
...
2. Apache的commons框架:同样在pom.xml添加支持,使用ListUtils.partition(),代码示例如下:
...
3. Hutool工具类:引入Hutool框架后,利用ListUtil.partition()完成切片,代码示例如下:
...
值得注意的是,选择哪种方法取决于项目的实际需求和已有的依赖。例如,批量数据处理时,如果数据量大,可以考虑将数据拆分以避免一次性插入数据库导致的性能问题或超限错误。具体操作时,可以根据数据库的配置进行调整。
这些工具包如Guava、Apache Commons和Hutool,提供了丰富的实用工具,性能优良,是开发者的得力助手。无需深入源码,直接使用即可大大简化工作。
以上内容源于程序员xiaozhang的文章,原文链接:cnblogs.com/scott/p...