01_为什么要用RPC分布式
提高硬件上限
受限于硬件条件,服务器所能承受的用户的并发量。
解耦项目架构,便于管理
如果整个项目代码全部在一起,假设只修改一个单元模块的几行代码,则可能需要把整个项目重新编译、部署,耗时太长。
各模块对硬件要求不一样
有些模块是CPU密集型,有些模块是I/O密集型。各模块对硬件资源的需求不一样。分模块,分布式,可以充分发挥每个服务器硬件的优势。
CPU密集型用于数据处理、计算。要求CPU性能。
I/O密集型用于处理请求、连接。要求网络带宽。
单纯的集群
- 优点:集群只能解决提高硬件的上限。
- 缺点:如果只做集群,不做分布式,在只修改几行代码后每个服务器都需要重新编译、部署全部代码。更头疼了。
- 缺点:不能精细地控制硬件资源和模块的适配。
可以在分布式的基础上集群
根据节点对应的功能模块的并发要求,可以针对性地对某一模块进行集群部署。
分布式虽好,但要解决的问题
大系统的软件模块怎么划分
各模块可能会实现大量重复的代码
各模块之间怎么访问
各模块都运行在不同的进程中。
(比如可以运行在docker虚拟化环境中,各个模块单独运行在一个环境中)
比如,用户管理是一个单独的模块,和好友管理模块运行在不同的环境、进程。
用户管理,可能某个用户需要调用user.GetUserFriendLists(userid)。
而这个接口/函数可能处于好友管理模块中。
1 | // 机器1 |
机器1上的模块怎么调用机器2上的模块的一个业务方法呢???
机器1上的一个模块进程1怎么调用机器1上的模块进程2里面的一个业务方法呢???
解决方案
见《RPC通信原理》一篇。