在2019全球互聯(lián)網(wǎng)通信云(WIIC)大會(huì )上,融云技術(shù)總監高曉光在“架構演進(jìn)與性能優(yōu)化”論壇演講中毫無(wú)保留地分享了融云高并發(fā)通信技術(shù)的系統設計與實(shí)踐,希望給廣大開(kāi)發(fā)者提供一些實(shí)戰幫助。作為通信云行業(yè)的技術(shù)領(lǐng)導者,融云連續五年保持IM即時(shí)通訊市場(chǎng)占有率第一,是業(yè)內唯一承諾在高并發(fā)和弱網(wǎng)環(huán)境下,仍然可以保障消息不丟、不重、不亂序的廠(chǎng)商,融云的高并發(fā)通信技術(shù)和系統架構也已成為業(yè)界爭相學(xué)習的技術(shù)標桿。

融云技術(shù)總監高曉光演講
高并發(fā)系統的設計要點(diǎn)
WICC會(huì )上,高曉光首先分享了融云在整個(gè)通信平臺上常用的系統性能優(yōu)化手段。在系統運行的性能上,融云主要關(guān)注業(yè)務(wù)、系統和存儲三個(gè)層面的問(wèn)題。在業(yè)務(wù)層面,建議開(kāi)發(fā)者關(guān)注每個(gè)業(yè)務(wù)請求接口的響應時(shí)長(cháng),動(dòng)態(tài)掌握正確的響應時(shí)長(cháng),過(guò)長(cháng)和過(guò)短都不合理,并對程序運行中的性能拐點(diǎn),盡可能的優(yōu)化,延長(cháng)其到來(lái)的時(shí)間,這可極大提升高并發(fā)的業(yè)務(wù)承載能力。在系統層面,程序運行過(guò)程中關(guān)注CPU、內存和I/O這三方面的使用情況,合理配置資源;在存儲層面,根據實(shí)際業(yè)務(wù)場(chǎng)景做數據庫選型,選擇合適的存儲介質(zhì)。
基于以上性能問(wèn)題關(guān)注點(diǎn),高曉光坦言融云高并發(fā)系統的設計要點(diǎn)主要集中在以下四個(gè)方面:

