C++实现RPC分布式网络通信框架(二)-------集群和分布式理论

在项目开始前先对集群和分布式的理论进行了解,了解什么是集群,什么是分布式。

一、为什么需要集群分布式

1.单机服务器能承受的用户并发量不高,它能建立的socket通信通道不够多,所以会大大限制应用的并发量,也就限制了很多其他的业务
2.单机服务器受到单个方法的限制,如果一个方法出错,那么就需要将该服务器上的所有功能模块重新编译上线,这样就会导致时间浪费,给公司带来的经济损失很大,比如淘宝或者其他的应用在并发量最高的时候出错,那带来的经济损失很大
3.在系统中,有些模块属于CPU密集型,有些模块属于I/O密集型,造成各模块对于硬件资源的需求不同,比如有些模块计算量大,则应该部署在CPU质量好的区域,而I/O密集型的模块则可能需要好点的网络或者I/O设备
(1)CPU密集型:大量时间用于处理计算相关的业务,CPU占用率较高,此时的线程数若与系统核数不匹配,则会导致:CPU利用率较低,负载不均衡,某个CPU一直在做运算而其余CPU一直在空闲(针对核数多二开出的线程数少的情况);CPU全部在使用但有些线程已经就绪,一直在等(对于核数少但线程数多的情况)。以上情况都会导致资源的分配不均衡,要么任务一直在等待CPU空闲,要么CPU一直在等待任务,资源浪费。此时设置的线程数最好和核数相等。
(2)I/O密集型:大量时间浪费在读取和存储数据上,而CPU一直在空闲等待I/O操作的完成,造成资源浪费,而且其他任务也一直在等待。可以设置核数二倍的线程数

综上,单机模式受限于硬件资源,并发量不高,容错性低,资源利用和分配不均衡,这就引出了集群的产生。

二、集群产生后可以解决的性能瓶颈

集群可以解决的问题:
(1)硬件资源扩充,第一个问题解决;
(2)项目代码还是需要重新编译,而且需要进行多次部署,第二个问题未解决;
(3)只是简单扩充了服务器,上面部署的项目代码还是一样的,模块并没有分开,所以第三个问题也没有解决。

而且集群引发了更多的问题:有些模块并不需要多次部署,也不需要高并发,这样直接放在集群的每一台服务器上很浪费硬件资源,而且每一台服务器全部做的工作是一样的,有些并不需要多重上线的模块就很浪费资源。

三、分布式

一个工程拆分成很多个模块,每一个模块部署运行在一个服务器主机上,所有服务器协同工作共同提供服务,每一台服务器称作分布式的一个节点,根据节点的并发要求,可以对一个节点再做新的节点模块集群部署,对单机模式的问题:
(1)硬件资源的扩充,对高并发的模块继续扩充节点数,解决
(2)因为模块是分布式的部署在不同的服务器上的,所以只需要在相应的服务器模块上重新编译重新部署即可,保留以前的接口而内部实现不同,可以顺利解决
(3)根据模块的不同可以配置性能不同的硬件,这样就可以顺利解决第三个问题,也可以解决集群产生的问题

四、分布式带来的挑战

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

很多大型软件的模块之间划分并不清晰,所以会带来很多的重复代码,当需要更改时,两个部分的代码万一更改并不同步,则会引发更多的错误。这种问题就处于鱼和熊掌不可兼得的局面,需要更多的精力去研究如何分布代码。

2.各个模块之间应该怎么访问

模块划分后,各模块运行在不同的进程中,如何实现不同机器上的进程间通讯,机器1上的模块进程如何调用机器2模块的一个业务方法呢?使用网络通信:将方法的返回值使用网络发送给另一个节点,这就是RPC的作用,顾名思义远程过程调用,调用远程的方法。

了解了集群和分布式理论后就可以开始规划项目的代码组织了。

猜你喜欢

转载自blog.csdn.net/qq_45132647/article/details/107710805