Ruby 从NodeJS队列重新创建作业
我想对来自NodeJS的Resque作业进行排队。监视我看到的Redis命令:Ruby 从NodeJS队列重新创建作业,ruby,ruby-on-rails-3,node.js,redis,resque,Ruby,Ruby On Rails 3,Node.js,Redis,Resque,我想对来自NodeJS的Resque作业进行排队。监视我看到的Redis命令: 1346127083.495055 "sadd" "resque:w:tasks:queues" "facebook" 1346127083.495471 "rpush" "resque:w:tasks:queue:facebook" "{\"class\":\"Hello::FacebookFriends\",\"args\":[\"2342324\"]}" 直接从节点发出这些命令似乎有效。这里有我不知道的隐藏的
1346127083.495055 "sadd" "resque:w:tasks:queues" "facebook"
1346127083.495471 "rpush" "resque:w:tasks:queue:facebook" "{\"class\":\"Hello::FacebookFriends\",\"args\":[\"2342324\"]}"
直接从节点发出这些命令似乎有效。这里有我不知道的隐藏的bug或东西吗
更新:我的作业是用Ruby编写的。虽然我喜欢NodeJS,而且我在Javascript方面做得更好,但我需要大量在NPM环境下仍然不可用的库,例如与Twitter和Facebook通信(Twitter和koalagems,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 || []
在这里:
我认为你应该使用:
(名字上写着咖啡,但你也可以将它与javascript一起使用)
看起来也很简单,而且对于意外结果、中断更改等,您会更安全一些。为什么不设置一个触发作业的服务呢?这将是一个额外的网络跳跃,但代码应该足够简单(例如,请看)。您可以使用TaskRabbit的库来完成此操作
下面是一个可能会帮助您开始的示例。它还有一个指向Heroku上托管的演示的链接,您可以在其中连接Redis实例,并查看重新设置队列和作业。您可以使用TaskRabbit中的节点重新设置 Lambda代码
const NodeResque=require('node-resque')
const connectionDetails={
包装:“ioredis”,
主机:“redis主机”,
港口:6379
}
const queue=new NodeResque.queue({
连接:connectionDetails
})
queue.on('error',函数(error){
console.log(错误)
})
等待队列。连接()
等待队列。排队('queue_name','WorkerClassName',['arg1','arg2',…])
wait queue.end()
哦,哇,我确信这是一个实际的Resque端口(就像他们的文档所说的)。谢谢,这是一个港口!我只要看看源代码就知道我错了。而且,为工作人员实际生成单独的线程似乎并不正确,我在这里可能错了。什么,我想你想让作业从Node.js排队。而咖啡清酒正是这样做的。如果你只是想排队,为什么你关心工人?显然,coffee resque中的排队函数很简单,所以您可以复制它。我只是指出,通过使用它,您可以安全地看到,如果对resque格式进行了更改,那么coffee resque更新将为您处理此问题。从源代码来看,我没有仔细查看,coffee resque在服务器线程内创建了worker,这与worker应该做的完全相反。那么在Redis上排队就足够了?Resque将负责清理工作?如果你只是想让工作排队,我相信coffee Resque不会产生任何工人(或者这将是一个非常糟糕的错误)。而且清理工作更可能由清理工人来完成。尽管到目前为止,如果源代码看起来排队就这么简单,我想复制代码并避免添加另一个依赖项听起来也不错。你是什么意思?在ruby中创建一个路由,然后从节点ping它?确切地说,创建一个路由,在调用时创建作业。这不是一个很好的解决方案,但它应该满足您的需要。
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()