代码之家  ›  专栏  ›  技术社区  ›  Ingwie Phoenix

RPC、IPC还是别的什么?NodeJS中的多进程架构

  •  0
  • Ingwie Phoenix  · 技术社区  · 4 年前

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

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

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

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

    知道吗?提前感谢!

    1 回复  |  直到 4 年前
        1
  •  1
  •   slebetman    4 年前

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

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

    传统上,该架构采用前端模板呈现器(例如,一个简单的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,一个流行的崩溃检测和重启软件是 PM2 forever 然而,还有其他通用软件可用于此,例如 monit 事实上,并没有要求所有服务都使用相同的重启系统(例如,亚马逊允许每个功能由不同的团队开发,并按照团队认为合适的方式部署)。

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

        2
  •  1
  •   TomTom    4 年前

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

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

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

    我建议你考虑一下你想在哪个平台上运行,然后做一些R&D也符合现场规则的要求。在这种情况下,你的平台选择太简单了,没有意义。消息传递是必须的(这样你就可以在电子邮件服务关闭时对电子邮件进行排队)。