【问题标题】:Can a worker send a message back to the producer工人可以向生产者发送消息吗
【发布时间】:2013-03-10 05:00:53
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: node.js queue message-queue worker job-queue


    【解决方案1】:

    您可以将 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);
        });
    });
    

    【讨论】:

    • 如何处理那些排队的任务@mher?我看到了 node-celery 文档,很难理解发生了什么。 node-celery 中的哪个函数使用消息并处理任务?
    【解决方案2】:

    您应该从专用队列中获取结果,然后将它们推送给用户。
    使用 celery 作为任务队列管理器和长轮询或套接字将操作结果返回给用户。
    在 nodeJS 应用程序中,您可以使用 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'
          });
        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-20
      • 2015-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-12
      • 2020-12-29
      • 2019-01-28
      相关资源
      最近更新 更多