當前位置: 華文星空 > 知識

技術解碼 | IM全球智能通訊之接入排程服務

2021-06-16知識

人類社會對通訊的強需求,推動著通訊技術的不斷進步。從車馬郵驛到萬物互聯,通訊的距離、速度、傳播物件、傳輸網絡等都發生了革命性的變化。

在流動互聯網時代,即時通訊是一種最基礎的產品場景。騰訊雲即時通訊IM(Instance Message)基於QQ超過20年的IM社交領域積累開發,僅需植入SDK 即可輕松整合聊天、會話、群組、資料管理等能力,幫助產品實作文字、圖片、短語音、短影片等富媒體訊息收發,支持各大平台小程式接入使用,全面滿足通訊需要。

騰訊雲IM旨在為客戶提供簡單接入、穩定必達、覆蓋全球、場景豐富、安全可靠的即時通訊平台能力。從功能層次上看,整個IM平台可以分為終端、接入層、邏輯層、儲存層。再加上排程、監控、配置等各個平台營運系統,即構成了整個IM系統。

本文將詳細介紹騰訊雲IM在接入及排程方面的最佳實踐。

接入層為各種類別的終端提供全球範圍統一聯網接入、排程、加解密、鑒權、路由轉發、頻控等核心能力,另外具備防重放、防DDos等安全防護能力。在接入類別方面,提供Android/IOS/Windows/Web/小程式等全類別覆蓋的終端接入,同時為IM後台提供RestAPI統一接入,回呼客戶服務的統一出口。

在覆蓋度方面,騰訊雲IM在全球各主要國家都有部署,全球加速節點超過2500個。對於多地域多節點的接入,為了實作最優接入,讓使用者達到最優體驗(登入成功率、收發訊息時延、穩定性等),終端和後台在設計聯網排程策略時,需要對各個方面都做細致考慮。下來騰訊雲IM透過在即時通訊領域內超過20年累積的接入排程經驗,分享騰訊雲IM在獲取IP列表、選址、防孤島、網絡質素評優、以及精細化營運等幾個方面的實作策略。

1、獲取接入IP列表 業界常用的做法有兩種,一種是給APP分配一個網域名稱,透過網域名稱解析直接獲得存取點。透過為網域名稱配置地域營運商排程規則,實作網域名稱解析就近接入;另一種是直接給APP hardcode或下發一批IP地址,APP利用簡單純群ping跑馬,哪個IP先回來就選哪個IP進行聯網。這兩種做法一個優勢就是邏輯簡單,容易實作。但劣勢也很明顯,例如,DNS劫持或DNS故障導致無法獲取IP列表、外網波動時要麽無法排程要麽會全部跑到同一個IP上,引起服務過載、群ping邏輯無法選到最優存取點等等。和常見做法不同,騰訊雲IM終端可以透過多種方式獲得IP列表。APP首次使用時,可以透過httpdns,anycast介面拉取,localdns網域名稱解析等多種方式主動獲取存取點IP。客戶端連線到IM後台後,後台會主動下發IP列表。列表包含最優、次優存取點,以滿足最優接入和容災容錯的需求。主動下發排程列表和指令的方式,可以實作使用者的精準排程和即時遷移。 2、建聯策略 客戶端在獲取到IP列表之後,啟動與接入層之間建立TCP長連線。客戶端建聯時需要考慮多方面的問題。1)失敗重連機制:客戶端如果與接入層建聯失敗或者感知連線異常關閉後,則應啟動重連。重連時選擇IP列表中下一個IP,同時按照有最大閾值的指數時間增長間隔重連,防止網絡波動等異常給後台造成雪崩。2)長連線維持:考慮到TCP建聯的成本,客戶端與接入層之間需要維持長連線。因為營運商中間網絡會話存在超時回收,因此客戶端需要在會話超時時間內發起封包,如果沒有業務封包,則應該及時發送心跳包維持長連線。客戶端在一定時間內如果連續出現多個請求包或心跳包響應超時,則可判定長連線異常。接入層也可以主動push連線探測包,以判斷連線是否正常。

3)孤島問題:接入層孤島問題是指客戶端到接入層IDC節點之間公網存取正常,心跳收發也正常,但是接入層到各個業務系統之間的內網存取異常,這時接入層無法正常轉發業務請求,造成客戶端請求超時。客戶端在一段時間內,出現連續N個不同業務包超時時,則應該重連到IP列表中的容災節點。 3、網絡質素評優 如果說排程系統是IM的指揮官,那麽網絡質素評優系統就是這個指揮官的軍師,給排程系統提供最優的決策方案。排程系統利用網絡質素評優系統實作最優接入,網絡波動即時幹預等能力。騰訊雲IM在構建和最佳化網絡質素過程中,探索出一些設計思路和經驗。

