Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何设计可伸缩的rpc调用侦听器?_Node.js_Scalability_Xml Rpc_Json Rpc - Fatal编程技术网

Node.js 如何设计可伸缩的rpc调用侦听器?

Node.js 如何设计可伸缩的rpc调用侦听器?,node.js,scalability,xml-rpc,json-rpc,Node.js,Scalability,Xml Rpc,Json Rpc,我必须监听rpc调用,将它们堆叠在某个地方,处理它们,然后应答。问题是,他们一到就不跑。响应是接收到的每个rpc调用的ACK。 问题是,我想设计一种方式,让许多侦听服务器在同一个调用堆栈中编写调用,并在调用时将它们堆积起来 我的目标是尽可能多地接听电话。我应该如何做到这一点 我的主要技术是Perl和node.js,但我会使用任何开源软件来完成这项任务。听起来任何类型的作业队列都能满足您的需要;我个人非常喜欢用它来做这类事情。由于Redis列表保持插入顺序,因此您只需将您的RPC调用信息从侦听RP

我必须监听rpc调用,将它们堆叠在某个地方,处理它们,然后应答。问题是,他们一到就不跑。响应是接收到的每个rpc调用的ACK。 问题是,我想设计一种方式,让许多侦听服务器在同一个调用堆栈中编写调用,并在调用时将它们堆积起来

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


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

听起来任何类型的作业队列都能满足您的需要;我个人非常喜欢用它来做这类事情。由于Redis列表保持插入顺序,因此您只需将您的RPC调用信息从侦听RPC调用的任意数量的web服务器发送到列表的末尾,然后发送到其他地方(我假设是在另一个进程/另一台机器上)(或)关闭并处理它们

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

使用Redis作为队列的旁白:如果您想确保在发生灾难性故障时不会丢失作业,则需要实现更多的逻辑;从文件中:

模式:可靠队列

Redis通常用作消息服务器,以实现后台作业或其他类型消息的处理 任务。一种简单的队列形式通常是将值推入 在生产者侧列出,并在消费者侧等待此值 在客户端使用RPOP(使用轮询)或BRPOP(如果客户端更好) 由阻塞操作提供服务

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

RPOPLPPUSH(或 BRPOPLPUSH(针对阻塞变量)提供了一种避免这种情况的方法 问题:消费者获取消息,同时推送消息 将其转换为处理列表。它将使用LREM命令 一旦收到消息,请从处理列表中删除该消息 已处理

另一个客户端可以监视处理列表中的 在那里停留时间太长的项目,并将推送这些项目 如果需要,将项目再次移出队列


因此,模式是从实际处理消息的服务器请求RPOPLPPUSH,但是其他列表会发生什么?它是否在完成后被销毁?RPOPLPPUSH只是一种确保在工作人员崩溃时,您可以稍后发现并重新处理失败的作业的方法。如果作业成功,并且您从临时列表中删除了该项,它将自动消失(Redis中的所有列表也是如此)。因此,如果队列中的每个项目都被消耗,列表将消失,BRPOP将阻塞,直到一个新项目被推到列表上(然后重新创建列表)。下面是关于该模式的一个很好的说明:您的答案还解决了另一个问题,“正在处理”问题。谢谢