劉汪洋, 林 菲, 馬曉婷
(杭州電子科技大學 計算機學院 城市計算與大數據實驗室,浙江 杭州 310018)
公共自行車系統的用戶量較大,對系統的性能要求偏高,如何構建穩定性強、可用性高的系統是當前公共自行車可視化分析系統面臨的一個挑戰。目前公共自行車可視化系統主要著眼于公共自行車數據的可視化分析[1,2],對公共自行車可視化系統的性能和可用性研究較少。
近年來隨著客戶機數量和密集性任務的增加,單個Web服務器受處理能力的限制,成為訪問的一個新瓶頸。為了解決這個問題,Web服務器集群采用負載均衡策略[3],將請求分配給集群中某臺服務器進行處理,通過數據冗余和軟件檢測等方法實現系統的高可用性[4]。負載均衡和讀寫分離以及緩存等技術有助于解決大型系統的性能瓶頸,在不同領域得到廣泛應用。周瑩蓮等人[5]對負載均衡的概念和常見算法進行了研究,并對負載均衡的發展進行了展望。讀寫分離可以極大提升數據的讀取性能以及整個系統的業務承載能力[5]。宋滸等人[6]將讀寫分離技術應用在運行支撐系統中,極大地提升了數據讀取性能以及整個系統的業務承載能力。李軍等人[7]利用負載均衡和MySQL主從復制讀寫分離等技術構建高可用的云盤系統。陳巖等人[8]采用模塊化設計思想和云平臺架構設計出城市綠地監測系統。劉桂龍等人[9]設計了一種基于Android的跨移動端和電腦端的架構。
結合上述設計思想,本文設計出一種服務器集群架構以提高公共自行車可視化系統的性能和可用性。
如圖1,公共自行車可視化系統整體架構主要包括4個部分:數據層、算法層、業務邏輯層和表示層。數據層主要包括杭州公共自行車站點基本信息和公共自行車租還記錄。算法層綜合考慮地理位置和租還記錄構建距離矩陣,采用Affinity Propagation 算法[10]對站點進行區域劃分;采用新型遺傳模擬退火算法[11]對區域間調度站點的公共自行車進行調度;采用XGBoost回歸模型[12]對站點和區域的租還流量進行預測。業務邏輯層采用Spring MVC和Python將業務邏輯封裝成接口,提供給展示層調用。展示層由Web可視化端和普通用戶移動端APP兩部分構成,其中Web可視化端采用Echarts結合百度地圖API以及Bootstrap前端框架開發,移動端采用React Native實現跨平臺開發。

圖1 公共自行車可視化系統整體架構
該系統的服務端架構由 Web服務器集群、數據庫集群、共享Session服務器和緩存服務器等部分構成,如圖2所示。客戶端和負載均衡服務器之間交互,負載均衡服務器根據負載均衡策略,將大量請求有效地分發到不同的Web服務器上,增加了系統吞吐量,提高了系統的靈活性和可用性。由于本系統Web服務器的性能有差異,故本系統的負載均衡策略采用了經典的加權輪詢算法,給配置高、負載低的機器配置更高的權重,讓其處理更多的請求;給配置低、負載高的機器分配較低的權重,降低系統負載。并選取一臺具有較高性能服務器作為備份服務器,該服務器會在其他節點全部無法使用時自動啟用,實現服務器高可用性。

圖2 公共自行車可視化系統集群架構
Web服務器采用集群架構,就要考慮不同服務器之間的Session共享問題。系統采用高速緩存框架Memcache搭建共享Session服務,以實現Web服務器集群中不同服務器之間的Session一致性。本系統對公共自行車數據讀功能需求遠遠大于寫功能需求,因此,數據庫集群采用主從復制、讀/寫分離的方式減輕主庫的讀請求的壓力。選取一臺數據庫服務器作為主庫,其他三臺服務器作為從庫,主庫主要負責處理寫業務,從庫負責讀業務。考慮到Redis緩存架構讀/寫速度非常快,支持豐富的數據類型、支持事務等特性,因此本系統選取Redis作為緩存框架,數據查詢時,如果緩存中有相關數據就可以優先從緩存中讀取,提高查詢速度。本系統對Web前端性能也進行了優化,對JavaScript和CSS文件的體積采用壓縮工具進行了壓縮,靜態資源采用CDN加速,公共自行車站點等部分短期不變的少量數據在localStorage中進行緩存,以此來提高前端頁面的加載速度。
本系統主要設計目的是為公共自行車管理者提供站點和區域視角的可視化系統;為普通用戶提供便捷的站點信息查詢和租還等功能。如圖3所示,本系統原始數據包括站點信息和用戶租還記錄。在數據預處理階段首先對原始數據進行數據清洗,然后對數據進行編碼。根據公共自行車管理員和普通用戶兩種視角,分別設計了針對公共自行車管理員的可視化系統和普通用戶的跨平臺APP。

