设计多线程架构

什么是多线程?

多线程是程序同时执行多个任务的能力。多线程是一个编程语言术语,源自多任务处理的概念。当我们想将工作分成几个独立的部分时,就会使用它。它允许同时执行程序的多个部分。这些部件称为螺纹,是工艺中可用的轻量级工艺。这些线程是以更好的方式利用系统内存和资源以确保高性能的单个进程。Node.js 不支持多线程。因此,Node.js 与许多其他高级语言中的传统多线程有不同的实现方式。

我们什么时候需要多线程?

当您想要执行一系列复杂的操作(从数据库中获取记录、图像处理、API 请求等)时,无论它们的顺序、优先级和响应如何,您都必须考虑对应用程序使用多线程。单线程架构在处理性能、内存和资源利用率时有许多限制。当您想将任务的一部分推迟到其他进程并继续执行主应用程序时,您应该考虑多线程架构。

如何在NodeJs中创建多线程架构?

Node.js 是一种单线程编程语言。单线程意味着在同一进程中任何时候都只执行一组指令。但是 Node.js 使用多个线程在后台执行异步代码。但这并不能帮助我们在多个线程中实时执行我们的应用程序。

在 NodeJs 中,多线程可以通过树不同的机制来实现。

  • 多级架构 – 多个独立的进程通过套接字进行通信。
  • 集群架构 – 主分支共享同一端口的多个子进程,并通过 IPC 进行通信。
  • 工作线程架构 – 单个进程创建多个线程,每个线程都有自己的 Node 实例、事件循环,并且它们都共享内存。

让我们借助一个非常实时的例子来更深入地了解它们中的每一个。让我们以一个证券交易所应用程序为例,其中要求您获取有关实时交易的信息,并为特定股票创建一个 15 分钟的蜡烛图/条形图。
对于此应用程序,我们将尝试使用上面列出的每种方法创建一个体系结构。

多级架构

当您想在后台延迟和执行某些任务时,您可以选择多级架构。在这里,您将创建多个 Node 进程来达到目的,其中一个将是主处理器,或者在技术术语中,您可以将其称为服务器,其他进程是从属进程或子进程,或者在技术术语中,您可以称它们为客户端。每个进程都有自己的 V8 引擎实例、事件循环和内存。

当您创建服务器和客户端时,它们将借助套接字建立一个通信通道,它们可以在其中相互交换消息。在这里,服务器将是应用程序的主线程,所有客户端都在帮助您的主线程以高效、快速的方式执行复杂的操作。此体系结构将帮助您在后台执行耗时的复杂操作,并继续实现主要目的。

现在让我们以证券交易所应用为例。

我们知道交易应用程序拥有数百万用户,因此在单个线程或进程的帮助下处理所有内容会导致性能问题。众所周知,更快的响应时间是此类应用的关键要求。在这里,您将创建一个服务器,该服务器将作为主线程,为应用程序的每个请求提供服务。应用程序的主线程负责处理来自数百万用户的许多不同请求。为了获得更快的性能,主线程应将一些繁重的操作推迟到其他进程。现在,我们必须确定复杂且耗时的任务,这些任务可以在后台执行并推迟到其他进程。在这种特殊情况下,我们可以创建一个单独的流程来从系统数据库或某些 API 中获取实时交易,并创建 15 分钟的条形图。一旦交易开始,子进程开始读取实时交易,创建一个间隔为 15 分钟的柱并将其发送到服务器。然后,服务器将这些柱线发送到为其请求的客户端(在本例中为浏览器)。

Github链接: https://github.com/sandysalunke/multithreaded-architecture

让我们借助一个简单的架构图来理解这一点。

设计多线程架构_第1张图片

Dig #1 – 多层架构

集群架构

Node.js 的单个实例在单个线程中运行。为了利用多核系统,用户有时需要启动一个 Node.js 进程集群来处理负载。
– Node.js 文档

