基于WebSocket 大数据任务监控设计与实现
2021-01-21韦统边温丽梅谭倚靖温丰蔚
韦统边 张 送 温丽梅 谭倚靖 温丰蔚
(上汽通用五菱汽车股份有限公司,广西 柳州545007)
1 大数据任务监控
随着我国经济持续快速的发展,汽车成为大部分家庭不必可少的交通工具。电动化、网联化、智能化和共享化成为新一代汽车的基本要求,同时汽车产生的数据急剧增加,导致数据统计计算耗时长。为了更方便快捷的监控大数据任务状态,实时发现并解决运行中产生的问题,提高工作效率,大数据任务监控系统应运而生。
通过大数据实时监控系统,技术人员可实时获取任务的运行状态,包括任务运行的进度、健康状况、计算中间结果,从而能快速的根据监控的状态调整任务运行策略,节省服务器资源、节省时间和快速定位问题。
2 传统大数据任务监控实现方式
2.1 短轮询方式
客户端定时向服务器发送Ajax 请求,服务器接收到请求后马上响应并关闭连接。
优点:编程实现方式简单。
缺点:每次请求都必须经过三次握手,并且请求中绝大部分是无用的,极大的浪费服务器资源和宽带[1]。
应用场景:资源充足的小型应用。
2.2 长轮询方式
客户端向服务器发送Ajax 请求,服务器接收到请求后,如果没有数据,服务器并没有立刻关闭连接,而是等到有新消息产生,返回给客户端才关闭连接,如果在设定的超时时间后,服务器也无响应,则返回无数据响应给客户端,客户端接收到数据并处理完成后,再向服务器发起请求。
优点:在无消息响应的情况下,客户端不会频繁向服务器发起请求,节省三次握手开销以及重复发送请求的网络流量,有效解决短轮询资源浪费的弊端。
缺点:服务器维持长轮询状态能力有限,需要同时维护多个线程,并且很容易达到服务器TCP 连接数上限,导致后续的长轮询请求超时。
应用场景:Facebook IM。
2.3 长连接方式
客户端与服务器建立HTTP 连接,服务器响应数据后,不会马上关闭连接,后续客户端发送请求以及服务器响应数据都是使用该连接。客户端和服务端会定时发送心跳信息,确保连接是有效的,服务端会及时关闭无效的连接,减轻服务器的压力。
优点:相对于长轮询方式减少较多TCP 建立和关闭连接的操作,节省资源和时间。
缺点:存活客户端判断时间太长,服务器必定存在一些无效的连接,随着客户端连接数变多,连接的利用率变低,也可能达到服务器连接数上限,从而无法向其他客户端提供服务。
应用场景:Gmail 聊天。
2.4 Flash Socket 方式
Flash Socket 对TCP 功能做一层封装,新增返回数据、关闭连接和错误等回调函数。一次连接多次使用,并且在发生错误和关闭连接的时候都能及时通知到对方,杜绝无用连接的情况,减轻服务器的连接压力。
优点:解决频繁请求数据资源浪费问题,客户端关闭连接后服务器能及时释放连接资源。
缺点:浏览器必须按照Flash 插件,在HTML5 盛行的时代,安装Flash 插件的浏览器越来越少。
应用场景:网页游戏。
3 基于WebSocket 大数据任务监控实现方式
3.1 WebSocket 简介
WebSocket 是HTML5 新增的协议,属于应用层第七层上的一个应用层协议,它必须依赖HTTP 协议进行第一次握手,并在浏览器和服务器之间建立一个不受限的双向通信通道,浏览器和服务器可以在任意时刻发送消息给对方。握手成功后数据就直接从TCP 通道传输,传输数据时与HTTP 无关[2-3]。
3.2 WebSocket 协议内容
WebSocket 连接必须由浏览器发起,因为请求协议是一个标准的HTTP 请求,格式如下:
GET ws://localhost:8804/ws/task001
Host: localhost
Upgrade: websocket
Connection: Upgrade
Origin: http://localhost:8804
Sec-WebSocket-Key: client-random-string
Sec-WebSocket-Version: 13
请求头Upgrade: websocket 和Connection: Upgrade 表示这个连接要转换为WebSocket 连接;Sec-WebSocket-Key 用于标识这个连接并非用于加密数据;Sec-WebSocket-Version 用于指定协议版本[4-5]。
服务器如果接受该请求,就会返回如下消息:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: server-random-string
3.3 WebSocket 在大数据任务监控系统中的应用
大数据任务监控系统中任务监控时序图如图1 所示。
图1
本系统是基于SpringBoot 开源框架搭建,后端开发语言使用Java,前端开发语言使用HTML5,并使用maven 作为jar 包管理和项目构建工具。
需要在pom.xml 文件中引入spring-boot-starter-websocket依赖配置,并将ServerEndpointExporter 注解为一个Bean,该步骤主要是将WebSocket 托管给SpringBoot 进行管理。再新建一个WebsocketConf 类,在类中使用@ServerEndpoint 注解说明服务器接收WebSocket 请求的路径。
重写onOpen 方法,该方法会在建立WebSocket 连接后被回调并生成一个Session,本系统会建立一个ID 与Session 一一对应的Map 表缓存到内存中,方便之后服务器与浏览器通信时快速检索,会在机器重启和连接断开后销毁。
重写onClose 方法,该方法会在连接被关闭后调用,本系统在该方法中销毁缓存与断开连接对应的Session,释放部分内存空间。
重写onError 方法,该方法会在服务器发生错误后调用,本系统会将发生错误的具体内容发送给浏览器,让管理员根据错误消息采取相应的应急措施。
重写onMessage 方法,用于接收浏览器向服务器发送的数据,本系统会从发送的数据中提取查询条件,并将浏览器希望获取的结果封装成JSON 格式返回。
新增sendMsg 方法,用于服务器主动向浏览器发送消息使用,大数据任务每完成一个阶段调用一次该方法,向浏览器反馈任务的当前进度和状态,便于管理员实时获取任务进行的最新消息。
4 结论
本文介绍一种基于WebSocket 的大数据任务监控系统的设计与实现,用于替代传统的轮询和长连接的监控方式,真正实现任务的实时监控和数据双向通信的要求,减少不必要的数据流量,减轻服务器的压力。