как сохранить рабочий поток в героку - PullRequest
0 голосов
/ 06 мая 2020

Проблема

Как я могу предотвратить сбой потока worker.1 на heroku?

Чего я хочу

Я бы хотел ОЧЕНЬ простой рабочий поток / приложение, которое ждет запроса от конечной точки ... когда конечная точка достигнута, конечная точка создает рабочий поток, вызывает рабочий поток (или любой другой требуемый механизм), и рабочий запускается в фоновом потоке.

Я не хочу использовать Redis, Bull и Throng или какие-либо другие сторонние материалы - если только компонент не прост в использовании и обслуживании.

Справочная информация о проекте

Приложение является ОЧЕНЬ базовым c NodeJS приложением.

Клиент: клиент даже не запускается ... но package. json упоминает об этом ... так что я тоже.

Сервер: NodeJS, имеет одну конечную точку, имеет фонового рабочего

Иерархия проекта

Project Hierarchy

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
...