使用NodeJS排队Resque作业

4

我希望能够从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宝石,对于Node没有可比性的东西)。因此,我想从我的NodeJS服务启动Ruby作业。
到目前为止,我正在使用类似于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()
4个回答

4
我认为你应该使用: https://github.com/technoweenie/coffee-resque(虽然名字中有 coffee,但也适用于 JavaScript)看起来相当简单,并且可以更安全地避免意外结果、破坏性的更改等问题。

哦,哇,我确信这是 Resque 的实际端口(就像他们的文档所说)。谢谢。 - CamelCamelCamel
这是一个端口!我只需要查看源代码才意识到我错了两次。此外,似乎并没有为工作线程实际生成单独的线程。什么? - CamelCamelCamel
嗯,我猜你想要在Node.js中排队作业。而coffee-resque正是做这个的。 如果你只想要排队,为什么还要关心工作者呢? 显然,coffee-resque中的enqueue函数很简单,所以你可以直接复制它。我只是想指出,通过使用它,你可以确保如果resque格式发生变化,coffee-resque的更新将帮助你处理这个问题。 - Benja
从源代码来看,我没有仔细查看,Coffee-Resque 在服务器线程内创建工作进程,这完全与工作进程应该做的相反。那么只在 Redis 上排队就足够了吗?Resque 会处理清理工作吗? - CamelCamelCamel
如果你只想将作业加入队列,我相信coffee-resque不会创建任何工作者(否则这将是非常严重的错误)。 清理工作更可能由resque工作者完成。 尽管到目前为止,如果源代码看起来像是简单的加入队列,那么只需复制该代码并避免添加其他依赖项似乎也不错。 - Benja

2
你可以使用TaskRabbit的node-resque。 λ代码

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

1
为什么不设置一个触发作业的服务呢?虽然需要通过网络进行额外的跳转,但代码应该足够简单(例如参考http://www.sinatrarb.com/)。

你的意思是什么?在Ruby中创建一个路由,然后从Node发送ping请求吗? - CamelCamelCamel
精确来说,创建一个路由,当被调用时创建工作。 这不是一个很好的解决方案,但应该可以满足您的需求。 - Aaron Lee

0

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

这里有一篇文章,可能会帮助您入门。它还有一个链接到Heroku托管的演示,在那里您可以连接Redis实例并查看Resque队列和作业。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接