面试题答案
一键面试协议选择
- 长轮询协议:适用于网络环境较差,对实时性要求不是极高的场景。它通过不断向服务器发送HTTP请求来获取新消息,缺点是频繁请求会消耗资源,优点是兼容性好。例如在一些网络信号不稳定的移动设备场景可备用此协议。
- WebSocket协议:在高并发场景下是首选。它是一种全双工通信协议,建立连接后可双向实时通信,减少了HTTP请求的开销,提升性能。像在线多人游戏、实时股票行情等对实时性和高并发要求高的场景,WebSocket能很好地满足需求。
消息序列化方式
- JSON序列化:是最常用的方式,可读性强、兼容性好。但在高并发下,由于其文本格式特性,序列化和反序列化的性能一般。可以通过使用高性能的JSON序列化库,如System.Text.Json(.NET平台)来优化,它相比传统的Newtonsoft.Json在性能上有较大提升。
- 二进制序列化:如Protobuf(Protocol Buffers)。它将数据序列化为紧凑的二进制格式,空间占用小,序列化和反序列化速度快,适合高并发、对性能要求苛刻的场景。不过它的缺点是可读性差,需要定义专门的消息结构描述文件。
处理消息队列
- 引入外部消息队列:如RabbitMQ、Kafka等。当客户端发送消息到SignalR服务器时,先将消息发送到消息队列。SignalR服务器从队列中消费消息,这样可以削峰填谷,应对高并发瞬间的大量消息。例如在电商秒杀活动中,大量用户同时发送消息,消息队列可以缓存这些消息,避免SignalR服务器直接处理过多消息而崩溃。
- 本地消息队列:SignalR自身也可以实现简单的本地消息队列。在服务器内存中维护一个队列结构,当收到消息时先入队,然后由专门的线程按顺序处理队列中的消息,保证消息处理的有序性和稳定性,提升整体性能。