我有一个具有以下情况的NodeJS应用程序:我收到用户的请求,要求计算需要使用非常复杂的数学公式的东西。目前,我在那一刻运行整个过程,计算出值,然后将其发送回用户。不幸的是,这不是非常异步友好的:)
我想要做的是在后台运行整个操作,一旦任务完成,工作人员会回复给我任何计算值,然后我将其发回给用户。
我一直在查看各种工作队列,包括Kue,Celery,Resque和Beanstalk,但它们似乎都没有提供此功能。它们非常适合发送电子邮件或运行任何不需要获得某种价值的工作,只是一个简单的成功与否,但似乎没有任何东西允许worker实际上将自定义消息发送回创建该任务的原始生成器。
上述队列中没有一个支持这个,我说错了吗?如果是这样,请指出我可以在文档中学习如何使用此功能。否则,你能指点我支持这项功能的其他人吗?
答案 0 :(得分:1)
您应该从专用队列中获取结果,然后将其推送给用户
使用celery作为任务队列管理器和长轮询或套接字,以便将操作结果返回给用户
在nodeJS app中,您可以使用node-celery https://github.com/mher/node-celery或直接在celery预留队列中插入消息
例如
var amqp = require('amqp');
var connection = amqp.createConnection({
host: 'localhost',
port: 5672
});
connection.on('ready',function(){
connection.publish('celery', {id:uuid.v4(), task:'yourapp.tasks.usefultask', args:['firstArg','secondArg'], kwargs:{}},{
'contentType': 'application/json'
});
});
答案 1 :(得分:0)
您可以将Celery与https://github.com/mher/node-celery
一起使用node-celery允许对任务进行排队并接收执行结果
var celery = require('node-celery'),
client = celery.createClient({
CELERY_BROKER_URL: 'amqp://guest:guest@localhost:5672//',
CELERY_RESULT_BACKEND: 'amqp'
});
client.on('connect', function() {
client.call('factorial', [1000000], function(result) {
console.log(result);
});
});