我有两台服务器,一台用于主应用程序,另一台用于大型任务。
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();
};
答案 0 :(得分:0)
您可以考虑使用异步模型而不是同步模型(这可能会超时)。
让我们考虑一种排队机制...创建一个集合,调用作业(或您喜欢的任何内容),服务器1在作业集合中创建状态为“就绪”的记录。
定时任务(您可以使用node-cron进行)在服务器2上每分钟运行一次,并查找状态为“就绪”的作业。它需要第一个,将状态设置为“正在运行”,然后调用该函数来完成工作。
该功能完成后,它将任务状态设置为“完成”。
您可以利用Meteor的反应性,以便用户可以看到作业的状态,一旦开始,它将移至“正在运行”,然后移至“完成”。此时,可能会出现一个链接,以便他们可以访问数据,报告或生成的任何内容。
此机制没有超时问题,并且可以很好地分离。