【问题标题】:Meteor DDP Call returns undefined when too longMeteor DDP 调用过长时返回未定义
【发布时间】:2019-11-07 10:57:57
【问题描述】:

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

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

当我调用服务器 2 的函数需要很长时间才能回答时,当服务器 2 回答好的结果时,服务器 1 收到 undefined。但是,如果server2的函数响应时间少于1分钟,则server 1得到server 2发送的结果,然后将其发送回客户端。

为什么它不适用于计算时间超过 1 分钟的函数?

客户:

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

服务器 1:

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();
};

服务器 2:

Meteor.methods({
    'reporting.clientsAssets'(callId, params) {
        this.unblock();
        const funcName = "reporting.clientsAssets";
        if (canRunQuery(1, callId, arguments, funcName)) {
            console.log(funcName + ": START");
            const data = reportingClientsAssets(params);
            console.log(funcName + ": END");
            terminateQuery(callId);
            return data;
        }
    }
});

【问题讨论】:

    标签: meteor promise callback ddp


    【解决方案1】:

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

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

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

    当该函数完成时,它会将任务的状态设置为“完成”。

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

    这种机制没有超时问题,并且很好地解耦了。

    【讨论】:

    • 我已经考虑过这种解决方案。但是,它没有解释为什么服务器 1 收到 undefined。我的意思是,服务器 1 等到服务器 2 回答,即使需要 3 分钟......
    猜你喜欢
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    • 2015-10-29
    • 2018-02-20
    • 1970-01-01
    相关资源
    最近更新 更多