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