2

我有一个具有以下情况的 NodeJS 应用程序:我收到用户的请求,要求计算需要使用非常复杂的数学公式的东西。目前,我在那一刻运行整个过程,找出值,然后将其发送回用户。不幸的是,这不是很异步友好:)

相反,我想做的是在后台运行整个操作,一旦任务完成,工作人员就会返回给我计算的值是什么,然后我将其发回给用户。

我一直在查看各种工作队列,包括KueCeleryResqueBeanstalk,但似乎没有一个提供此功能。它们非常适合发送电子邮件或运行不需要接收某种价值的任何类型的工作,只是简单地说它是否成功,但似乎没有任何东西允许worker 将自定义消息实际发送回创建任务的原始生产者。

我说上述队列都不支持这一点是错的吗?如果是这样,请指出我可以在文档中了解如何使用此功能的位置。否则,您能否指出任何其他支持此功能的人?

4

2 回答 2

1

You should fetch results from a dedicated queue and then push them to user.
Use celery as tasks queue manager and long-polling or socket for return result of operations to user.
From nodeJS app you can use node-celery https://github.com/mher/node-celery or insert messages directly in the celery reserved queue.
eg

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'
      });
    });
于 2013-09-29T03:02:47.453 回答
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);
    });
});
于 2013-06-24T16:19:55.513 回答