如何devise一个可扩展的RPC呼叫监听器?

我必须听rpc电话,把它们堆在某个地方,处理它们,然后回答。 事情是,他们没有尽快运行。 响应是每个接收到的rpc呼叫的ACK。 问题是,我想要devise一个方法,我可以让许多监​​听服务器在同一个调用堆栈中写入数据,并在它们到来时将它们堆叠起来。

我的目标是听尽可能多的电话。 我应该如何做到这一点?

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

       

网上收集的解决方案 "如何devise一个可扩展的RPC呼叫监听器?"

这听起来像任何一种工作队伍将做你需要的东西; 我个人很喜欢使用Redis来做这种事情。 由于Redis列表维护插入顺序,因此您可以简单地将RPC调用信息从任意数量的监听RPC调用的Web服务器以及其他位置(在另一个进程/另一台计算机上,我假设)监听到列表的末尾。 (或BRPOP )它们并处理它们。

由于Node.js使用完全asynchronous的IO,假设你没有在你的RPC监听器中做很多处理(也就是说,你只是在监听请求,发送一个ACK,并推送到Redis),我的猜测是Node在这方面会非常有效率。

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

模式:可靠的队列

Redis通常用作消息传递服务器来实现后台作业或其他types消息传递任务的处理。 一个简单的队列forms通常是通过将值推入生产者端的列表中,然后使用RPOP(使用轮询)或BRPOP(如果客户端由阻塞操作更好地服务)来等待消费者端的值。

然而,在这种情况下,所获得的队列是不可靠的,因为消息可能丢失,例如在存在networking问题的情况下或消费者在收到消息之后崩溃但仍然处理。

RPOPLPUSH(或阻塞变体的BRPOPLPUSH)提供了一种避免此问题的方法:消费者获取消息并同时将其推入处理列表。 一旦消息已经被处理,它将使用LREM命令来从处理列表中删除消息。

额外的客户端可以监视处理列表中保留的项目太多的时间,并且如果需要的话将会将那些超时的项目再次推入队列中。