面试题答案
一键面试整体架构设计
- 网络层
- 监听模块:使用
epoll
(在Linux系统下,因其在处理大量并发连接时性能优越)来监听新的连接请求。它会持续监听服务器的特定端口,一旦有新的连接到来,就将其加入到epoll
实例的监控列表中。 - 连接管理模块:负责管理已建立的连接。它维护一个连接池,记录每个连接的状态(如已连接、正在通信、断开等)。对于新连接,它会为其分配资源,如缓冲区等,并将连接信息传递给协议层。
- 监听模块:使用
- 协议层
- 协议解析模块:负责解析接收到的数据,识别数据的协议类型(如TCP、UDP,对于实时通信,可能采用自定义协议)。按照协议规则,将数据流分割成一个个完整的消息包,并提取出消息头中的关键信息,如消息类型、发送方ID、接收方ID等。
- 协议封装模块:在发送数据时,根据协议规则,将应用层传递过来的数据封装成符合协议格式的消息包,添加消息头、校验和等必要信息,然后传递给网络层进行发送。
- 数据处理层
- 业务逻辑模块:根据接收到的消息类型,调用相应的业务逻辑函数进行处理。例如,如果是聊天消息,它会将消息存储到数据库,同时推送给接收方;如果是用户登录消息,它会验证用户身份等。
- 缓存模块:用于临时存储一些高频访问的数据或等待处理的消息。比如未及时送达的消息可以先存储在缓存中,待网络恢复正常后再进行发送。同时,对于一些常用的用户信息等也可以缓存起来,减少数据库的访问压力。
模块协同工作
- 接收数据流程
- 网络层的监听模块监听到有数据到达某个连接,通知连接管理模块。
- 连接管理模块将数据传递给协议层的协议解析模块,解析出消息包。
- 协议解析模块将解析后的消息传递给数据处理层的业务逻辑模块,业务逻辑模块根据消息类型进行处理,可能会涉及到从缓存模块获取数据或向缓存模块写入数据。
- 发送数据流程
- 数据处理层的业务逻辑模块将需要发送的数据传递给协议层的协议封装模块。
- 协议封装模块将数据封装成协议格式的消息包,传递给网络层的连接管理模块。
- 连接管理模块找到对应的连接,将消息包发送出去。
应对网络延迟、丢包等问题
- 网络延迟
- 心跳机制:在连接管理模块中,定期向客户端发送心跳包,客户端收到后立即回复。通过记录心跳包的往返时间(RTT)来动态评估网络延迟。如果发现某个连接的RTT持续增长,说明网络延迟加剧,可以适当调整发送频率,避免因频繁发送数据而加重网络负担。
- 数据预取:在缓存模块中,根据用户的行为模式和历史数据,提前预取可能需要的数据。例如,对于经常与某些用户聊天的用户,提前将这些用户的部分聊天记录缓存起来,当用户需要查看时,可以快速响应,减少因网络延迟导致的等待时间。
- 丢包
- 重传机制:在协议层,为每个发送的消息包添加序列号。发送方发送消息包后,启动一个定时器。如果在规定时间内没有收到接收方的确认(ACK)消息,说明可能发生了丢包,发送方将重新发送该消息包。同时,接收方在接收到重复的消息包时,根据序列号进行去重处理。
- 冗余传输:对于一些关键数据,在发送时可以采用冗余传输的方式,即同时通过多个路径(如不同的网络节点)发送相同的数据。接收方只要从其中一个路径成功接收到数据,就可以正常处理,提高数据传输的可靠性。