概要
有人常問,云巴實時通信系統(tǒng)到底提供了一種怎樣的服務,與其他提供推送或 IM 服務的廠商有何本質區(qū)別。其實,從技術角度分析,云巴與其它同類廠商都是面向開發(fā)者的通信服務,宏觀的編程模型都是大同小異,真正差異則聚焦于產品定位,業(yè)務模式,基礎技術水平等諸多細節(jié)上。本文暫不討論具體產品形態(tài)上的差異,著重從技術角度淺談實時通信的編程模型。
什么是實時通信
「實時」(realtime) 一詞在語義層面上隱含著對時間的約束(real-time constraint),在工程上,我們習慣對「需要在一定時間內」 完成的操作稱為「實時操作」。通常,實時可細分為 「軟實時」(soft realtime),「準實時」(firm realtime)和 「硬實時」(hard realtime)。它們之間的差異,簡單來說,就是對無法在指定時間區(qū)間內(deadline)完成事務的容忍程度。維基百科上對這三者有如下 解釋 :
Hard – missing a deadline is a total system failure.
Firm – infrequent deadline misses are tolerable, but may degrade the system's quality of service. The usefulness of a result is zero after its deadline.
Soft – the usefulness of a result degrades after its deadline, thereby degrading the system's quality of service.
假如我們把無法按時完成任務(missing a deadline)稱為 異常事件 ,那么硬實時系統(tǒng)無法容忍異常事件;準實時系統(tǒng)則可容忍極少量的異常事件,但超過一定數量后系統(tǒng)可用性為 0;軟實時系統(tǒng)可容忍異常事件,但是每發(fā)生一次異常事件,系統(tǒng)可用性降低。
綜上所述,我們可以舉例:
火星上的無人探測器是硬實時系統(tǒng),因為一次異常事件就極有可能導致探測器不可用,同理可類推核電站的監(jiān)控系統(tǒng),軍用無人機系統(tǒng),遠程導彈的導航系統(tǒng)等一系列軍工產品;
金融交易系統(tǒng)是準實時系統(tǒng),此類系統(tǒng)可容忍極少數的交易故障,一旦故障次數增加,系統(tǒng)就會陷入崩潰狀態(tài);
短信 / 手機推送 / 電商購物等都是軟實時系統(tǒng)。對于此類系統(tǒng),用戶都可以容忍異常事件,但是太多的異常事件則會大幅降低系統(tǒng)可用程度,用戶體驗急劇下滑。
就目前來說,絕大多數互聯網產品(甚至可以說是 100%)都是軟實時系統(tǒng)。 云巴實時通信系統(tǒng)的目標則是要做一個高可用的軟實時系統(tǒng) 。
一個最簡單的實時通信編程模型
在軟件工程中,很多復雜的項目其實都可以用一個非常簡潔的模型來概括。正如愛因斯坦所說的:「一切都應該盡可能地簡單,但不要太簡單」(Everything should be made as simple as possible, but not simpler)。雖然這是描述物理世界的經驗之談,但同樣適用于計算機領域,將物理世界的關系投射到某種人為語言(物理公式/計算機編程語言),其規(guī)律其實都是共通的。
讓我們假設這么一個簡單的場景: 對 10 個客戶端發(fā)送一條消息 。
這個需求其實可以用偽碼表示為:
for (i..10) {
send_message(get_socket(i))
}
如果下圖所示:

在這個簡單的需求下,我們只需要讓這 10 個客戶端分別跟服務器建立 TCP 連接(本文暫時只討論 TCP 協(xié)議),然后遍歷地發(fā)送消息即可。顯而易見,這是一個O(N) 復雜度的邏輯。
基于這個簡單的模型,我們可以認為一條消息從發(fā)出到接收,有以下幾個延時:
網絡延遲,一般是一個較為穩(wěn)定的值,比如從北京到深圳,ping 延遲大約為 40 ms 左右;
系統(tǒng)處理延遲,較之網絡延遲,該值變化幅度較大,且可能因處理請求數的增加而急劇增大;
云巴實時通信系統(tǒng)以 200 ms 延遲作為總延遲標準,也就是說,假如網絡鏈路是從北京到深圳,除去網絡延遲的 40 ms,要想達到 200 ms 的通信時間,系統(tǒng)延遲必須小于 160 ms。
可以想象,當客戶端數量達到一定數量級(比如百萬級別)時,以上系統(tǒng)模型的實時性將面臨極其嚴峻的考驗。
分而治之
在海量用戶下保持穩(wěn)定的實時性,其實很多時候就只有一個手段: 分而治之 。
圖 1 表示的是單機處理情況。當單機的處理能力,帶寬都無法應對客戶端數量急劇增加的時候,我們就必須將線路進行分割。而且圖 1 只體現了推送的意圖(單向),但通信往往是一個雙向的概念,綜上,我們將 圖 1 改成下面的 圖 2 :