【问题标题】:Nodejs on Azure: trigger long server computation and avoid timeoutAzure 上的 Nodejs:触发长服务器计算并避免超时
【发布时间】:2019-05-13 16:00:45
【问题描述】:

我在 Azure 上托管的 Nodejs 上有一个 webapp。 其中一种形式启动了一个非常长的、高度消耗 CPU 的计算,可能需要几分钟。 天真的标准实现在 4 分钟后超时并出现错误 500,默认 Azure 值。

为了避免这种情况,我实现了一个基于http://hungtran.co/long-polling-and-websockets-on-nodejs/的投票

在客户端我有一个 0 无限超时的 AJAX 调用:

$("#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)
})

并且计算部分被设计为在 somethingSuperLongAsync() 工作时不保留请求:

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 时,客户端在 /legs/messages 上订阅服务器,将表单发布到 /optim,并在完成后接收结果。 然而,当进程花费超过 4 分钟时,ajax 调用仍然返回 500/timeout。

我怎样才能分叉长进程,以便它可以绕过超时?

谢谢

【问题讨论】:

    标签: node.js ajax azure timeout polling


    【解决方案1】:

    回复我自己:问题解决了切换到 WebSockets 而不是使用 Ajax 进行长轮询

    【讨论】:

      猜你喜欢
      • 2017-04-30
      • 2020-07-15
      • 1970-01-01
      • 2012-03-07
      • 2014-12-09
      • 2018-07-10
      • 2023-03-24
      • 2019-10-14
      • 1970-01-01
      相关资源
      最近更新 更多