У меня есть веб-приложение на Nodejs, размещенное в Azure.Одна из форм запускает очень долгие, очень ресурсоемкие вычисления, которые могут занять несколько минут.Наивная стандартная реализация закончилась тайм-аутом с ошибкой 500 через 4 минуты, значение Azure по умолчанию.
Чтобы избежать этого, я реализовал опрос на основе http://hungtran.co/long-polling-and-websockets-on-nodejs/
На стороне клиента у меня есть вызов AJAX с бесконечным временем ожидания 0:
$("#optimBtn").click(function() {
subscribe(onMessage);
var form = document.theForm;
form.setAttribute("method", "post");
form.setAttribute("action", "/legs/optim");
form.submit();
})
function subscribe(callback) {
var longPoll = function() {
$.ajax({
method: 'GET',
url: '/legs/messages',
dataType: 'json',
success: function(data) { callback(data) },
complete: function() {},
timeout: 0 // (is ms) none
})
}
longPoll()
}
На стороне сервера EventEmitter отправляет сообщение, содержащее результат вычисления, клиенту:
var EventEmitter = require('events').EventEmitter
var messageBus = new EventEmitter()
messageBus.setMaxListeners(100)
router.get('/messages', function(req, res) {
var addMessageListener = function(res) {
messageBus.once('message', function(data) {
res.json(data)
})
}
addMessageListener(res)
})
А вычислительная часть разработана так, чтобы не удерживать запрос, пока работает метод someSuperLongAsync ():
var optim_post = async function(req, res, next) {
somethingSuperLongAsync().then(results => {
messageBus.emit('message', results)
})
res.status(200).end()
};
router.post('/optim', optim_post);
Хорошо работает для коротких заданий: при нажатии на optimBtn клиент подписывается на сервер на/ leg / messages, отправьте форму на / optim и получите результат, когда все будет готово.Тем не менее, вызов ajax по-прежнему возвращает 500 / тайм-аут, когда процесс занимает более 4 минут.
Как я могу разветвить длинный процесс, чтобы он мог обойти тайм-аут?
благодаря