Проблема
Как я могу предотвратить сбой потока worker.1 на heroku?
Чего я хочу
Я бы хотел ОЧЕНЬ простой рабочий поток / приложение, которое ждет запроса от конечной точки ... когда конечная точка достигнута, конечная точка создает рабочий поток, вызывает рабочий поток (или любой другой требуемый механизм), и рабочий запускается в фоновом потоке.
Я не хочу использовать Redis, Bull и Throng или какие-либо другие сторонние материалы - если только компонент не прост в использовании и обслуживании.
Справочная информация о проекте
Приложение является ОЧЕНЬ базовым c NodeJS приложением.
Клиент: клиент даже не запускается ... но package. json упоминает об этом ... так что я тоже.
Сервер: NodeJS, имеет одну конечную точку, имеет фонового рабочего
Иерархия проекта
Server side files
I am only showing server side files, as like I said, the client doesn't run in this problem.
Procfile
worker : node worker.js
Пакет. json
{
"name": "workerthreadtest",
"version": "0.1.0",
"description": "Worker thread test server",
"main": "server.js",
"author": "Me :-)",
"license": "MIT",
"engines": {
"node": "12.16.0",
"npm": "6.14.4"
},
"scripts": {
"start": "node server.js",
"heroku-postbuild": "NPM_CONFIG_PRODUCTION=false npm install --prefix client && npm run build --prefix client"
},
"dependencies": {
"express": "^4.17.1",
"threads": "^1.4.1"
}
}
сервер. js
const express = require('express');
const path = require('path');
const app = express();
var api = '/api';
const test = require('./routes/api/endpoint');
app.use( api + '/test', test);
if (process.env.NODE_ENV === 'production') {
app.use(express.static('client/build'));
app.get('*', (req, res) => {
res.sendFile(path.resolve(__dirname, 'client', 'build', 'index.html'));
});
}
const port = process.env.PORT || 5000;
app.listen(port, () => {
console.log(` `);
console.log(`server info: `);
console.log(` port ${port}`);
console.log(` `);
console.log(`server ready`);
});
рабочий. js* 1 032 * const {Worker, isMainThread, parentPort, workerData } = require('worker_threads');
if (isMainThread) {
console.log('MAIN THREAD : worker');
process
.on('SIGTERM', () => { console.log("PROCESS SIGTERM"); })
.on('SIGINT', () => { console.log("PROCESS SIGINT"); })
.on('uncaughtException', () => { console.log("PROCESS uncaught exception");});
module.exports = function parseJSAsync(data) {
return new Promise((resolve, reject) => {
console.log('parseJSAsync : creating worker with this data',data);
const worker = new Worker(__filename, { workerData: data });
worker.on('message', (msg) =>{console.log('parseJSAsync : resolving',msg); resolve});
worker.on('error', (err) => {console.log('parseJSAsync : err',JSON.stringify(err)); reject;});
worker.on('exit', (code) => {
if (code !== 0)
reject(new Error(`parseJSAsync stopped with exit code ${code}`));
});
});
};
} else {
console.log('WORKER THREAD : with data:', workerData);
parentPort.postMessage('done');
}
конечная точка. js
const express = require('express');
const router = express.Router();
const parseJSAsync = require('../../worker');
router.post('/add', (req,res) => {
console.log('in end point calling worker');
parseJSAsync('foo');
console.log('in end point returning status');
res.json({status:'ok'});
});
module.exports = router;
сбой worker.1 во время развертывания
При развертывании потока worker.1 происходит сбой
2020-05-06T17:33:41.468191+00:00 heroku[worker.1]: State changed from starting to up
2020-05-06T17:33:43.280082+00:00 heroku[worker.1]: State changed from up to crashed
Я вижу, как запускается основной поток и раскрывает функцию parseJSAsyn c
2020-05-06T19:07:23.224874+00:00 app[web.1]: MAIN THREAD : worker
Вот весь журнал развертывания
Вот весь вывод развертывания
2020-05-06T17:33:31.681013+00:00 heroku[web.1]: Restarting
2020-05-06T17:33:31.697047+00:00 heroku[web.1]: State changed from up to starting
2020-05-06T17:33:31.728905+00:00 heroku[worker.1]: State changed from crashed to starting
2020-05-06T17:33:31.488379+00:00 app[api]: Deploy 3759e04c by user michael
2020-05-06T17:33:31.488379+00:00 app[api]: Release v30 created by user michael
2020-05-06T17:33:31.000000+00:00 app[api]: Build succeeded
2020-05-06T17:33:41.468191+00:00 heroku[worker.1]: State changed from starting to up
2020-05-06T17:33:43.280082+00:00 heroku[worker.1]: State changed from up to crashed
2020-05-06T17:33:44.358593+00:00 app[web.1]:
2020-05-06T17:33:44.358681+00:00 app[web.1]: > workerthreadtest@0.1.0 start /app
2020-05-06T17:33:44.358720+00:00 app[web.1]: > node server.js
2020-05-06T17:33:44.358728+00:00 app[web.1]:
2020-05-06T17:33:44.532443+00:00 app[web.1]: MAIN THREAD : worker
2020-05-06T17:33:44.539430+00:00 app[web.1]:
2020-05-06T17:33:44.539527+00:00 app[web.1]: server info:
2020-05-06T17:33:44.539613+00:00 app[web.1]: port 50891
2020-05-06T17:33:44.539700+00:00 app[web.1]:
2020-05-06T17:33:44.539770+00:00 app[web.1]: server ready
2020-05-06T17:33:44.832507+00:00 heroku[web.1]: State changed from starting to up
Вызов рабочего из конечной точки
Когда я действительно вызываю рабочего ... он не запускается в рабочем потоке, как я ожидал, а вместо этого он запускается в приложении [web.1 ]
2020-05-06T17:48:02.576142+00:00 app[web.1]: WORKER THREAD : with data: foo
весь вывод после вызова воркера из конечной точки
2020-05-06T17:48:02.495128+00:00 heroku[router]: at=info method=POST path="/api/test/add" host=workerthreadtest.herokuapp.com request_id=19ca6672-36e6-4e01-a561-9067538850d6 fwd="66.7.228.252" dyno=web.1 connect=0ms service=66ms status=200
bytes=221 protocol=https
2020-05-06T17:48:02.448582+00:00 app[web.1]: in end point calling worker
2020-05-06T17:48:02.449954+00:00 app[web.1]: parseJSAsync : creating worker with this data foo
2020-05-06T17:48:02.460729+00:00 app[web.1]: in end point returning status
2020-05-06T17:48:02.576142+00:00 app[web.1]: WORKER THREAD : with data: foo
2020-05-06T17:48:02.576652+00:00 app[web.1]: parseJSAsync : resolving done
2020-05-06T17:52:04.905374+00:00 heroku[worker.1]: State changed from crashed to starting
2020-05-06T17:52:15.523852+00:00 heroku[worker.1]: State changed from starting to up
2020-05-06T17:52:16.945097+00:00 heroku[worker.1]: State changed from up to crashed