流星DDP调用时间过长将返回未定义

时间:2019-06-25 14:55:10

标签: meteor promise callback ddp

我有两台服务器,一台用于主应用程序,另一台用于大型任务。

onLangChange = (lang) => {
        this.setState({ lang });
        counterpart.setLocale(lang);
    }

当我调用需要较长时间回答的服务器2的函数时,当服务器2回答良好结果时,服务器1收到未定义的消息。但是,如果server2的功能需要不到1分钟的时间回答,则服务器1得到了服务器2发送的结果,然后将其发送回客户端。

为什么它仅对需要花费1分钟以上的时间计算的函数不起作用?

客户:

User -> Server 1 -> Server 2
Server 1: Main app & Easy tasks
Server 2: Huge Tasks

服务器1:

Meteor.call('reporting.default', params.subReport, params, function(error, result) {
    if (result) self.setState({data: result});
    else self.setState({data: error.message});
});

服务器2:

Meteor.methods({
    'reporting.default'(subReport, params) {
        this.unblock();
        return Meteor.callWorker('reporting.' + subReport, Meteor.callId(), params).then((result, error) => { if (error) return error; else return result; }).await();
    },
});

Meteor.worker = DDP.connect('localhost:' + Meteor.settings.heavyTasksServer.port);
Meteor.callWorker = (method, ...myParameters) => new Promise((resolve, reject) => {
    console.log(method + ": REQUEST");
    Meteor.worker.call(method, ...myParameters, (err, res) => {
        if (err) {
            console.log(method + ": ERROR");
            reject(err);
        }
        else {
            console.log(method + ": ANSWER");
            resolve(res);
        }
    });
});

Meteor.callId = function () {
    const d =new Date();
    return d.getUTCFullYear() +""+ (d.getUTCMonth()+1) +""+ d.getUTCDate() +""+ d.getUTCHours() +""+ d.getUTCMinutes() +""+ d.getUTCSeconds() +""+ d.getUTCMilliseconds() + "-" + Meteor.userId();
};

1 个答案:

答案 0 :(得分:0)

您可以考虑使用异步模型而不是同步模型(这可能会超时)。

让我们考虑一种排队机制...创建一个集合,调用作业(或您喜欢的任何内容),服务器1在作业集合中创建状态为“就绪”的记录。

定时任务(您可以使用node-cron进行)在服务器2上每分钟运行一次,并查找状态为“就绪”的作业。它需要第一个,将状态设置为“正在运行”,然后调用该函数来完成工作。

该功能完成后,它将任务状态设置为“完成”。

您可以利用Meteor的反应性,以便用户可以看到作业的状态,一旦开始,它将移至“正在运行”,然后移至“完成”。此时,可能会出现一个链接,以便他们可以访问数据,报告或生成的任何内容。

此机制没有超时问题,并且可以很好地分离。