Split CPU-intensive tasks on multiple servers (nodes) through node worker_threads.
Installation
npm install worker_threads_clusters
What does this do?
Node.js offers a feature called worker_threads
that allows you to launch other node files as threads on the main node program. This can be useful for running programs that might block the event loop or for running CPU-intensive programs.
This package takes that concept one step further by allowing you to spawn workers on different servers (referred to as clusters). This way, you can run CPU-intensive tasks on server clusters and then get the response on the main server without any complicated back-end work.
Example Usage
Main Program (the "client")
const { Client } = require('worker_threads_clusters');
const c = new Client({ nodeBehavior: 'random' });
c.addNode('http://username:password@node1.clusters.local');
c.addNode('http://username:password@node2.clusters.local');
c.addNode('http://username:password@node3.clusters.local');
c.addNode('http://username:password@node4.clusters.local');
c.addNode('http://username:password@node5.clusters.local');
(async () => {
const worker = await c.spawnWorker('run.js');
worker.on('online', () => console.log('worker is online'));
worker.on('error', () => console.log('error'));
worker.on('exit', () => console.log('exit'));
worker.on('message', (data) => console.log('recieved message:', data));
setInterval(()=>{
worker.postMessage('balls');
}, 1000)
})();
Node (the "server")
const { Server } = require('worker_threads_clusters');
const s = new Server({
auth: {
username: 'username',
password: 'password'
},
port: 80,
log: true
});
s.start();
Worker (run.js)
const { isMainThread, parentPort } = require('worker_threads');
if(!isMainThread) {
console.log("yooooo i'm alive!!!!")
parentPort.on("message", (data) => {
console.log('got message:', data);
parentPort.send(data);
});
doSomethingReallyIntensiveCpuTask();
} else {
console.log("run me through a worker, smh")
}
About
Contributing
Pull requests and stars are always welcome. For bugs and feature requests, please create an issue.
Running Tests
Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command:
$ npm install && npm test
API
Soon
TODO
This is sort of an unfinished project. Right now, everything mentioned previously is fully implemented and new things are coming soon.
- UDP connection transport
- Finish working on tests
- Docs
License
Copyright © 2022, Hackermon.
Released under the MIT License.