2

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

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

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

4

1 回答 1

3

听起来任何类型的作业队列都可以满足您的需要;我个人非常喜欢将Redis用于此类事情。由于 Redis 列表维护插入顺序,您可以简单地您的 RPC 调用信息从任意数量的 Web 服务器侦听 RPC 调用,以及其他地方(在另一个进程/另一台机器上,我假设)RPOP(或BRPOP)关闭并处理它们。

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

将 Redis 用于队列:如果要确保在发生灾难性故障时不会丢失作业,则需要实现更多逻辑;来自RPOPLPUSH文档:

模式:可靠队列

Redis 通常用作消息传递服务器,以实现处理后台作业或其他类型的消息传递任务。一种简单的队列形式通常是在生产者端将值推送到一个列表中,并在消费者端使用 RPOP(使用轮询)或 BRPOP 等待这个值,如果客户端通过阻塞操作得到更好的服务。

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

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

额外的客户端可能会监视处理列表中停留时间过长的项目,并在需要时将那些超时的项目再次推送到队列中。

于 2012-05-28T07:30:24.150 回答