UNPKG

redis-smq

Version:

A simple high-performance Redis message queue for Node.js.

163 lines 6.12 kB
"use strict"; 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