@duongtrungnguyen/nestro
Version:
Service registry for Nest JS
52 lines • 1.75 kB
JavaScript
class LeastConnectionsStrategy {
constructor() {
this.connectionCounters = /* @__PURE__ */ new Map();
}
selectInstance(instances) {
if (!instances || instances.length === 0) {
return null;
}
if (instances.length === 1) {
return instances[0];
}
let minConnections = Number.MAX_SAFE_INTEGER;
let selectedInstance = instances[0];
let candidatesWithSameConnections = [];
for (const instance of instances) {
const instanceId = this.getInstanceId(instance);
const connections = this.connectionCounters.get(instanceId) || 0;
if (connections < minConnections) {
minConnections = connections;
selectedInstance = instance;
candidatesWithSameConnections = [instance];
} else if (connections === minConnections) {
candidatesWithSameConnections.push(instance);
}
}
if (candidatesWithSameConnections.length > 1) {
const randomIndex = Math.floor(Math.random() * candidatesWithSameConnections.length);
selectedInstance = candidatesWithSameConnections[randomIndex];
}
return selectedInstance;
}
trackConnectionStart(instanceId) {
const currentCount = this.connectionCounters.get(instanceId) || 0;
this.connectionCounters.set(instanceId, currentCount + 1);
}
trackConnectionEnd(instanceId) {
const currentCount = this.connectionCounters.get(instanceId) || 0;
if (currentCount > 0) {
this.connectionCounters.set(instanceId, currentCount - 1);
}
}
reset() {
this.connectionCounters.clear();
}
getInstanceId(instance) {
return `${instance.name}:${instance.host}:${instance.port}`;
}
}
export {
LeastConnectionsStrategy
};
//# sourceMappingURL=least-connection.strategy.js.map