圖3 公共自行車可視化系統工作流程
圖3(a)展示了公共自行車站點分布情況。通過不同顏色的標注將公共自行車站點標記在地圖上。以紅色標注表示該站點無可借公共自行車;藍色標注表示該站點無可還車位;綠色標注表示該站點既可借車也可以還車;灰色標注表示該站點當前停止服務。當公共自行車管理者將鼠標停留在站點標注上時,顯示該站點的自行車樁位數、可借車數、可還車位數、可借車數和總樁位數比例等信息。當公共自行車管理者用鼠標點擊站點標注時,站點的短期和長期租還預測信息將通過折線圖直觀展現。
圖3(b)展示根據站點地理位置和租還記錄作為主要因素的公共自行車聚類結果。不同區域用不同顏色圖形進行標識。當公共自行車管理者將鼠標停留在區域上時,區域的基本信息和調度中心站點名稱和位置將通過信息窗顯示出來。當公共自行車管理者用鼠標點擊區域時,區域的短時和長時預測信息通過折線圖展示出來。
圖3(c), 系統通過動畫方式為公共自行車管理者提供可視化的調度方案。該視圖中調度結點為區域視圖中每個區域中的調度站點。當公共自行車管理者將鼠標停留在某段線路上,可以查看該段線路從前一個調度站點到下一個調度站點需要移入或者移除車輛數。
圖3(d),系統通過動畫方式根據區域間的公共自行車騎行狀況,為公共自行車管理者提供可視化信息展示功能。不同顏色表示跨區域騎行數量的不同,顏色越深表示跨區域騎行數量越大。公共自行車管理者可以實時掌握區域間公共自行車的用戶騎行的情況。
如圖3(e)所示,將地圖和可視化圖形結合在一起。市場調研發現當前公共自行車系統普通用戶APP主要提供公共自行車站點自行車和樁位情況的實時查詢功能。本系統不僅為普通用戶提供站點的實時信息查詢和路線推薦等功能,且提供了站點公共自行車的短期和的長期預測的功能。普通用戶可以通過此APP查看待租和待還車公共自行車站點的短期和長期預測信息。該功能能夠避免公共自行車用戶到達公共自行車站點時,該站點無公共自行車可借或無樁位可還的狀況。
本系統主要采用Java和Python兩種編程語言編寫。軟件環境為:服務端為Linux衍生版本Ubuntu 4.04版本,客戶端為Windows 10系統,Google瀏覽器。硬件環境客戶端 Lenovo ThinkPad x201i, 服務端 阿里云服務器11臺,其中6臺配置為2核/1 GB/1 Mbps,5臺服務器(包括共享Session服務器、Redis緩存服務器和數據庫主庫)為2核/2 GB/2 Mbps。網絡環境為100 MHz寬帶。
通過阿里性能測試服務對系統性能進行了測試,并根據測試數據生成測試結果。本系統采用加權輪詢算法,由圖4可知,并發量優于其他幾種負載均衡算法。

圖4 不同負載均衡算法并發數對比
從圖5性能對比可以看出:采用服務器集群架構的公共自行車可視化系統的系統性能重要指標:TPS、并發數和請求成功率均更優,服務器平均中央處理器(central processing unit,CPU)占用率由96 %降低到75 %,平均響應時間也由812 ms降低為459 ms。充分說明負載均衡和讀/寫分離等技術的運用提高了TPS、并發數以及平均請求成功率。前端頁面性能優化和服務端緩存技術的運用,縮小了平均頁面加載時間,使得系統運行更加流暢。

圖5 性能對比
本文將集群架構運用到公共自行車可視化系統中,通過負載均衡、讀/寫分離和緩存機制提高了系統的響應速度、穩定性和可用性。但系統可視化組件不夠豐富,系統也存在一定局限性。后續將為系統增加更豐富的可視化組件和圖形,探究公共自行車數據背后的規律,為公共自行車系統管理者提供更科學的參考方案。