【问题标题】:RPC, IPC or something else? A multi-process architecture in NodeJSRPC、IPC 还是其他? NodeJS 中的多进程架构
【发布时间】:2020-05-17 23:54:05
【问题描述】:

我正在构思一个应用程序,它使用几个较小的程序来支持它。粗略的图像是:

  • 一个进程(可能会创建一些工作人员)处理 HTTP 和 WS
  • 处理通知队列的进程(发送电子邮件、推送等)
  • 通过 JSON-RPC 或其他方式公开 API 来处理聊天的另一个过程。

我想拆分我的进程以便更好地分配资源,并且如果其中一个进程由于错误而退出,它可以由主进程恢复。然而,似乎没有任何库或框架真正做到这一点——然而,我怀疑每个人都只是创建一个可以处理所有事情的单一进程,尤其是在多核/线程机器上。

虽然我知道我基本上可以使用child_process 来生成子进程,将主进程的 RPC 端口与它们通信,然后使用 JSON-RPC,但我想知道是否有更有效的方法。

有什么想法吗?提前致谢!

【问题讨论】:

    标签: node.js ipc rpc


    【解决方案1】:

    这听起来很像微服务架构。虽然 js 中有一些框架可以构建微服务,例如moleculer,但许多微服务实现与语言无关。事实上,亚马逊是最古老的微服务成功案例之一,它并没有为 Amazon.com 网站使用单一的编程语言或平台。 It is a mix of multiple servers in PHP, Java, Perl and even some C++.

    微服务架构的核心是 HTTP 反向代理前端。这可以是 Apache2 或 Nginx,也可以是更专业的东西,例如 HAProxy。当网络服务器以这种方式配置为代理微服务时,它们通常被称为“应用程序网关”。

    传统上,该架构是拥有前端模板渲染器(例如,一个简单的 PHP 网站),该渲染器从可以用任何语言编写的其他服务获取数据:

                                                               ┌───────────┐
                                                             .-│ Service 1 │
                             ┌─────────────┐                /  └───────────┘
    ┌─────────┐              │ Web Server/ │ ┌───────────┐-'   ┌───────────┐
    │ Browser │-- internet --│ Load        │-│ Front-end │-----│ Service 2 │
    └─────────┘              │ Balancer    │ └───────────┘-.   └───────────┘
                             └─────────────┘                \  ┌───────────┐
                    HTTP                                     '-│ Service 3 │
                                      HTTP/FastCGI             └───────────┘
                                                        HTTP/RPC/REST
                                                      Kafka/RabbitMQ etc.
    

    随着 CORS 的出现,Facebook 等服务越来越多地将大量后端服务直接暴露给网页:

                                ┌───────────────────┐
    ┌─────────┐              ---│ Static web server │
    │ Browser │-- internet -'   └───────────────────┘ ┌───────────┐
    └─────────┘            \         ┌─────────────┐  │ Service 1 │ services
                            \        │ Web Server/ │--└───────────┘ on same
    React/Angular/Vue        \-------│ Load        │  ┌───────────┐ server
      front-end               \      │ Balancer    │--│ Service 2 │
                               \     └─────────────┘  └───────────┘
                                \                  HTTP
                      HTTP+CORS  \
                       (ajax)     \               ┌───────────┐ service on
                                   '--------------│ Service 3 │ separate
                                                  └───────────┘ server
    

    为此,网页和服务之间的通信仅限于 HTTP 和 Websocket,因此后端服务需要是 HTTP 服务(REST/json-RPC/SOAP 等)。

    服务监控和重启通常使用专门的服务监控和重启机制来完成。对于 node.js,一个流行的崩溃检测和重启软件是 PM2forever 但是还有其他通用软件,例如 monit。事实上,并不要求所有服务都使用相同的重启系统(例如,亚马逊允许每个功能由不同的团队开发并按照团队认为合适的方式进行部署)。

    如果您仔细设计会话系统(粘性会话、JWT 令牌等),您可以通过运行更多服务器来扩展后端。例如,如果聊天占用大量资源,只需运行 3 或 4 个聊天服务器,而只运行一个前端服务器。

    【讨论】:

    • 非常感谢您的回答!我将关注各种链接和可能的研究点,这可能会引导我找到我需要的解决方案。另外,我非常感谢(ASCII-)图表!
    【解决方案2】:

    但是,似乎没有任何库或框架真正做到这一点

    它们有很多,它们只是不是 Node.JS 简单的程序。 IE。您将需要一些高性能的队列持久性,这可能会涉及另一个进程。

    单独的耦合是有意义的,但您需要持久的消息传递架构 - 这在大型系统中就像 40 年左右的完全标准。

    我建议你考虑一下你想在什么平台上运行,然后按照站点规则的要求进行一些研发。在这种情况下,您的平台选择太窄而没有意义。消息传递是必须的(即您可以在电子邮件服务关闭时对电子邮件进行排队)。

    【讨论】:

      猜你喜欢
      • 2013-08-27
      • 2012-04-28
      • 1970-01-01
      • 2011-09-28
      • 1970-01-01
      • 1970-01-01
      • 2018-11-19
      • 2018-11-06
      • 2011-02-22
      相关资源
      最近更新 更多