1)丟包時延加權演算法:網絡質素評優系統以閘道器維度來評測該閘道器的網絡質素,並生成該閘道器的最優排程列表(包括最優次優,精確到IP+埠),每個質素數據會涉及到該閘道器到各存取點的時延rtt、丟包率c及超時時間D這三個指標,所以在計算最優接入前先要按照加權方式把這三個數據統一量化成一個數值。 我們透過多種數據建模,並利用 ABTest進行上千次使用者質素提升對比,最終探索出數值的計算公式 t=rtt+Dc/(1-c) ,另外考慮到國內網絡實際情況,以及質素評優在計算時可能存在偏差,所以在計算最優列表時會對同營運商接入自動減去一定權值,確保在數據接近情況下按同營運商接入。2)臟數據剔除:由於公網環境的多樣性和復雜性,任何模型產生的質素數據,都會存在臟數據情況。我們分析了一下,發現我們每天產生的質素數據中,臟數據約占10%,如果不辨識出這些臟數據並做剔除處理,那麽這個量級會影響到質素評優系統對最優排程列表的計算,導致無法給到使用者選擇最優接入,騰訊雲IM根據依據多年的探索,最終設計出一種簡單實用的臟數據剔除演算法,原理很簡單,就是利用同一時刻同一個閘道器到同個存取點生成的質素數據應該趨於一致的思想,對差異較大數據做辨識並自動剔除。

3)平滑rtt演算法:對於持續的探測數據,我們嘗試過算術平均、幾何平均、時間序列及平滑rtt演算法,最終從效果來看,平滑rtt演算法效果最優。

4、精細化排程 對於使用者排程,除了考慮速度質素,還需要考慮接入層容量、容災容錯等因素,實作IP、IDC、營運商、地域級別的使用者即時排程。根據統計,平均每天外網抖動次數超過200次,原因多種多樣,比如路線被挖斷,營運商割接等。從影響來看,這些抖動可能會導致最優路徑變差,甚至不可用,這需要排程系統能及時辨識並把使用者重新排程到相對最優的存取點。例如,2014年12月3日,重慶聯通到全國各地質素都出現大的丟包,預設策略是排程到深圳聯通,其中深圳聯通丟包率高達40%。網絡質素評優系統分鐘級感知到重慶聯通網絡發生變化,並立刻重新生成最優接入列表,把重慶聯通使用者從深圳聯通IDC排程到深圳電信IDC存取點,從而降低對使用者的影響。我們采用了ABTest對比方法,保證有約20%使用者不使用網絡質素評優系統排程排程,其他80%使用者使用網絡質素評優系統排程。

5、排程演習 所有好的排程機制,如果非週期性演習,那麽到了真正啟用時,往往會發現就是一堆定時炸彈,或無法生效,或產生其他極端的副作用,所以需要建立常態化的排程演習,透過演習來保證策略的持續有效性。

接入節點覆蓋和最優排程,解決了第一公裏傳輸問題。對於長距離的海外傳輸,中間傳輸質素對整個系統的體驗同樣至關重要。騰訊雲通訊IM透過增加中繼節點、智能路由、QUIC協定加速、專線傳輸、多IDC服務就近尋址發現等加速機制保證IM在全球的體驗上真正實作連得上、連得快、連得穩的目標。

1、增加中繼 傳輸層是端到端的協定,增加中繼是指將長距離的端到端傳輸,分割成多段傳輸層代理中轉的模式。設鏈路最大頻寬時延積BDP為b,最大頻寬為B,RTT為t,增長到最大視窗需要的時間T=log2b*t=log2(B*t)*t。增加中繼,分段的RTT變小,分段間的傳輸層視窗調整更快,因此可以更快達到路線的吞吐量。另外,某一段丟包,丟包發現和恢復快,並且不影響其他段的傳輸。 2、QUIC傳輸協定 傳統的傳輸協定最佳化方式,一般指最佳化TCP擁塞控制演算法,例如基於頻寬測量的BBR演算法等。但是TCP重傳歧義的缺陷,終究無法完全克服。現在越來越多的業務,使用基於UDP實作的QUIC協定實作可靠傳輸加速,事實上QUIC已經是HTTP3的標準。騰訊雲IM加速傳輸使用QUIC協定進行數據中轉。 3、最優路徑

