pinus-robot
Version:
pinus-robot is a simple tool to benchmark the socket.io server's performance.
176 lines • 13.8 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Agent = void 0;
let __ = require('underscore');
const socket_io_client_1 = require("socket.io-client");
const logging_1 = require("../common/logging");
const actor_1 = require("./actor");
let monitor = require('../monitor/monitor');
let fs = require('fs');
let util = require('../common/util');
let STATUS_INTERVAL = 10 * 1000; // 10 seconds
let RECONNECT_INTERVAL = 10 * 1000; // 15 seconds
let HEARTBEAT_PERIOD = 30 * 1000; // 30 seconds
let HEARTBEAT_FAILS = 3; // Reconnect after 3 missed heartbeats
/**
*
* @param {Object} conf
* init the master and app server for the agent
* include app data, exec script,etc.
*
*/
class Agent {
constructor(conf) {
this.log = logging_1.logging;
this.log = logging_1.logging;
this.conf = conf || {};
this.last_heartbeat = null;
this.connected = false;
this.reconnecting = false;
this.actors = {};
this.count = 0;
}
// Create socket, bind callbacks, connect to server
connect() {
let agent = this;
let uri = 'http://' + agent.conf.master.host + ':' + agent.conf.master.port;
console.log('connecting:', uri);
agent.socket = (0, socket_io_client_1.io)(uri, { forceNew: true, multiplex: false });
agent.socket.on('error', function (reason) {
console.error('err:', reason);
agent.reconnect();
});
// Register announcement callback
agent.socket.on('connect', function () {
agent.log.info('Connected to server, sending announcement...');
// console.log(agent.socket.socket.sessionid);
// console.log(require('util').inspect(agent.socket.address,true,10,10));
agent.announce(agent.socket);
agent.connected = true;
agent.reconnecting = false;
agent.last_heartbeat = new Date().getTime();
});
agent.socket.on('disconnect', function () {
agent.socket.disconnect();
agent.log.error('Disconnect...');
});
// Server heartbeat
agent.socket.on('heartbeat', function () {
// agent.log.info("Received server heartbeat");
agent.last_heartbeat = new Date().getTime();
return;
});
// Node with same label already exists on server, kill process
agent.socket.on('node_already_exists', function () {
agent.log.error('ERROR: A node of the same name is already registered');
agent.log.error('with the log server. Change this agent\'s instance_name.');
agent.log.error('Exiting.');
process.exit(1);
});
// begin to run
agent.socket.on('run', function (message) {
agent.run(message);
});
// Exit for BTN_ReReady
agent.socket.on('exit4reready', function () {
agent.log.info('Exit for BTN_ReReady.');
process.exit(0);
});
}
run(msg) {
let agent = this;
util.deleteLog();
this.count = msg.maxuser;
let script = msg.script;
let index = msg.index;
let conf = {};
conf.master = agent.conf.master;
conf.scriptFile = agent.conf.scriptFile;
if (!!script && script.length > 1) {
conf.script = script;
}
agent.log.info(this.nodeId + ' run ' + this.count + ' actors ');
monitor.clear();
this.actors = {};
let offset = index * this.count;
for (let i = 0; i < this.count; i++) {
let aid = i + offset; // calc database key offset;
let actor = new actor_1.Actor(conf, aid);
this.actors[aid] = actor;
(function (actor) {
actor.on('error', function (error) {
agent.socket.emit('error', error);
});
if (conf.master.interval <= 0) {
actor.run();
}
else {
let time = Math.round(Math.random() * 1000 + i * conf.master.interval);
setTimeout(function () {
actor.run();
}, time);
}
})(actor);
}
setInterval(function () {
let mdata = monitor.getData();
agent.socket.emit('report', mdata);
}, STATUS_INTERVAL);
}
// Run agent
start() {
let agent = this;
agent.connect();
// Check for heartbeat every HEARTBEAT_PERIOD, reconnect if necessary
setInterval(function () {
let delta = ((new Date().getTime()) - agent.last_heartbeat);
if (delta > (HEARTBEAT_PERIOD * HEARTBEAT_FAILS)) {
agent.log.warn('Failed heartbeat check, reconnecting...');
agent.connected = false;
agent.reconnect();
}
}, HEARTBEAT_PERIOD);
}
// Sends announcement
announce(socket) {
let agent = this;
let sessionid = agent.socket.id;
agent.nodeId = sessionid;
this._send('announce_node', {
client_type: 'node',
nodeId: sessionid
});
}
// Reconnect helper, retry until connection established
reconnect(force) {
let agent = this;
if (!force && agent.reconnecting) {
return;
}
this.reconnecting = true;
if (agent.socket != null) {
agent.socket.disconnect();
agent.connected = false;
}
console.log('Reconnecting to server...');
setTimeout(function () {
if (agent.connected) {
return;
}
agent.connect();
}, RECONNECT_INTERVAL);
}
_send(event, message) {
try {
this.socket.emit(event, message);
// If server is down, a non-writeable stream error is thrown.
}
catch (err) {
this.log.error('ERROR: Unable to send message over socket.');
this.connected = false;
this.reconnect();
}
}
}
exports.Agent = Agent;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvYWdlbnQvYWdlbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQy9CLHVEQUE0QztBQUM1QywrQ0FBb0Q7QUFDcEQsbUNBQWdDO0FBQ2hDLElBQUksT0FBTyxHQUFHLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0FBQzVDLElBQUksRUFBRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN2QixJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUVyQyxJQUFJLGVBQWUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsYUFBYTtBQUM5QyxJQUFJLGtCQUFrQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxhQUFhO0FBQ2pELElBQUksZ0JBQWdCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLGFBQWE7QUFDL0MsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFDLENBQUMsc0NBQXNDO0FBTy9EOzs7Ozs7R0FNRztBQUNILE1BQWEsS0FBSztJQVVkLFlBQVksSUFBYztRQVQxQixRQUFHLEdBQVcsaUJBQU8sQ0FBQztRQVVsQixJQUFJLENBQUMsR0FBRyxHQUFHLGlCQUFPLENBQUM7UUFDbkIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLElBQWMsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQzNCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzFCLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ25CLENBQUM7SUFFRCxtREFBbUQ7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