目录
一:高并发
什么是高并发?
高:允许同时上线的客户端数量高,即服务器能够同时接收到多(数量庞大)个客户端的连接请求(使用到epoll IO多路复用技术)
并发:可以同时处理多个客户端的业务,客户端不需要“排队”等待服务器处理业务(使用到线程池完成并发设计)
高并发难点在于 IO操作(接收到的业务怎么进行处理)
内存(程序) ---》 硬盘(数据库文件) ---》 内存(程序)
服务器要承载极多(数量庞大)个客户端对接(高),同时还要承载极多(数量庞大)个客户端与其传递分析业务数据(并发),要执行线程池选择哪个线程执行任务,在接收到数据后还要做繁琐的IO操作
试想若是服务器设计为:业务服务器+文件服务器
由业务服务器(硬件配置重点在 CPU算力+内存)(完成高并发所有的内存操作)
文件服务器(硬件配置重点在硬盘)(完成高并发所有的文件操作)
将内存操作和硬盘操作分开处理,这样的设计能否有效解决高并发存在的问题?
思路大致为:由业务服务器去处理高并发所有的内存操作,若业务中涉及有文件操作则可以访问文件服务器调用指令,以此高并发存在的问题
二:前后置服务器分离
前后置服务器分离之间使用到IPC进程间通信:共享内存(需要共用) + 消息队列 + 信号量
前置服务器:客户端对接 + 业务分析处理
后置服务器:文件处理 + 数据库处理
三:共享内存共用
共享内存共用设计思路:索引区 + 数据区
索引区 int数组 单元格4字节
数据区 数据区单元格大小要能够容纳最大的业务处理
前置服务器+后置服务器(两个进程)
前置服务器可对索引区0对应数据区进行写数据
后置服务器可对索引去1对应数据区进行读数据
如下图
前置服务器:数据写入 共享内存[数据区] (索引由0到1,后置服务器对索引1对应数据区及时读数据处理)
共享内存中存在数据后(索引为1),
可以使用消息队列 也就是前置服务器[写完数据后]发送消息给后置服务器[令其可以及时读取数据],
如下图,根据 共享内存[索引区1代表有数据 索引区0代表没有数据 目前是有数据表示为1]索引为1对应数据区,后置服务器可以及时读取数据
读取数据后(索引由1到0),清空数据区数据 (memcpy + memset)
索引区为0代表无数据,前置服务器就可以进行下一次 数据的写入
指针偏移:索引区 数据区
索引区操作公式
memcpy(共享内存首地址+sizeof(int)*索引下标,数据,sizeof(int))
数据区操作公式
memcpy(共享内存首地址+索引区总长度+单个数据块长度*索引区下标,数据指针,数据大小)