把全球範圍的IDC節點作為頂點,節點之間的互聯作為邊,就構成了一張雙向拓撲圖。互聯節點透過相互探測,可以獲取節點間的延時rtt和丟包率loss。那麽,節點之間的距離d=c*rtt/(1-loss),其中c為光速常量。將距離作為拓撲權重,就形成了一張雙向帶權圖。基於已有的拓撲圖,並結合最優排程選擇的接入節點和出口節點,使用Dijkstra演算法即可計算最短路徑。下圖是選擇的部份節點之間傳輸,直連和最優路徑加速之後的延時對比。

4、回呼智能尋址 騰訊雲IM雲,透過統一的多地出口Proxy集群回呼客戶第三方HTTP(S)服務時,由於外部網絡環境以及第三方業務的不可預知性,業務機器需要選擇Proxy機器作為存取第三方HTTP(S)服務的最優出口,做到存取耗時最短,成功率最高,並且能夠自適應網絡波動和自恢復。

我們透過在Proxy出口機器獲取和第三方客戶服務的TCP連線Rtt資訊和業務的成功率作為出口決策的指標。例如,客戶服務在南京部署,那麽各地出口Proxy探測結果比較,上海最優,因此業務會選擇上海出口存取客服服務。下圖可以看出,相比隨機出口,回呼智能出口尋址在提升回呼成功率和降低延時有明顯最佳化效果。

騰訊雲IM接入層在單機接入和處理能力方面進行了持續的效能最佳化。利用vtune、perf、strace、gprof等各種效能分析工具和基礎監控,分析服務在作業系統層面和業務層面,對CPU、記憶體、網絡、磁盤等資源使用的效能瓶頸。在支持加解密、打解包、壓縮、監控匯聚、頻控、包中轉等邏輯的情況下,在8核16G記憶體的機器上,可以支持到70w線上和接近10wpps的外網包量。

1、系統參數調優 1)增大somaxconn值2)增大監聽backlog3)開啟tcp_syncookies4)關閉timestamp5)增大route cache條目6)減少initial RTO值7)CPU中斷最佳化 2、業務邏輯最佳化 衡量接入層是否強大的一個核心指標就是看接入層單機支持同時線上數和處理的包量。這意味著程式需要盡可能減少每個請求消耗的cpu和每條連線消耗的記憶體,從而支持更多的線上量。我們經過多次的調優後,總結出接入層可以考慮的幾個最佳化方向:

1)邏輯處理全異步化。2)使用者session陣列化,利用fd做index,加快查詢速度。

3)減少加鎖粒度,盡量使用迴圈佇列,或基於CAS原理做成偽無鎖數據結構;對數據按執行緒數做邏輯拆分,進行無鎖化設計。

4)慎用map、set這種非O(1)的數據結構,需要的話考慮用hash_map、hash甚至陣列來替代。

5)記憶體分配使用tcmalloc,加快分配速度。

6)日誌使用direct io直接落地硬碟,主要為了減少占用系統cache,導致在記憶體緊張時出現swap而影響程式效能。

7)struct中各欄位按字節對齊原理排序,防止空洞。

8)減少字串直接比較,可以改為先比較前4字節或8字節,符合條件後再進行完整比較。

9)程式碼編譯最佳化,例如部份頻繁呼叫且耗時的計算邏輯,單獨成檔,加O2編譯選項進行編譯。 3、富媒體傳輸最佳化 1)多連線多分片上傳。2)預建連預發送。在使用者選圖片時客戶端就先和後台建立連線,並開始發送使用者選到的第一張圖片的第一個分片,根據統計,使用者選到第一張圖片並最終會發送出來的概率超過90%。3)支持秒傳。當使用者要發送圖片時,如果我們發現圖片已經在後台存在了,這時不用真實發送圖片,只需要給後台發送一條圖片發送成功的信令即可。4)斷點續傳。

