pip/pip-354.md
There are mainly two LoadManager implementation in Pulsar broker: ExtensibleLoadManager and ModularLoadManagerImpl. ModularLoadManagerImpl is the default load manager, and ExtensibleLoadManager is a new load manager which is proposed after 3.0.0 version.
ModularLoadManagerImpl rely on zk to store and synchronize metadata about load, which pose greate pressure on zk, threatening the stability of system. Every broker will upload its LocalBrokerData to zk, and leader broker will retrieve all LocalBrokerData from zk, generate all BundleData from each LocalBrokerData, and update all BundleData to zk.
ExtensibleLoadManager depends on system topics and table views for load balance metadata store and replication. Though not using zk to store and synchronize metadata about load, it is still necessary to control the number of bundles that need to be updated, for which there is a loadBalancerMaxNumberOfBundlesInBundleLoadReport configuration in ExtensibleLoadManager that select the top k bundles.
As every bundle in the cluster corresponds to a zk node, it is common that there are thousands of zk nodes in a cluster, which results into thousands of read/update operations to zk. This will cause a lot of pressure on zk.
As All Load Shedding Algorithm pick bundles from top to bottom based on throughput/msgRate, bundles with low throughput/msgRate are rarely be selected for shedding. So that we don't need to contain these bundles in the bundle load report.
Reuse the configuration loadBalancerMaxNumberOfBundlesInBundleLoadReport in ExtensibleLoadManager, apply the topK mechanism to ModularLoadManagerImpl.
If loadBalancerMaxNumberOfBundlesInBundleLoadReport is set to a positive number, ModularLoadManagerImpl will only select the topK * brokerCount bundles based on throughput/msgRate to update to zk.
If loadBalancerMaxNumberOfBundlesInBundleLoadReport <= 0, ModularLoadManagerImpl will update all bundles to zk.
As the default value of loadBalancerMaxNumberOfBundlesInBundleLoadReport is 10, ModularLoadManagerImpl will only update the top 10 * brokerCount bundles to zk by default.
WARNING: too small loadBalancerMaxNumberOfBundlesInBundleLoadReport could result in a long load balance time.
For users who don't want to use this feature, they can set loadBalancerMaxNumberOfBundlesInBundleLoadReport to 0.
This is a modular load balancer behavior change(not forward-compatible).
User can set loadBalancerMaxNumberOfBundlesInBundleLoadReport to 0 to disable this feature.