【发布时间】: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