融云高并發(fā)系統的設計要點(diǎn)
采用異步化的請求處理。目前,融云采用基于A(yíng)ctor模型自研的分布式RPC框架來(lái)實(shí)現整個(gè)通信云平臺,不但可以把請求的源數據,像流水線(xiàn)一樣在每個(gè)節點(diǎn)處理完后直接下轉,還可以將最終處理的結果通過(guò)溯源直接投遞回去,從而減少數據的調用次數。相對于同步的方式,異步化可以提高資源的復用程度,中間需要被處理的節點(diǎn)越多,異步化的優(yōu)勢會(huì )越明顯。
合理的緩存策略。通過(guò)數據、分布式緩存、本地緩存、客戶(hù)端緩存層層遞進(jìn)的緩存策略,使越活躍的數據越逼近客戶(hù)。目的在于讓熱的數據離它要處理的位置更近,以提高緩存的利用率,加快數據處理的速度。
選用適合的數據結構與算法,可以極大的提高整個(gè)程序的計算性能。例如一致性哈希算法,可用于整個(gè)服務(wù)的數據的散列,或者節點(diǎn)的定位;LRU緩存,一個(gè)帶數據淘汰的緩存組件,把冷的數據淘汰掉,把位置騰給熱的數據,提高數據利用率;BitMap,每一個(gè)比特位都可用來(lái)標識一個(gè)狀態(tài)位,可用于快速的狀態(tài)判斷和節省存儲空間;Bloom Filter可以認為是BitMap的一種應用,可以用來(lái)快速判定數據是否存在,避免緩存穿透。
高效的數據存取模型。在融云整個(gè)系統里面會(huì )常用到幾種不同的存儲類(lèi)型,沒(méi)有高下之分,高曉光說(shuō)選用的原則是一定要符合業(yè)務(wù)場(chǎng)景。例如,存用戶(hù)的在線(xiàn)和離線(xiàn)狀態(tài),融云會(huì )選用KV存儲;存儲消息,由于消息對于時(shí)序的要求很高,所以可以選擇時(shí)序型數據庫。數據怎么用起來(lái)方便,就怎么去存取它。
高并發(fā)系統架構的最佳實(shí)踐解讀
WICC上,高曉光談到消息分發(fā)的典型場(chǎng)景有單聊、群聊、聊天室,不同場(chǎng)景應具體分析、分別應對,才是解決高并發(fā)問(wèn)題的秘訣。會(huì )上特別針對群聊和聊天室的不同特點(diǎn),融云分享了不同的最佳實(shí)踐方案。
針對群聊場(chǎng)景。首先,融云在系統中使用消息分發(fā)控制策略,在群消息分發(fā)中引進(jìn)快、中、慢三個(gè)隊列,分別設置不同的延時(shí)值,根據不同的群成員數量,映射到不同處理隊列中,將絕大多數百人以下的群放入快速隊列,進(jìn)行快速處理,可極大地減輕分發(fā)的壓力。
其次,融云采用消息直推與通知拉取相結合的方式,在消息不頻繁時(shí)用直推模式,當消息量爆增,產(chǎn)生積壓時(shí)即轉為通知拉取模式。同時(shí),使用 ACK 機制進(jìn)行消息可靠同步,且同步的消息嚴格按照時(shí)間戳有序進(jìn)行,這個(gè)時(shí)間戳由服務(wù)端保證唯一性,這也是融云敢于承諾消息不重不丟不亂序的秘籍所在。
再則,融云通過(guò)“引用分發(fā)”機制降低消息緩存的存儲占用。原則上,是按消息大小及群成員數量來(lái)判定是否采用“引用分發(fā)”。當消息體大,如發(fā)送語(yǔ)音或圖片時(shí),就采用“引用分發(fā)”機制,只分發(fā)一個(gè)索引,當終端實(shí)際拉取消息時(shí),再推送實(shí)體消息。
針對聊天室場(chǎng)景。聊天室和群聊的不同之處在于:聊天室的成員關(guān)系是臨時(shí)性的,出入頻繁,若遇大型直播,成員瞬時(shí)可達幾萬(wàn)甚至幾十萬(wàn),消息極其活躍,瞬時(shí)峰值極高。融云承諾的是成員無(wú)上限的聊天室服務(wù),最高服務(wù)過(guò)15萬(wàn)人同時(shí)在線(xiàn),每秒消息的分發(fā)量超過(guò)2000萬(wàn)條,日消息峰值超2218億條。
為滿(mǎn)足高并發(fā)消息的服務(wù)請求,融云部署了環(huán)形隊列的內存緩存,滾動(dòng)保存最近的50條消息。在終端完全改用通知拉取的方式,用戶(hù)收到通知后,可從服務(wù)端的緩存中獲取消息,這起到了很好的限流作用,直接緩解了終端壓力。
另外,對于聊天室而言,融云根據多年服務(wù)客戶(hù)的經(jīng)驗以及自身的技術(shù)模型,制定了一套按消息類(lèi)型進(jìn)行消息拋棄的處理機制。例如大型直播的場(chǎng)景,消息可能頻繁到每秒瞬間幾萬(wàn)條消息涌向終端,即便終端能夠處理過(guò)來(lái),用戶(hù)也未必看得過(guò)來(lái),體驗反而很差。所以當直播間消息量過(guò)大或消息頻率過(guò)高時(shí),融云會(huì )為消息設置優(yōu)先級,并將連續消息和相似消息優(yōu)化成一條“疊加消息”,同時(shí)根據優(yōu)先級機制拋棄無(wú)用戶(hù)屬性消息,確保消息并發(fā)量極大的情況下,用戶(hù)端也可以享受流暢的直播互動(dòng)體驗。對于聊天室,融云還額外對消息上行進(jìn)行限流,也有效提升了用戶(hù)體驗。
未來(lái)所面臨的挑戰和改進(jìn)
隨著(zhù)5G+物聯(lián)網(wǎng)時(shí)代的到來(lái),各種終端設備甚至會(huì )延伸到觸手可及的任意一物,海量消息激增將直接導致高并發(fā)的場(chǎng)景無(wú)處不在,底層的通信系統架構也將面臨難于想象的考驗。
高曉光表示,融云一直以來(lái)在服務(wù)性能上都圍繞著(zhù)三大重心去進(jìn)行優(yōu)化,一、合理的算法,降低CPU使用;二、合理的內存結構,降低內存用量,提高緩存利用率;三、盡可能的降低I/O的頻次。同時(shí),高曉光在演講中還著(zhù)重強調:任何的優(yōu)化都需要符合特定的場(chǎng)景,如果沒(méi)有場(chǎng)景,任何優(yōu)化都毫無(wú)意義。
回顧前文,融云的云通信系統架構之所以能夠經(jīng)受住各種高并發(fā)的極端考驗,與融云正確分析場(chǎng)景的特點(diǎn),進(jìn)而采取有效對策密切相關(guān)。此次融云在WICC上的技術(shù)分享,希望幫助開(kāi)發(fā)者了解到,在單群聊及聊天室這樣典型的消息分發(fā)場(chǎng)景下,通信云技術(shù)如何對高并發(fā)業(yè)務(wù)進(jìn)行支撐。通過(guò)高并發(fā)系統設計及最佳實(shí)踐的解讀,融云希望引領(lǐng)業(yè)界技術(shù)領(lǐng)袖一起,持續推動(dòng)通信云技術(shù)對5G多應用場(chǎng)景的服務(wù)性能優(yōu)化與提升。