redis-smq
Version:
A simple high-performance Redis message queue for Node.js.
163 lines • 6.12 kB
JavaScript
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.ConsumerHeartbeat = void 0;
const os = __importStar(require("os"));
const redis_smq_common_1 = require("redis-smq-common");
const redis_keys_js_1 = require("../../../common/redis-keys/redis-keys.js");
const event_bus_publisher_js_1 = require("./event-bus-publisher.js");
const cpuUsageStatsRef = {
cpuUsage: process.cpuUsage(),
time: process.hrtime(),
};
function cpuUsage() {
const currentTimestamp = process.hrtime();
const currentCPUUsage = process.cpuUsage();
const timestampDiff = process.hrtime(cpuUsageStatsRef.time);
const cpuUsageDiff = process.cpuUsage(cpuUsageStatsRef.cpuUsage);
cpuUsageStatsRef.time = currentTimestamp;
cpuUsageStatsRef.cpuUsage = currentCPUUsage;
const hrtime = (time) => {
return time[0] * 1e3 + time[1] / 1e6;
};
const usageTime = (time) => {
return time / 1000;
};
return Object.assign({ percentage: ((usageTime(cpuUsageDiff.user + cpuUsageDiff.system) /
hrtime(timestampDiff)) *
100).toFixed(1) }, cpuUsageDiff);
}
class ConsumerHeartbeat extends redis_smq_common_1.Runnable {
constructor(consumer, redisClient, logger, eventBus) {
super();
this.consumer = consumer;
this.logger = logger;
this.redisClient = redisClient;
if (eventBus) {
(0, event_bus_publisher_js_1.eventBusPublisher)(this, eventBus, this.logger);
}
const { keyConsumerHeartbeat } = redis_keys_js_1.redisKeys.getConsumerKeys(consumer.getId());
this.keyConsumerHeartbeat = keyConsumerHeartbeat;
this.timer = new redis_smq_common_1.Timer();
this.timer.on('error', (err) => {
this.emit('consumerHeartbeat.error', err);
});
}
getLogger() {
return this.logger;
}
getPayload() {
const timestamp = Date.now();
return {
timestamp,
data: {
ram: {
usage: process.memoryUsage(),
free: os.freemem(),
total: os.totalmem(),
},
cpu: cpuUsage(),
},
};
}
beat() {
const redisClient = this.redisClient.getInstance();
if (redisClient instanceof Error) {
this.emit('consumerHeartbeat.error', redisClient);
return void 0;
}
const heartbeatPayload = this.getPayload();
const consumerId = this.consumer.getId();
const timestamp = Date.now();
const heartbeatPayloadStr = JSON.stringify(heartbeatPayload);
redisClient.set(this.keyConsumerHeartbeat, heartbeatPayloadStr, {
expire: {
mode: 'PX',
value: ConsumerHeartbeat.heartbeatTTL,
},
}, (err) => {
if (err)
this.emit('consumerHeartbeat.error', err);
else {
this.emit('consumerHeartbeat.heartbeat', consumerId, timestamp, heartbeatPayload);
this.timer.setTimeout(() => this.beat(), 1000);
}
});
}
goingUp() {
return super.goingUp().concat([
(cb) => {
const cleanUp = () => {
this.removeListener('consumerHeartbeat.heartbeat', onHeartbeat);
this.removeListener('consumerHeartbeat.error', onError);
};
const onError = (err) => {
cleanUp();
cb(err);
};
const onHeartbeat = () => {
cleanUp();
cb();
};
this.once('consumerHeartbeat.heartbeat', onHeartbeat);
this.once('consumerHeartbeat.error', onError);
this.beat();
},
]);
}
goingDown() {
return [
(cb) => {
this.timer.reset();
const redisClient = this.redisClient.getInstance();
if (redisClient instanceof Error)
return cb();
redisClient.del(this.keyConsumerHeartbeat, () => cb());
},
].concat(super.goingDown());
}
static isConsumerAlive(redisClient, consumerId, cb) {
const { keyConsumerHeartbeat } = redis_keys_js_1.redisKeys.getConsumerKeys(consumerId);
redisClient.get(keyConsumerHeartbeat, (err, heartbeat) => {
if (err)
cb(err);
else
cb(null, !!heartbeat);
});
}
}
exports.ConsumerHeartbeat = ConsumerHeartbeat;
ConsumerHeartbeat.heartbeatTTL = 10 * 1000;
//# sourceMappingURL=consumer-heartbeat.js.map
;