如何设计可扩展的rpc调用监听器?

时间:2012-05-28 06:50:47

标签: node.js scalability xml-rpc json-rpc

我必须侦听rpc调用,将它们堆叠在某处,处理它们并回答。事情是,他们一到,就不会跑。响应是收到的每个rpc呼叫的ACK。 问题是我想以一种方式设计它,我可以让许多监​​听服务器在同一堆电话中写入,并在它们到来时堆积它们。

我的目标是尽可能多地收听电话。我该如何实现这个目标?

我的主要技术是Perl和node.js,但会使用任何开源软件来完成此任务。

1 个答案:

答案 0 :(得分:3)

听起来任何类型的工作队列都可以满足您的需求;我个人非常喜欢使用Redis来做这件事。由于Redis列表维护了插入顺序,因此您可以从侦听RPC调用的任意数量的Web服务器以及其他位置(在另一个进程中/在另一台计算机上,只是LPUSH将您的RPC调用信息发送到列表的末尾。我假设他们RPOP(或BRPOP)关闭并处理它们。

由于Node.js使用完全异步的IO,假设您没有在RPC侦听器中进行大量处理(也就是说,您只是在侦听请求,发送ACK并推送到Redis),我的猜测是否该节点非常高效。

除了使用Redis作为队列之外:如果你想确保在发生灾难性故障的情况下,作业不会丢失,你需要实现更多的逻辑;来自RPOPLPUSH文档:

  

模式:可靠的队列

     

Redis通常用作消息传递服务器来实现后台作业或其他类型的消息传递的处理   任务。通常会获得一种简单的队列形式,将值推入a   在生产者端列出,并在消费者中等待这个值   如果客户端更好,则使用RPOP(使用轮询)或BRPOP   由封锁行动服务。

     

然而在这种背景下获得了   队列不可靠,因为消息可能丢失,例如在这种情况下   存在网络问题或者消费者在之后崩溃   消息已收到,但仍在处理中。

     

RPOPLPUSH(或   BRPOPLPUSH用于阻止变体)提供了一种避免这种情况的方法   问题:消费者抓取消息并同时推送   它进入处理列表。它将使用LREM命令   消息发布后,从处理列表中删除消息   处理。

     

其他客户端可能会监控处理列表   留在那里太长时间的物品,并将推动那些定时   如果需要,可以将项目再次输入队列。