论文部分内容阅读
企业运用的道路救援系统(CTO)由于年代久远、技术落后,不仅不提供对外接口,而且系统部署在法国,响应速度慢,功能和使用体验上都跟不上中国区日益增长的业务需要,法国开发团队已经不再更新这套系统。目前企业在中国区的业务是由另一个中间件系统来和客户系统做对接来实现道路救援案件的自动推送和状态同步,从而来弥补和辅助老的系统(CTO),但面临的问题是运营部的客服不得不同时使用两套系统,给运营团队带来了很多额外的工作量,使得整个运营团队工作效率很低。企业为了解决这个问题找来了印度团队开发了一个新的道路救援系统“Drive-Easy”专门提供给中国地区使用,但上线后发现十几个人同时在线的情况下系统响应已经很慢,根本用不了。本文就新系统的响应速度慢的问题,进行了测试排查,定位了原因后重构设计并实现了一个基于WebSocket协议和Redis缓存技术的消息推送模块,该方案以提供完整高效的基于B/S架构系统的消息推送模块为目的,并且运用很少的服务器资源就可以实现。本文的研究内容和工作如下:(1)为了定位和验证引起系统慢的原因是客户端轮询请求,对在有轮询和没有轮询两种情况下分别对服务器的CPU、网络带宽使用量、数据库(RDS)负载等指标进行了取证和对比。(2)针对目前市场上比较流行的消息推送技术和框架进行了分析和比对,选取了微软的Signalr框架来作为重构的消息推送模块的服务端,(3)结合Redis缓存技术和基于WebSocket实现的心跳功能弥补了Signalr框架的缺陷:无法捕获所有客户端断开的事件消息。用Redis来管理WebSocket客户端的会话状态(session)和存储ACK信息确保对方收到消息,这两点是众多主流消息推送方案中没有提及或是比较弱的环节。利用Redis关键字过期功能和事件触发机制,开发了一个消息接收器,实现了定时消息的发送。(4)为了提供消息内容在Redis中的可表示性,方便阅读和理解,本文采用简洁的JSON语言作为所有消息内容的存储格式并提出新颖的存储模型方便消息的提取和发送。(5)对模块中最关键的消息发送功能做了压力测试,并对测试报告进行了分析,并在新的消息模块上线后获取了服务器各项指标和原来的指标做了比对,从而来证明新设计模块的优越性。(6)在上述研究的基础上,重构并实现了一套轻量级、高性能、跨平台的消息推送模块。本文提出并实现的是一个新的完整的B/S架构可用的消息推送方案,对现有的消息模块进行了重构优化,弥补了主流框架和方案的盲点,架构简单并且功能灵活。截至目前,重构后的消息推送模块已经运行了数月,同时在线人数已经超过了1万人,系统可以正常运行,比原来轮询的方式节省了服务器资源80%以上,消息服务器基本没有压力,页面可以快速响应。整个系统降低了公司的运营成本并提高了整个救援工作的效率。