2016-01-11 4 views
1

В настоящее время я разрабатываю API в express js. Я хочу написать функцию, которая сохраняет аналитику в БД, но я должен уметь вызвать функцию в режиме огня и забыть. Функция должна принимать параметры и выполнять свою работу. Это должно работать как отдельный поток, и выполнение текущего кода не должно ждать его ответа. Например, как Акка Актеры работают на Java. Может кто-нибудь предложить способ сделать это или ссылку на ссылку?ExpressJs (NodeJs) Fire & Forget

ответ

1

Вы можете добавить свою информацию в какой-либо MessageQueue, а затем запустить другой процесс, который будет прослушивать сообщения MQ и обрабатывать сообщения соответствующим образом.

Это не так, как действуют Актеры, но это обычно делается в области nodejs.

Например, вы можете использовать kue или AWS SQS или Google PubSub или любого другого доступного решения

// example with kue 
// http-process.js 
var kue = require('kue'); 
var queue = kue.createQueue(); 

... 
app.post('/something-somewhere', (req, res) => { 
    var job = queue.create('event', { 
    data: 'analytics, data', 
    median: 5.3, 
    }).save(function(err){ 
    if(!err) return next(err); 

    res.send('ok'); 
    }); 
}); 

// event-processor.js 
var kue = require('kue'); 
var queue = kue.createQueue(); 

queue.process('event', function(job, done){ 
    someKindOfORM.myEventsTable.insert({ 
    job.data 
    }).notify(done); 
}); 
+0

О, это приятное решение. Но как вы думаете, что Обещания могут мне помочь? Я не знаком с обещаниями. Просто спрашиваю. –

+0

Я думал, что там также есть концепция Promise в Акке, не так ли? В принципе, обещания - это способ обработки вашего кода синхронизации. Я добавлю образец для вас сейчас –

+0

@SagarGopale вот хороший учебник для понимания обещаний http://www.html5rocks.com/en/tutorials/es6/promises/. Обещания не предназначены для запуска в отдельном процессе, однако они предназначены для упрощения процесса асинхронного кода. Это довольно сложно объяснить, пока вы не столкнетесь с обратным вызовом-ада первым –

2

Узел асинхронной по умолчанию. Просто отправьте свой ответ за пределами обратного вызова запроса db:

+0

Я считаю, что он хочет иметь больше пространства при работе с ошибками; использование MQ позволяет ему повторно вставлять db-вставку, если она терпит неудачу или даже выполняет некоторую предварительную обработку –

+1

@ VladMiller. По-прежнему существует возможность обрабатывать ошибки в этом простом подходе. –

Смежные вопросы