【问题标题】:How to design a scalable rpc call listener?如何设计一个可扩展的 rpc 调用监听器?
【发布时间】:2023-03-03 16:03:02
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    模式:可靠队列

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

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

    RPOPLPUSH(或 BRPOPLPUSH 用于阻止变体)提供了一种避免这种情况的方法 问题:消费者获取消息同时推送 将其放入处理列表中。它将使用 LREM 命令以 一旦消息已被从处理列表中删除 已处理。

    另一个客户端可能会监控处理列表 在那里停留太久的项目,并且会推动那些定时的项目 如果需要,再次将项目取出到队列中。

    【讨论】:

    • 因此,该模式是关于从实际处理消息的服务器请求 RPOPLPUSH,但是其他列表会发生什么?完成后会被销毁吗?
    • RPOPLPUSH 只是一种确保,如果工作人员崩溃,您可以稍后发现并重新处理失败的作业。如果作业成功,并且您从临时列表中删除该项目,它会自动消失(就像 Redis 中的所有列表一样)。因此,如果队列中的每个项目都被消耗掉,则列表将消失,并且 BRPOP 将阻塞,直到将新项目推入列表(然后重新创建列表)。
    • 这里有一篇关于模式 SO 的精彩文章:stackoverflow.com/a/8555671/62082
    • 您的回答还解决了另一个问题,即“正在处理”问题。谢谢。
    猜你喜欢
    • 2016-02-12
    • 2021-11-17
    • 1970-01-01
    • 2013-11-30
    • 2011-02-16
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多