01_为什么要用RPC分布式

提高硬件上限

受限于硬件条件,服务器所能承受的用户的并发量。

解耦项目架构,便于管理

如果整个项目代码全部在一起,假设只修改一个单元模块的几行代码,则可能需要把整个项目重新编译、部署,耗时太长。

各模块对硬件要求不一样

有些模块是CPU密集型,有些模块是I/O密集型。各模块对硬件资源的需求不一样。分模块,分布式,可以充分发挥每个服务器硬件的优势。
CPU密集型用于数据处理、计算。要求CPU性能。
I/O密集型用于处理请求、连接。要求网络带宽。

单纯的集群

  1. 优点:集群只能解决提高硬件的上限。
  2. 缺点:如果只做集群,不做分布式,在只修改几行代码后每个服务器都需要重新编译、部署全部代码。更头疼了。
  3. 缺点:不能精细地控制硬件资源和模块的适配。

可以在分布式的基础上集群

根据节点对应的功能模块的并发要求,可以针对性地对某一模块进行集群部署。

分布式虽好,但要解决的问题

大系统的软件模块怎么划分

各模块可能会实现大量重复的代码

各模块之间怎么访问

各模块都运行在不同的进程中。
(比如可以运行在docker虚拟化环境中,各个模块单独运行在一个环境中)
比如,用户管理是一个单独的模块,和好友管理模块运行在不同的环境、进程。
用户管理,可能某个用户需要调用user.GetUserFriendLists(userid)。
而这个接口/函数可能处于好友管理模块中。

1
2
3
4
// 机器1
user.GetUserFriendLists(userid);
// 机器2
list<User> GetUserFriendLists(int userid);

机器1上的模块怎么调用机器2上的模块的一个业务方法呢???
机器1上的一个模块进程1怎么调用机器1上的模块进程2里面的一个业务方法呢???

解决方案

见《RPC通信原理》一篇。