1、存取點 clb提供vip到機器例項的埠轉發能力,clb埠探測能力能夠實作機器例項故障的自動遮蔽。結合測速系統和容量排程系統,接入層提供機器例項、IP、IDC、營運商、地域等多個維度的故障自動排程能力。 2、頻控能力 終端SDK在實作時需要對建聯以及介面發包速率做底層控制,避免上層不恰當使用造成頻繁的建聯和介面請求,給接入層和後台造成負載壓力。接入層提供使用者、客戶、介面等多維度的請求頻率控制能力,為接入層和業務後台提供保護。 3、沙箱排程 開發者對SDK的使用差異,客戶端版本叠代,異常邏輯等各種因素,可能造成終端異常。比如持續的建聯斷鏈,持續高頻發送特定介面請求等,造成接入層資源的大量耗費。騰訊雲IM接入層建設了沙箱集群環境,對於異常的客戶或SDK版本,可以排程到沙箱集群環境,避免對其他客戶造成影響。 4、過載保護 對於接入層來說,過載保護包括兩部份,一是對本身的過載保護,二是對後端的過載保護。1)對接入層的過載保護:

  • 由排程系統的動態均衡和容量保護策略來做保護;
  • 單機連線數保護,超過限制會close新使用者;
  • 有請求佇列長度和延時保護,超過長度的請求或在佇列中時間超過1秒的請求均會自動丟棄;
  • 2)對業務後台的過載保護:

  • 透過請求成功上報,自動遮蔽失敗率高的機器;
  • 關閉重傳功能。業務後台出現成功率低的情況時,如果繼續重傳,則會帶來滾雪球效應,因此需要降低重傳比例,甚至適當比例的主動丟包;
  • 調整longpolling拉取時間間隔,根據訊息優先級保證高優先級訊息可靠傳遞,限制群訊息下發條數,避免直播大群群訊息這類的擴散類介面給業務後台帶來的沖擊。
  • 接入層給客戶端SDK推播對介面業務做頻率限制請求,請求包包括是否彈tips、允許下次發送該命令字的時間間隔,從SDK側攔截使用者請求,徹底減少到後台的請求量;
  • 柔性服務策略。例如當群成員資料模組出現故障,且短時間無法恢復,那麽可以臨時關閉該功能,即使使用者獲取不到群成員資料,對套用體驗影響也不大。
  • 接入層是整個IM系統的門戶,是整個服務的第一道屏障。因此,接入層對保障IM業務的安全,有至關重要的職責。 1、基礎安全 在基礎安全方面,透過騰訊雲的防DDos服務,以及門神web安全檢測能力,為騰訊雲IM業務保駕護航。 2、接入層安全 在邏輯方面,接入層需具備防重放,防串包的能力。透過引入伺服端cookie機制,校驗TCP連線上傳輸數據的有效性,防止業務重放。收到後台業務回包時,透過校驗終端連線關聯的序列號,防止下發的包出現串包。後台透過加密機制,保證數據的保密性和防篡改。透過票據校驗機制,驗證使用者身份的有效性。 3、業務後台安全 接入層在對業務後台的保護方面,提供使用者、介面、客戶、版本等各個維度的頻率控制或遮蔽能力,防止異常終端持續對後台帶來安全風險。同時接入層提供和業務安全打擊的聯動能力。

    1、控制台 一款好的雲產品,控制台體驗至關重要。控制台需要提供DAU、請求量、流量、分版本分平台等各種業務指標多維度的即時統計,精確的計費數據,監控告警,業務報表,問題分析工具集,配置變更等能力。 2、監控告警 業務的持續健康營運離不開完備的即時監控告警系統。監控系統應該包含對CPU、記憶體、磁盤、網絡、元件等基礎內容,以及業務容量負載、成功率指標、延時、業務邏輯、客戶、版本等多維度內容進行監控。結合自動化聚合分析、整體數據分析,提供智能監控營運能力。同時聯動郵件、短訊、電話、微信、企業微信等通道,分風險級別傳達告警通知。輔以定期的人工巡查,提升監控告警的準確性,避免經常性的誤告降低研發營運人員的風險意識。 3、全鏈路日誌 由於IM後台服務分模組解耦,以及內部業務以微服務模式執行,因此,終端的一個介面請求,可能在後台會產生很長的服務呼叫關系鏈。為了明確呼叫關系鏈中各階段請求響應情況,需要進行全鏈路的跟蹤。客戶端在請求介面時,產生一個trace id,各個業務後台的跟蹤日誌,需要統一上報,並帶上該trace id。這樣在偵錯階段或者定位問題時,可以根據全鏈路日誌,快速定位到是呼叫鏈中哪個環節存在問題。 4、客戶端上報 由於客戶整合方式、使用者使用習慣、所處位置、網絡環境、使用場景等各不相同,並且整個IM服務按功能分模組解耦,因此後台很難完全感知客戶端的行為。客戶端SDK可以采集使用者使用套用時,套用的執行邏輯和產生的非私密數據,並上報到IM服務平台,用於分析使用者、客戶、地域、版本、終端類別、平台等多維度的客戶端表現,包括獲取登入成功率、聯網耗時、訊息成功率等核心業務指標。 5、業務報表 業務報表可以為產品規劃和營運提供決策指引。針對客戶、場景、流程做差異化的營運策略,提升營運動作的效率最大化。基於業務數據分析的產品不斷驗證最佳化叠代,實作產品使用者與價值的持續增長。