Узлы в Azure: запускайте длительные вычисления на сервере и избегайте тайм-аута - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть веб-приложение на 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 минут.

Как я могу разветвить длинный процесс, чтобы он мог обойти тайм-аут?

благодаря

1 Ответ

0 голосов
/ 13 декабря 2018

отвечает себе: проблема решена переключением на WebSockets вместо длинного опроса с Ajax

...