【问题标题】:Queue Resque Jobs from NodeJS来自 NodeJS 的队列 Resque 作业
【发布时间】:2012-08-22 13:45:42
【问题描述】:

我想从 NodeJS 排队 Resque 作业。监控我看到的 Redis 命令:

1346127083.495055 "sadd" "resque:w:tasks:queues" "facebook"
1346127083.495471 "rpush" "resque:w:tasks:queue:facebook" "{\"class\":\"Hello::FacebookFriends\",\"args\":[\"2342324\"]}"

直接从 Node 发出这些命令似乎有效。这里是否有任何隐藏的错误或我不知道的事情?

更新:我的工作是用 Ruby 编写的。虽然我喜欢 NodeJS 并且我在 Javascript 方面做得更好,但我需要大量在 NPM 中仍然无法正常使用的库,例如与 Twitter 和 Facebook 通信(Twitter 和 Koala gems,Node 没有可比性)。所以我想从我的 NodeJS 服务启动 Ruby Jobs。

到目前为止,我使用的东西看起来类似于 coffee-resque 中的这个函数:

 enqueue: (queue, func, args) ->
    @redis.sadd  @key('queues'), queue
    @redis.rpush @key('queue', queue),
      JSON.stringify class: func, args: args || []

这里:

job = JSON.stringify
    class: 'Hello::FacebookFriends'
    args: [user_id, fb.id]
@redis_client.multi()
    .sadd('resque:w:tasks:queues', 'facebook')
    .rpush('resque:w:tasks:queue:facebook', job)
    .exec()

【问题讨论】:

    标签: ruby ruby-on-rails-3 node.js redis resque


    【解决方案1】:

    我认为你应该使用:https://github.com/technoweenie/coffee-resque

    (名字是咖啡,但你也可以用 javascript 来使用它) 看起来也很简单,而且您会更安全地应对意外结果、重大更改等。

    【讨论】:

    • 哦,哇,我确定它是 Resque 的实际端口(就像他们的文档说的那样)。谢谢。
    • 这是一个港口!我只需要查看源代码就意识到我错了。此外,实际上为工作人员生成单独的线程似乎并不,而且我在这里可能错了。什么。
    • 好吧,我想您想将作业从 Node.js 中排入队列。而coffee-resque 就是这样做的。如果你只是想排队,你为什么要关心工人?显然,coffee-resque 中的 enqueue 函数很简单,所以你可以复制它。我只是指出,使用它是安全的,如果完成 resque 格式的更改,coffee-resque 更新将为您处理。
    • 从源代码来看,我没有仔细看,Coffee-Resque 在服务器线程中创建工作线程,这与工作线程应该做的完全相反。那么仅仅在 Redis 上排队就足够了吗? Resque 会负责清理工作吗?
    • 如果你只是想将工作排入队列,我敢肯定coffee-resque 不会创建任何工人(或者这将是一个非常糟糕的错误)。是的,清理工作更有可能由 resque 工人完成。虽然到目前为止,如果源代码看起来像入队那么简单,我想只复制该代码并避免添加另一个依赖项听起来不错。
    【解决方案2】:

    你可以使用 TaskRabbit 的 node-resque

    Lambda 代码

    const NodeResque = require('node-resque')
    const connectionDetails = {
      pkg: 'ioredis',
      host: 'redis host',
      port: 6379
    }
    const queue = new NodeResque.Queue({
      connection: connectionDetails
    })
    queue.on('error', function(error) {
      console.log(error)
    })
    await queue.connect()
    await queue.enqueue('queue_name', 'WorkerClassName', ['arg1', 'arg2', ..])
    await queue.end()

    用于处理任务的 Rails 工作人员代码

    class WorkerClassName
        @queue = :queue_name
        def self.perform(arg1, arg2, arg3)
            # Logic
        end
    end
    

    【讨论】:

      【解决方案3】:

      为什么不设置一个可以触发工作的服务呢?这将是通过网络的额外一跳,但代码应该足够简单(例如查看http://www.sinatrarb.com/)。

      【讨论】:

      • 什么意思?在 ruby​​ 中创建一个路由,然后从 Node ping 它?
      • 准确地说,创建一个路由,在调用时创建作业。这不是一个很好的解决方案,但它应该可以满足您的需求。
      【解决方案4】:

      您可以使用 TaskRabbit 的 node-resque 库来执行此操作。

      这里有一个an article,可以帮助您入门。它还有一个指向 Heroku 上托管的演示的链接,您可以在其中连接您的 Redis 实例并查看您的 Resque 队列和作业。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-02
        • 2011-10-28
        • 2012-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多