隨著社會(huì)數(shù)字化進(jìn)程不斷的提升,數(shù)字技術(shù)正在以新方式、新理念、新形態(tài)逐漸融入我們的經(jīng)濟(jì)、文化、生產(chǎn)生活等各個(gè)領(lǐng)域乃至全過程。而在這背后涌現(xiàn)出的是海量數(shù)據(jù)以及海量設(shè)備高并發(fā)等問題,這也使業(yè)務(wù)系統(tǒng)面臨前所未有的巨大的挑戰(zhàn)。目前OneNET城市物聯(lián)網(wǎng)平臺(tái)面對(duì)大連接的應(yīng)用場(chǎng)景,經(jīng)受住了海量數(shù)據(jù)和高并發(fā)的挑戰(zhàn)。那么,如此高的性能挑戰(zhàn),平臺(tái)是如何進(jìn)行應(yīng)對(duì)的?
高并發(fā)是一種在“同一時(shí)間點(diǎn)或極短時(shí)間內(nèi)出現(xiàn)大量的操作請(qǐng)求”的場(chǎng)景。而傳統(tǒng)的網(wǎng)絡(luò)通信模型,在面對(duì)海量數(shù)據(jù)高并發(fā)場(chǎng)景,已經(jīng)顯得力不從心;一款優(yōu)秀的高并發(fā)框架是現(xiàn)階段網(wǎng)絡(luò)通信必不可少的一環(huán),如:Grizzly、Netty,Mina。平臺(tái)在面對(duì)海量設(shè)備接入場(chǎng)景,選擇了Netty成為整個(gè)接入能力的核心框架。其單節(jié)點(diǎn)百萬(wàn)級(jí)接入,集群千萬(wàn)級(jí)的海量接入能力成為了當(dāng)前平臺(tái)在高并發(fā)場(chǎng)景下的解決方案。
Netty是什么?
是一個(gè)異步事件驅(qū)動(dòng)的Java開源網(wǎng)絡(luò)應(yīng)用程序框架,用于快速開發(fā)可維護(hù)的高性能協(xié)議服務(wù)器和客戶端。
為什么要選用Netty?
相較于傳統(tǒng)的IO模型,Netty的IO線程N(yùn)ioEventLoop 聚合了多路復(fù)用器Selector,可以同時(shí)并發(fā)處理成千上萬(wàn)個(gè)客戶端連接,在線程從客戶端讀寫數(shù)據(jù)閑暇時(shí),線程可以進(jìn)行其他任務(wù),而無需等待讀寫數(shù)據(jù)。在線程模型上,Netty的線程模型也叫Reactor模型,核心是基于事件驅(qū)動(dòng)的方式來處理事件;其分布式的異步架構(gòu),使得事件處理器之間高度解耦,可以方便擴(kuò)展事件處理邏輯;同時(shí)通過隊(duì)列暫存事件,線程消費(fèi)事件,能方便并行異步處理事件。
Netty的優(yōu)勢(shì)是什么?
Netty適用于各種傳輸類型的統(tǒng)一API阻塞和非阻塞Socket;基于靈活且可擴(kuò)展的事件模型,可以清晰地讓開發(fā)者專注于業(yè)務(wù)而無需關(guān)注底層架構(gòu),提升了開發(fā)效率;具備高度可定制的線程模型-單線程,一個(gè)或多個(gè)線程池;真正的無連接數(shù)據(jù)報(bào)套接字的支持。Zero-Copy技術(shù)使得Netty有更低的資源消耗,以及不必要的內(nèi)存拷貝。
“一根筷子易折斷,一把筷子難折斷”。對(duì)于平臺(tái)也是一樣,巨大的單體式服務(wù)總會(huì)到達(dá)一個(gè)性能瓶頸。平臺(tái)面對(duì)千萬(wàn)級(jí),乃至億級(jí)的接入,單體服務(wù)只能進(jìn)行橫向擴(kuò)展,部署更多的單體式服務(wù);而單體式服務(wù)包含了全量的服務(wù)功能,任何一個(gè)功能出現(xiàn)問題,會(huì)面臨所有的功能都不可用;同樣單體式服務(wù)代碼復(fù)雜度也非常高,在服務(wù)中包含了大量的業(yè)務(wù)邏輯。隨著時(shí)間推移,需求不斷增多,代碼也越來越復(fù)雜,維護(hù)成本也越來越高,甚至對(duì)于修復(fù)bug和新增功能都要非常謹(jǐn)慎,可謂牽一發(fā)而動(dòng)全身。
平臺(tái)選擇微服務(wù)的整體架構(gòu)設(shè)計(jì),采用分布式部署的方式完美的解決了單體服務(wù)所面對(duì)的窘境。
功能原子化,高可維護(hù)性
將復(fù)雜的單體式服務(wù)以功能點(diǎn)拆分為專注單一功能的微服務(wù),并通過定義良好的接口清晰地表述服務(wù)邊界,由于體積小、復(fù)雜度低,易于保持高可維護(hù)性,并提高了研發(fā)效率。
服務(wù)獨(dú)立性,部署風(fēng)險(xiǎn)低
微服務(wù)具備獨(dú)立的運(yùn)行進(jìn)程,可以單獨(dú)進(jìn)行部署。當(dāng)某個(gè)微服務(wù)發(fā)生變更時(shí)無需部署整個(gè)應(yīng)用的服務(wù),只需要對(duì)變更的微服務(wù)進(jìn)行重新部署。使得發(fā)布更加高效,降低了對(duì)正式環(huán)境所造成的部署風(fēng)險(xiǎn),最終縮短應(yīng)用受影響的時(shí)間。
高擴(kuò)展,高容錯(cuò)
微服務(wù)便于橫向擴(kuò)展,不同微服務(wù)在擴(kuò)展需求存在差異時(shí),可以根據(jù)微服務(wù)的實(shí)際需求進(jìn)行獨(dú)立擴(kuò)展,而不需要對(duì)整個(gè)應(yīng)用進(jìn)行擴(kuò)展,節(jié)省了資源,提高了資源利用效率。
微服務(wù)也增加了應(yīng)用的高容錯(cuò)性,在單個(gè)微服務(wù)發(fā)生故障的情況下,不會(huì)影響到其他微服務(wù),導(dǎo)致整個(gè)應(yīng)用不可用。具備多個(gè)節(jié)點(diǎn)的微服務(wù),上層的微服務(wù)會(huì)通過重試可用微服務(wù)或者平穩(wěn)的故障轉(zhuǎn)移機(jī)制實(shí)現(xiàn)應(yīng)用層面的高容錯(cuò)性。
面對(duì)大量的用戶訪問,高并發(fā)請(qǐng)求,海量的數(shù)據(jù),即使是使用高性能框架和微服務(wù)架構(gòu)的設(shè)計(jì)也還不能完全解決應(yīng)用服務(wù)的壓力。通??蛻舳嗽谡?qǐng)求服務(wù)端時(shí)會(huì)有一個(gè)統(tǒng)一的訪問入口,那這個(gè)統(tǒng)一的訪問入口是如何將我們的請(qǐng)求分發(fā)到壓力較小的服務(wù)器上去的呢?答案就是“負(fù)載均衡”。
負(fù)載均衡,顧名思義就是將客戶端請(qǐng)求進(jìn)行平衡,分?jǐn)偟蕉鄠€(gè)服務(wù)器單元,優(yōu)化資源的使用,最大化吞吐量,最小化響應(yīng)時(shí)間并避免任何的單一資源過載的技術(shù)。
負(fù)載均衡的分類主要包含如下幾種:
二層負(fù)載均衡
采用虛擬mac的形式,外部對(duì)虛擬mac地址請(qǐng)求,負(fù)載均衡接收后分配實(shí)際的mac地址服務(wù)進(jìn)行響應(yīng)處理。
三層負(fù)載均衡
采用虛擬IP的方式,外部對(duì)虛擬IP的請(qǐng)求,負(fù)載均衡后分配到實(shí)際的IP地址進(jìn)行響應(yīng)
四層負(fù)載均衡(TCP)
四層負(fù)載均衡是基于三層負(fù)載均衡通過發(fā)布三層負(fù)載均衡的IP地址,加入四層的端口號(hào),來決定哪些流量需要做負(fù)載均衡;LVS在四層負(fù)載均衡性能上高于Nginx的。
七層負(fù)載均衡(HTTP)
七層負(fù)載均衡是在更高的應(yīng)用層上執(zhí)行負(fù)載均衡,會(huì)對(duì)每個(gè)消息實(shí)際內(nèi)容進(jìn)行處理,主要通過解析消息內(nèi)容,得到消息內(nèi)容的有效標(biāo)識(shí),最終決定選擇的內(nèi)部服務(wù);例如選用URL來做出負(fù)載均衡決策;Nginx在功能性和便利性上是要好于LVS的。
平臺(tái)負(fù)載均衡采用LVS+Keepalived+Nginx對(duì)業(yè)務(wù)流進(jìn)行分發(fā),實(shí)現(xiàn)整體負(fù)載均衡;支持TCP、UDP等協(xié)議的四層負(fù)載均衡;支持HTTP/HTTPs等協(xié)議的七層負(fù)載均衡;新增或刪除后端服務(wù)后可重新負(fù)載業(yè)務(wù)流。
高并發(fā)框架、微服務(wù)架構(gòu)設(shè)計(jì)、負(fù)載均衡的使用解決了大部分的服務(wù)端的并發(fā)壓力。但海量數(shù)據(jù)在磁盤中的讀寫,I/O的瓶頸也是非常明顯的。數(shù)據(jù)的存儲(chǔ)依舊也會(huì)造成應(yīng)用服務(wù)的瓶頸。分布式中間件的使用就尤為重要了。
分布式緩存
緩存是一種用于提高系統(tǒng)響應(yīng)速度、改善系統(tǒng)運(yùn)行性能的技術(shù)。緩存通常是基于內(nèi)存的,數(shù)據(jù)庫(kù)中數(shù)據(jù)的讀寫通常是基于磁盤,從緩存讀取數(shù)據(jù)比從磁盤讀取數(shù)據(jù)快兩個(gè)數(shù)量級(jí)。
分布式消息隊(duì)列
消息隊(duì)列是一種用于解決應(yīng)用耦合、異步消息、流量削鋒等場(chǎng)景的中間件技術(shù)。它可以實(shí)現(xiàn)高性能、高可用、可伸縮和最終一致性架構(gòu),是大型分布式系統(tǒng)不可缺少的中間件。
平臺(tái)微服務(wù)架構(gòu)設(shè)計(jì)方面同樣會(huì)使用緩存-分布式Redis緩存,分布式Redis緩存具有高性能、動(dòng)態(tài)擴(kuò)展、高可用、易用性等特點(diǎn),采用集群方式來滿足高讀寫性能場(chǎng)景及容量需彈性變配的業(yè)務(wù)需求。也使用了分布式Kafka,其對(duì)于消息異步的處理,微服務(wù)之間的應(yīng)用解耦也是不可或缺的部分。