微服务是多进程还是多线程?

91 阅读3分钟

这是一个十分显然的问题,不过背后还是体现了系统设计上的思考,以及设计操作系统底层的原理

从定义入手

要回答这个问题,需要从微服务架构的定义入手。

微服务的核心定义就是独立性。

什么是独立性?其实就是每个服务都是一个独立的业务单元,不依赖其它组件。要做到这一点,就需要做到一个服务从的部署、升级、重启,能够与其它服务独立。而多线程能否满足这一需求?答案显然是否定的。

首先,多线程的部署是紧耦合的。每个单独的线程没法独立于其它线程进行部署。

其次,多线程的运行时环境是共享的,对于线程来说,仅有栈内存是独立的。

再者,一个线程的严重错误(如内存越界),会导致整个进程的崩溃,从而影响其他服务。

最后,同一个线程很难做到技术栈的隔离。

因此,答案是显而易见的,微服务架构必须是多进程架构

本质

其实回答这个问题,本质上是在回答另一个问题:多进程和多线程之间的主要区别是什么?

主要可以从以下四个方面来总结

  • 内存空间
  • 资源消耗
  • 通信方式
  • 并行性能

内存空间

我们都知道进程之间的内存空间是相互隔离的,而线程间共享数据段、文本段、代码段和堆段,只有栈段是相互独立的。这就导致了一个线程崩溃时,会直接波及其它线程,导致整个程序进入不可用状态。

资源消耗

对于操作系统来说,创建进程的开销远远高于创建线程的开销。因为操作系统需要为每个进程分配独立的内存空间、文件描述符、寄存器状态、代码段、数据段等资源。而创建线程的开销就小很多,因为它们共享大部分进程资源,只需分配独立的栈和寄存器。

同时,在线程间切换的资源消耗也远小于在进程间切换。

通信方式

进程间的通信(IPC)较为复杂,需要使用管道、共享内存、消息队列、信号量、Socket等,而线程间的通信十分直接,因为它们可以访问相同的内存空间,但也需要通过同步机制(信号量、互斥锁等)来进行。

并行性能

对于操作系统,多个进程更容易被分配至不同的CPU核心中运行,而多线程也可以利用多核性能。虽然多线程更有优势,但并不明显。

总的来说,进程和线程的区别就是这些。微服务架构本质上是牺牲小部分性能(仅在极端业务中能够体现),来提升分布式系统的健壮性,利于整体的维护和使用,也具备更强的容错率(一个服务崩溃不至于波及其它服务)。