韋通明,張送,溫豐蔚,溫麗梅,張亮
(上汽通用五菱汽車股份有限公司技術中心,廣西 柳州545007)
隨著汽車智能網聯化的發展,汽車變得更加智能化的同時,也產生更多的數據。在傳統的數據接收端中,數據的接收以及轉發都是阻塞式運行,當數據量大的時候,接收端可能卡死甚至宕機。接收端的宕機可能導致終端數據的丟失,會對公司造成重大的口碑和經濟損失。因此,保證平臺平穩而高效的運行,對于智能網聯汽車平臺的重要性不言而喻。
使用 Netty作為數據平臺的接收端,在業界內早已有人進行了實踐,王鑫等[2]就提出了一種基于Netty作為基礎的數據通信框架;李熙、謝錦洋[3]也基于Netty和HDFS分布式文件系統設計出了一種大數據的接收以及采集系統。但是上面的兩個系統都是單純利用Netty接收和轉發,Netty的Boss線程和Worker線程互相耦合,資源互相競爭,可能導致數據無法接受或者轉發[1],可能存在數據堆積等風險。
本文針對以上存在的不足,引入了Kafka消息中間件作為Netty的下游,使得Netty接收到的數據可以快速被轉發。Kafka被設計為能承受數十萬迸發的分布式消息中間件,能快速地緩存并且轉發數據,減輕 Netty接收端的壓力。Kafka支持集群多副本部署,能夠防止數據丟失。我們將Netty與Kafka整合,能降低接收端集群的壓力,并且系統更加可靠。
Netty引用并優化了JDK5引入的線程池技術,并且修復了JDK原生NIO的BUG,并且將接收線程池與業務線程池進行了分離。其中Acceptor線程池負責接受連接,worker線程池負責處理連接的讀寫事件。這種 Reactor模型的支持使得 Netty能用很少的連接就能處理大量的連接終端。同時,Netty封裝了JDK NIO,簡化了JDK NIO本身復雜的API,保留了安全性高、性能優越等特點。Netty是個性能優秀、使用簡單的網絡通信框架,在本方案中,Netty專門負責接收終端連接請求。
Netty的線程模型如圖1所示:

圖1 Netty線程模型
Kafka作為隊列模式的消息中間件,能夠確保數據的順序性。Kafka的一個topic會由多個partition組成,每個partition還會有某個數量的副本,這些副本分散在Kafka的集群之中,一旦Kafka集群的某臺機器發生宕機,可以從其他機器恢復副本數據,從而保證數據的可靠性。Kafka的消息數據在一段時間內,即使被消費,也不會在分區和副本中刪除。Kafka與Netty使用了同樣的Zero-Copy零拷貝技術,使用Send-file模式,可以直接在內核態傳輸數據,提升一倍的數據發送性能。
方案引入Kafka作為消息隊列,能夠高效、可靠地將數據進行匯聚以及削峰填谷,極大地提升了集群的吞吐量和可靠性。
Kafka的模型如圖2:

圖2 Kafka架構圖
在本方案之中,Netty作為與終端直連的數據接收端,負責接收外部鏈接請求,并且將終端上傳的數據轉發到 Kafka消息中間件之中。Netty接收端的數量可以根據終端數量動態擴容,始終滿足終端的需求。Kafka集群作為整個系統的緩沖池,接受從接收端轉發過來的流量,減輕接收端的壓力。Kafka提供緩存、冗余、負載均衡等能力,能保證consumer段始終能夠在最高效的狀態運行。
整個系統的架構如圖3所示:

圖3 系統架構
為了驗證方案的性能,本文搭建了一套壓力測試的環境。其中,CPU為十代i7-10700F,睿頻4.8 GHz,32G DDR4內存,1T硬盤,操作系統為CentOS7,實驗程序用Java編寫,JDK版本 jdk1.8.0_201,Netty的版本為 4.1.17-Final,Kafka的版本為 1.1.0。使用開源的壓測軟件 JMeter進行模擬,模擬機器配置與服務端保持一致,并且部署在同一個局域網之中,局域網之間通過千兆網卡連接。測試終端模擬每秒發一次1KB的數據。
服務端分別使用傳統的 TcpSocket、原生 Netty以及Netty+Kafka實現,客戶端并發規格為 2000、4000、6000、8000、10000、15000和20000個客戶端,壓測數據如圖4所示:

圖4 壓測數據
根據圖4,可以看出傳統的Tcp Socket在迸發8000左右的時候達到瓶頸,在客戶端迸發更大時,服務端由于壓力過大,吞吐量反而下降;原生的Netty相比Socket吞吐量更高,但是隨迸發上升的趨勢不明顯;本方案吞吐量最高,性能也幾乎是線性增長,峰值的吞吐量達到了原生Netty的1.5倍。并且本方案支持緩沖以及數據冗余,可靠性更強,更適合處理汽車數據這種高迸發的業務場景。
本文提出了一種整合Netty框架以及Kafka中間件的汽車大數據接收端的實現方案,并且分析了 Netty以及 Kafka在本方案之中的作用,二者是本方案能高效、穩定運行的基礎。本文還將本方案和傳統的方案進行了性能對比,本方案的性能在并發量大時,會有明顯的優勢。本文提供樣例是單機部署的方案,在實際運用的場景之中,只要將方案進行集群化部署,就能支撐更多的終端、更大的并發,具有很高的實際價值。