韋統邊 張 送 溫麗梅 譚倚靖 溫豐蔚
(上汽通用五菱汽車股份有限公司,廣西 柳州545007)
隨著我國經濟持續快速的發展,汽車成為大部分家庭不必可少的交通工具。電動化、網聯化、智能化和共享化成為新一代汽車的基本要求,同時汽車產生的數據急劇增加,導致數據統計計算耗時長。為了更方便快捷的監控大數據任務狀態,實時發現并解決運行中產生的問題,提高工作效率,大數據任務監控系統應運而生。
通過大數據實時監控系統,技術人員可實時獲取任務的運行狀態,包括任務運行的進度、健康狀況、計算中間結果,從而能快速的根據監控的狀態調整任務運行策略,節省服務器資源、節省時間和快速定位問題。
客戶端定時向服務器發送Ajax 請求,服務器接收到請求后馬上響應并關閉連接。
優點:編程實現方式簡單。
缺點:每次請求都必須經過三次握手,并且請求中絕大部分是無用的,極大的浪費服務器資源和寬帶[1]。
應用場景:資源充足的小型應用。
客戶端向服務器發送Ajax 請求,服務器接收到請求后,如果沒有數據,服務器并沒有立刻關閉連接,而是等到有新消息產生,返回給客戶端才關閉連接,如果在設定的超時時間后,服務器也無響應,則返回無數據響應給客戶端,客戶端接收到數據并處理完成后,再向服務器發起請求。
優點:在無消息響應的情況下,客戶端不會頻繁向服務器發起請求,節省三次握手開銷以及重復發送請求的網絡流量,有效解決短輪詢資源浪費的弊端。
缺點:服務器維持長輪詢狀態能力有限,需要同時維護多個線程,并且很容易達到服務器TCP 連接數上限,導致后續的長輪詢請求超時。
應用場景:Facebook IM。
客戶端與服務器建立HTTP 連接,服務器響應數據后,不會馬上關閉連接,后續客戶端發送請求以及服務器響應數據都是使用該連接。客戶端和服務端會定時發送心跳信息,確保連接是有效的,服務端會及時關閉無效的連接,減輕服務器的壓力。
優點:相對于長輪詢方式減少較多TCP 建立和關閉連接的操作,節省資源和時間。
缺點:存活客戶端判斷時間太長,服務器必定存在一些無效的連接,隨著客戶端連接數變多,連接的利用率變低,也可能達到服務器連接數上限,從而無法向其他客戶端提供服務。
應用場景:Gmail 聊天。
Flash Socket 對TCP 功能做一層封裝,新增返回數據、關閉連接和錯誤等回調函數。一次連接多次使用,并且在發生錯誤和關閉連接的時候都能及時通知到對方,杜絕無用連接的情況,減輕服務器的連接壓力。
優點:解決頻繁請求數據資源浪費問題,客戶端關閉連接后服務器能及時釋放連接資源。
缺點:瀏覽器必須按照Flash 插件,在HTML5 盛行的時代,安裝Flash 插件的瀏覽器越來越少。
應用場景:網頁游戲。
WebSocket 是HTML5 新增的協議,屬于應用層第七層上的一個應用層協議,它必須依賴HTTP 協議進行第一次握手,并在瀏覽器和服務器之間建立一個不受限的雙向通信通道,瀏覽器和服務器可以在任意時刻發送消息給對方。握手成功后數據就直接從TCP 通道傳輸,傳輸數據時與HTTP 無關[2-3]。
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
大數據任務監控系統中任務監控時序圖如圖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 方法,用于服務器主動向瀏覽器發送消息使用,大數據任務每完成一個階段調用一次該方法,向瀏覽器反饋任務的當前進度和狀態,便于管理員實時獲取任務進行的最新消息。
本文介紹一種基于WebSocket 的大數據任務監控系統的設計與實現,用于替代傳統的輪詢和長連接的監控方式,真正實現任務的實時監控和數據雙向通信的要求,減少不必要的數據流量,減輕服務器的壓力。