主动触发Bundle分裂服务端流程源码解析

本文详细描述了Pulsar中如何手动触发NamespaceBundle分裂的过程,包括参数验证、源码跟踪和关键方法的执行逻辑,重点讨论了数据迁移和分裂算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、正文

Namespace下的Topic是分Bundle进行管理的,每个Namespace都是一个哈希环,而Bundle负责管理环上某个范围上的Topic。通过这种方式可以更好的进行Topic的管理。当某个Bundle上负责的Topic越来越多时,会导致负责该Bundle的Broker节点压力变大。因此Pulsar还提供了Bundle分裂的机制,这个机制支持自动触发以及手动触发,今天这篇文章就从源码的角度分析手动触发Bundle分裂时服务端会发生什么
在这里插入图片描述

主动触发Bundle分裂操作方式

bin/pulsar-admin namespaces bundles public/default

//输出如下
{
   
  "boundaries" : [ "0x00000000", "0x08000000", "0x10000000", "0x20000000", "0x30000000", "0x40000000", "0x50000000", "0x60000000", "0x70000000", "0x80000000", "0x90000000", "0xa0000000", "0xb0000000", "0xc0000000", "0xd0000000", "0xe0000000", "0xf0000000", "0xffffffff" ],
  "numBundles" : 17
}

//指定某个bundle进行分裂
bin/pulsar-admin namespaces split-bundle --bundle 0x00000000_0x10000000 public/default

二、源码解析

Pulsar管理流相关的操作都是通过HTTP的方式,因为需要支持多种客户端类型(http、client、cli)。服务端处理这些操作都在admin模块下,如下图,本次要聊的bundle分裂就在Namespaces方法中
在这里插入图片描述

首先从Namespaces的splitNamespaceBundle进行跟踪

    public void splitNamespaceBundle(
            ....
            @QueryParam("splitAlgorithmName") String splitAlgorithmName, //指定bundle分裂算法
            @ApiParam("splitBoundaries") List<Long> splitBoundaries) {
   
         //校验参数格式以及是否存在对应的namespace
          validateNamespaceName(tenant, namespace);
          //异步进行分裂操作
          internalSplitNamespaceBundleAsync(bundleRange, authoritative, unload, splitAlgorithmName, splitBoundaries)
                .thenAccept(__ -> {
   
                    ....
                })
                .exceptionally(ex -> {
   
                    ....
                });
    }

可以看到最外层只是做些参数校验,那么就继续跟踪internalSplitNamespaceBundleAsync方法,如下

protected CompletableFuture<Void> internalSplitNamespaceBundleAsync(String bundleName,
                                                                        boolean authoritative, 
                                                                    		boolean unload,
                                                                        String splitAlgorithmName,
                                                                        List<Long> splitBoundaries) {
   
        return validateSuperUserAccessAsync()   //权限校验
                .thenAccept(__ -> {
   
                    checkNotNull(bundleName, "BundleRange should not be null");
                    log.info("[{}] Split namespace bundle {}/{}", clientAppId(), namespaceName, bundleName);
                    //获取当前集群所支持的bundle分裂算法,这里是硬编码的固定四种
                    List<String> supportedNamespaceBundleSplitAlgorithms =
                            pulsar().getConfig().getSupportedNamespaceBundleSplitAlgorithms();
                  					//此处省去参数检查逻辑
     												....
                    }
                })
                .thenCompose(__ -> {
   
                    //此处省去参数检查逻辑
     								....
                })
                .thenCompose(__ -> validatePoliciesReadOnlyAccessAsync())   //权限校验
                .thenCompose(__ -> getBundleRangeAsync(bundleName)) //获取要分裂的bundle的范围
                .thenCompose(bundleRange -> {
   
                    return getNamespacePoliciesAsync(namespaceName)
                            .thenCompose
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏洛克·林

有钱的捧个钱💰场或人场~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值