From c94f162a6cc798b32cc58a571e5f451617da2720 Mon Sep 17 00:00:00 2001 From: zhangrui11 Date: Wed, 17 Aug 2022 14:13:52 +0800 Subject: [PATCH 1/3] feat: add createLoadBalancer option --- lib/client/address_group.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/client/address_group.js b/lib/client/address_group.js index 6e9d56f..ae4dbb3 100644 --- a/lib/client/address_group.js +++ b/lib/client/address_group.js @@ -13,6 +13,7 @@ const defaultOptions = { loadbalancerClass: 'roundRobin', retryFaultInterval: 30000, // 30s 重新尝试连接下不可用的地址 waitConnect: true, + createLoadBalancer, }; const NA = 'N/A'; // 默认初始权重 @@ -36,7 +37,7 @@ class AddressGroup extends Base { this._connectionPoolSize = this.connectionPoolConfig.initConnectionSize; const config = DynamicConfig.instance.metric; this._maxIdleWindow = config.numBuckets * config.bucketSizeInMs; - this._loadbalancer = createLoadBalancer(this); + this._loadbalancer = options.createLoadBalancer(this); // 每个 window 周期更新一遍权重,权重区间 [0, 10],0 代表地址被摘除了 this.ready(err => { From d19eba4058f3e912109919e5045c0b78765f69f0 Mon Sep 17 00:00:00 2001 From: zhangrui11 Date: Tue, 6 Sep 2022 11:03:49 +0800 Subject: [PATCH 2/3] feat(loadbalancer): add createLoadBalancer test --- test/client/address_group.test.js | 65 +++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/test/client/address_group.test.js b/test/client/address_group.test.js index 003d36d..c40034f 100644 --- a/test/client/address_group.test.js +++ b/test/client/address_group.test.js @@ -6,6 +6,7 @@ const utility = require('utility'); const urlparse = require('url').parse; const sleep = require('mz-modules/sleep'); const AddressGroup = require('../../lib/client/address_group'); +const RandomLoadBalancer = require('../../lib/client/loadbalancer/random'); const DynamicConfig = require('../../lib/client/dynamic_config'); const ConnectionManager = require('../../').client.RpcConnectionMgr; const MockConnection = require('../fixtures/mock_connection'); @@ -1601,4 +1602,68 @@ describe('test/client/address_group.test.js', () => { assert(!addressGroup._loadbalancer._needElasticControl(49)); }); }); + + describe('自定义loadbalancer', () => { + let addressGroup; + let addressList; + const count = 600; + + beforeEach(async function() { + mm(DynamicConfig.instance.metric, 'numBuckets', 5); + mm(DynamicConfig.instance.metric, 'bucketSizeInMs', 100); + mm(DynamicConfig.instance.faultTolerance, 'leastWindowRtMultiple', 3); + + addressList = []; + for (let i = 0; i < count; i++) { + const address = urlparse(`bolt://127.0.0.${i}:12400`, true); + addressList.push(address); + MockConnection.addAvailableAddress(address); + } + + addressGroup = new AddressGroup({ + key: 'com.alipay.TestQueryService:1.0@SOFA@xxxx', + logger, + connectionManager, + connectionClass: MockConnection, + createLoadBalancer: _addressGroup => new RandomLoadBalancer(_addressGroup), + retryFaultInterval: 5000, + connectionPoolConfig: { + minAddressCount: 5, + maxAddressCount: 50, + initConnectionSize: 6, + elasticControl: true, + capacityPerConnection: 300, + }, + }); + addressGroup.addressList = addressList; + await addressGroup.ready(); + + assert(addressGroup.connectionPoolSize === 6); + }); + + afterEach(async function() { + MockConnection.clearAvailableAddress(); + addressGroup.close(); + await connectionManager.closeAllConnections(); + mm.restore(); + }); + + it('各属性值赋值正确', async () => { + assert(addressGroup._allAddressList.length === count); + assert(addressGroup._allAddressList === addressList); + assert(addressGroup.totalSize === count); + assert(addressGroup.choosedSize === 6); + assert(addressGroup.addressList.length === 6); + + for (const address of addressGroup.addressList) { + assert(addressGroup._weightMap.has(address.host)); + assert(addressGroup._weightMap.get(address.host) === 100); + } + + assert(addressGroup._faultAddressMap.size === 0); + assert(addressGroup._degradeEnable); + const connection = await addressGroup.getConnection(req); + assert(connection && connection.isConnected); + }); + }); }); From ea85bc7dc6bf33ac313de833bbf6f1c391bccf45 Mon Sep 17 00:00:00 2001 From: zhangrui11 Date: Mon, 5 Dec 2022 17:30:25 +0800 Subject: [PATCH 3/3] fix(balancer): fix default createLoadBalancer --- lib/client/address_group.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/client/address_group.js b/lib/client/address_group.js index ae4dbb3..3eb4a80 100644 --- a/lib/client/address_group.js +++ b/lib/client/address_group.js @@ -7,13 +7,12 @@ const sleep = require('mz-modules/sleep'); const { printAddresses } = require('./utils'); const DynamicConfig = require('./dynamic_config'); const HealthCounter = require('./metric/health_counter'); -const createLoadBalancer = require('./loadbalancer'); +const defaultLoadBalancer = require('./loadbalancer'); const defaultOptions = { loadbalancerClass: 'roundRobin', retryFaultInterval: 30000, // 30s 重新尝试连接下不可用的地址 waitConnect: true, - createLoadBalancer, }; const NA = 'N/A'; // 默认初始权重 @@ -37,7 +36,8 @@ class AddressGroup extends Base { this._connectionPoolSize = this.connectionPoolConfig.initConnectionSize; const config = DynamicConfig.instance.metric; this._maxIdleWindow = config.numBuckets * config.bucketSizeInMs; - this._loadbalancer = options.createLoadBalancer(this); + const createLoadBalancer = options.createLoadBalancer || defaultLoadBalancer; + this._loadbalancer = createLoadBalancer(this); // 每个 window 周期更新一遍权重,权重区间 [0, 10],0 代表地址被摘除了 this.ready(err => {