背景
随着业务的发展,单个服务器可能无法满足日益增长的计算和存储需求。通过远程服务调用,可以将不同的功能模块部署在不同的服务器上,实现系统的横向扩展。例如,一个电子商务网站可以将用户管理服务、商品目录服务、订单处理服务等分别部署在不同的服务器上,当用户量增加时,可以通过增加相应服务的服务器数量来提高系统的性能和容量。
进程间通信
进程间通信方式有 信号量、消息队列、共享内存、本地套接字接口等四种。
信号量
信号量主要用于进程间的同步和互斥控制,而不是用于直接传递数据。它是一个计数器,用于控制对共享资源的访问。进程可以通过对信号量进行操作(如等待、释放等)来协调对共享资源的访问顺序,适用于多个进程对有限资源的访问控制,防止资源竞争和死锁。
消息队列
消息队列通常是先进先出(FIFO)的,新消息添加到队列尾部,读取时从队列头部获取。进程可以将消息发送到消息队列,其他进程可以从队列中读取消息。他的优点如下:
- 提供了一种异步通信方式,发送方和接收方不需要同时运行。
- 可以缓冲消息,避免数据丢失。
- 适合在不同进程之间传递少量到中等数量的数据和事件通知。
共享内存
可以通过同步机制(如信号量)来确保对共享内存的正确访问,避免数据冲突。多个进程可以直接访问同一块物理内存区域,实现数据的共享。可以传递大量数据,速度非常快,因为不需要进行数据复制。虽然提供了高效的数据传输方式,但是同步和管理相对复杂,容易出现数据不一致问题。所以比较适用于需要大量数据交换的场景。
本地套接字接口(IPC Socket)
套接字接口类似于网络套接字,进程通过创建本地套接字并进行连接和数据传输,通信方式可以是面向连接的(如 TCP 风格)或无连接的(如 UDP 风格)。当仅限于本机进程间通信时,套接字接口是被优化过的,不会经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等操作,只是简单地将应用层数据从一个进程复制到另一个进程,这个就是本地套接字接口。适用于复杂的通信场景,但相对其他方式可能会有一些额外的开销。
消息队列与共享内存只适合单机多进程间的通信,套接字接口则是更普适的进程间通信机制,可用于不同机器之间的进程通信。
概念
在分布式系统中,不同的服务可能运行在不同的服务器上,使用不同的编程语言和技术栈。我理解如果需要远程服务调用,就需要定一个统一的远程调用的机制或者风格,但是目标是一致的,开发者只需要关注业务逻辑,而不需要关心底层的网络通信细节。
RPC(Remote Procedure Call,远程过程调用)
RPC 提供了一种机制,让开发者可以像调用本地函数一样调用远程服务的函数,极大地简化了分布式系统的开发。开发者不需要关心底层的网络通信细节,如建立连接、数据序列化和反序列化等,只需要专注于业务逻辑的实现。RPC 可以使用不同的底层协议,如 HTTP、TCP 等。
REST(Representational State Transfer,表述性状态转移)
REST 是基于 HTTP 等协议构建,强调资源的概念,将网络上的一切都视为资源,并通过统一的接口(通常是 HTTP 方法)对这些资源进行操作,是一种软件架构风格,主要用于设计网络应用程序。REST 要求无状态通信,即服务器不保存客户端的状态信息,每个请求都是独立的。