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