群集是指在所有共享服务器端口的主进程之间创建子进程的概念。工作进程和主进程之间的通信通过IPC(进程间通信)进行。通过创建一个集群池,我们可以轻松地在不同的子进程之间分配负载。集群架构用于加快程序的执行速度,并确保在复杂操作的情况下实现高性能。这有助于主进程轻松地在其预定义的子进程集之间分配负载。

每个 Node(分叉)进程都有自己的 V8 实例、事件循环和内存。群集中的所有进程都可以共享服务器端口,但它们实际上并不共享任何状态,并且它们不共享事件循环。

与多级架构相比,集群架构以非常有效的方式管理流程。在这里,我们不必手动创建子进程,我们可以很容易地分叉多个子进程,以更好地利用 CPU 的核心能力和资源。任何被终止的进程都可以很容易地被新进程替换,以确保高性能。

子进程可以执行所需的任务,并将结果报告给主进程。这样,master 可以将传入的不同请求推迟到其子进程,并在获得子进程的结果后将响应发送回请求客户端。具有 10 个子进程的集群架构可以同时执行 10 个操作,这将有助于提高系统的性能。

现在让我们以证券交易所应用为例。

我们可以创建主进程来处理到达应用程序的所有请求,并创建多个子进程(集群)来分配负载。假设有多个客户要求提供不同股票的条形图。我们可以创建一个子进程集群来满足这些不同的请求。集群架构可以与多级架构相结合,以获得更好的可扩展性。

注意:Node.js 库核心集中的内置“集群”模块可用于创建集群池。

让我们借助一个简单的架构图来理解这一点。设计多线程架构_第2张图片

挖。#2 – 集群架构

Worker 线程架构

NodeJS 可以 不支持多线程。因此,Node.js 工作线程的行为是 与许多其他高级中的传统多线程方式不同 语言。在 Node.js 中,工作线程的职责是执行一段代码 (worker 脚本)由父 worker 提供。然后,工作器脚本将运行 与其他工作线程隔离,能够在其之间传递消息 和父员工。

每 worker 通过 IPC 消息通道连接到其父 worker。消息通道是简单的通信 渠道。它有两端,称为“端口”。在 NodeJS 术语中,消息通道的两端是 只需调用“port1”和“port2”。

在 Node.js,每个工作线程都有自己的 V8 实例和事件循环。然而 与子进程不同,Worker 可以共享内存。NodeJS v10.5 引入了 内置库以支持“工作线程”。

工作线程被发现可以通过在工作线程池中分配负载来提高应用程序的性能。工作线程比进程轻量级,因此它们的性能比集群更好,并且它们还共享父线程的内存。但我们需要记住,尽管工作线程比实际进程轻量级,但生成工作线程涉及一些严肃的工作,如果频繁进行,可能会很昂贵。但这可以通过创建一个工作线程池来解决,以便任何传入的请求都可以传递到下一个可用的工作线程。也不建议使用工作线程来执行密集的 I/O 操作。

现在让我们以证券交易所应用为例。

我们可以创建一个应用程序服务器和多个工作线程来服务器来自数百万用户的请求。到达服务器的每个新请求都可以路由到下一个可用的工作线程。工作线程可以从数据库/API 中获取所需的信息(在本例中为交易)并执行一些业务逻辑(创建一个 15 分钟的柱线),然后一旦完成所需的任务,它就会将响应发送回其父线程。

让我们借助一个简单的架构图来理解这一点。设计多线程架构_第3张图片

Dig #3 – Worker 线程架构

现在你可能会认为上述三种架构方法看起来都是一样的,我同意它们确实如此,但它们实际上确实通过它们的实现、通信、优点、缺点和性能来推迟。根据应用程序的业务和技术要求,您需要选择适当的方法来设计系统架构。

在下一篇文章中,我将让您深入了解这些方法中的每一种,以便您可以自己实际设计合适的架构。

 


如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力! 

 

你可能感兴趣的:(Node.js,node.js,前端框架,前端)