服务器开发之多进程/线程的思考(待完成)

一、多进程框架的应用场景

公司业务很复杂的情况下,我建议是采用多进程的方式来构建代码。比如金融类软件,银行类软件,或者保险类软件。

二、多进程设计示例

多进程架构设计,可以按业务逻辑划分成多个模块,每个模块由一个进程来负责处理。分工明确,各司其职,系统运转的更平稳。

比如我公司的架构设计如下图所示:


ByNodemanagerServer进程:负责从网卡上抓包,根据数据包的ip五元组来进行一致性hash,将大量的数据包散列到后端的ByNodemanagerClient进行解析和处理

ByNodemanagerClient进程:对数据包进行解析,通过特征进行协议识别,识别成功后,如识别成http协议,那么按照http协议的规范进行解析,然后生成xdr

ByNodemanagerXdr进程:对生成的xdr数据发送给后端模块进行处理。

上图三个进程的通信方式,可以采用mq消息队列,也可以采用socket套接字来进行网络通讯。

3 多进程 VS 多线程

3.1 多进程设计,好在哪里?

1.提高开发效率

如果公司项目代码生成的可执行文件只有一个进程,N个人合作开发或维护这个项目,由于没有很好的隔离出每个人负责的业务模块,如果进程在测试环节或者线上部署后出现严重问题,组里人将可能相互推诿责任,因为不好定位出是哪个模块的问题

同时也不利于单元测试的实施,单元测试首先要通过的。

如果小张就负责上述的Server进程,而小李就负责上述的Client进程,当出现问题时,管理人员和测试人员也好方便找对应模块的人进行处理,避免了无效的沟通成本。

2.分布式考虑

比如某个模块进程是核心处理部分,特别消耗系统资源(如cpu,内存,带宽等),可以考虑将此进程部署到硬件配置更好的高性能机器上去

多进程架构利于水平扩展,在高并发高流量的场景下,如果单台服务器的性能不足以满足要求,那么可以将进程部署到多台服务器上,在前端服务器上做负载均衡,保证将网络流量或网络请求尽量平均的调配到每台服务器上。

3.跨语言,更快更好的实现功能

我以前做过一个项目,客户端采用C#编写,前端数据采集使用C++编写,而且数据存储采用的java语言

每种语言都有自己擅长的领域或场景,集众家之所长,来打造软件,才是正道。

4.更强的容错性,自恢复能力

如前面提到的多进程框架系统,当其中一个进程挂掉后(因为某些异常情况),可以通过watchdog看门狗程序将其重新启动

5.更好的多核可扩展性

比如一个服务器的cpu逻辑核心是40个,可通过taskset命令来绑定进程执行时的cpu


主流的进程间通信的方式

主流进程间通信:

消息队列

共享内存

socket套接字

以及各自的优缺点

3.1 多线程设计,好在哪里?

1. 高效的数据共享

在同一个进程中的多个线程,是共享进程的地址空间的,所以做数据共享比较方便。

而多进程共享数据就需要使用共享内存,信号量等ipc技术。

2.上下文切换开销比较小

多线程的程序,在进行上下文的切换时,不需要切换地址空间,不需要更改CR3寄存器,不用清空TLB。

3.2 提升多线程程序效率的一般方法

1.不要频繁的创建线程,销毁线程,建议使用线程池

2.尽量减少不同线程间的同步,如需要同步(加锁),则降低锁的粒度

3.合理组织共享数据结构,避免伪共享false sharing

4.使用非阻塞的数据结构

5.可通过使用Huge Page大页内存,来提供TLB的命中率,从而减少缺页异常。

4 进程调度

相关文章
相关标签/搜索