當前位置:
首頁 > 科技 > 實時介面數據也能就近訪問?細說如何用CDN提升App性能

實時介面數據也能就近訪問?細說如何用CDN提升App性能

CDN-Content Delivery Network

我們先來定義下什麼是CDN。內容分發網路(CDN)是一種由分散式伺服器構成的系統,它會根據用戶所處的地理位置,數據內容(通常是網頁)的來源,來向用戶分髮網頁內容。但目前這個互聯網發達的時代,CDN已經不僅僅用來分髮網頁內容。

以Cloudflare Workers【1】為例,除了利用它的網路來分發內容,你甚至還可以在它的邊緣節點上部署運行你的代碼。「可以部署或運行Javascript代碼,這能夠幫助你將代碼與用戶終端設備解耦合,比如支持通過編程實現路由、過濾等功能」。

在當前這個爆炸式發展的互聯網時代,高可擴展性是至關重要的能力。CDN和邊緣計算(Edge Computing)將會進一步融合式發展。

實時介面數據也能就近訪問?細說如何用CDN提升App性能

實時數據的獲取——推、拉

目前很多強調實時性的應用需要推送和拉取的數據。被動推送和主動拉取都是非常常見及簡單的工程問題,比如應用初始化的過程中可以從CDN拉取歷史數據,然後再由其他服務來推送更新數據。

但是,我們想一想能否將這兩種機制組合在一起呢?

通過代理來連接Fastly和Fanout

Fastly是一個邊緣計算平台(Edge Cloud Platform),它可以使應用在網路的邊緣節點執行和提供服務。 本質上,它提供的是高度可擴展的「數據拉取-響應」服務,可以實時監聽和響應用戶的請求。 相比傳統的CDN,Fastly也可以緩存靜態內容,同時可以部署和運行應用邏輯。

另一方面,Fanout則是具備高度可擴展性的數據推送服務,比如用作高性能的反向代理服務,通過長鏈接為客戶端實時推送數據。

Fastly和Fanout可以組合使用。它們作為一個整體可以當作源伺服器的反向代理,通過Fastly來代理到Fanout的流量,這樣客戶端就不用直接請求你的源伺服器。這會帶來一些好處:

  • 高可用和高可擴展性,這點毋庸置疑

  • 緩存初始數據

  • 緩存Fanout的指令,這點需要特別說明:Fanout的一些行為是通過指令來配置的。比如傳輸模式,訂閱的channel等等。通常,這些指令是通過源伺服器的response來獲取(一類特殊的header,被稱為Grip)。Fastly可以在獲取一次response後緩存這些指令。

映射網路流

通過組合使用Fanout和Fastly,我們就可以重構這個「推-拉」模型中的網路數據流,下面我們來仔細看看它們是如何工作的:

假設我們有一個HTTP Endpoint是 /stream,它會返回一些初始數據,並且在有新數據產生後推送給連接的客戶端。配合Fanout,我們可以讓這個Endpoint返回帶有instruction的response:(以response header為例)

HTTP/1.1 200 OK
Content-Type: text/plain
Content-Length: 29
Grip-Hold: stream
Grip-Channel: updates

{"data": "current value"}

當Fanout從源伺服器收到這樣的response,會將它轉換成HTTP streaming的response:

HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked
Connection: Transfer-Encoding

{"data": "current value"}

這樣,Fanout到源伺服器的請求就完成了,但是客戶端到Fanout的請求(連接)仍然是open的狀態,用這樣的時序圖來表示:

實時介面數據也能就近訪問?細說如何用CDN提升App性能

因為Fanout到源伺服器是短鏈接的請求/響應模式,可以通過Fastly來轉換成長連接:

實時介面數據也能就近訪問?細說如何用CDN提升App性能

這樣當再有客戶端請求/stream這個endpoint時,源伺服器就完全不會參與進來:

實時介面數據也能就近訪問?細說如何用CDN提升App性能

換句話說,Fastly會給Fanout返回相同的response,帶著特殊的headers已經那些初始數據,Fanout到客戶端則維護streaming連接。

上述過程,我們只解決了「拉」的過程,還需要實現新數據被實時「推送」給Fanout(客戶端)。

清除fastly的緩存

當源伺服器的數據改變時我們需要清除掉fastly上的緩存來更新它。

還是上文的例子,假如/stream endpoint的數據產生變化,我們就需要清除fastly的緩存並同時將新數據廣播給fanout。

下面這個時序圖描述了一個更複雜的場景,已有的客戶端將被推送新的數據,之後再來一個新客戶端連接:

實時介面數據也能就近訪問?細說如何用CDN提升App性能

高效的實現流控

在這種混合架構下,為了提高效率,理想的數據讀寫模型是:

  • 數據訪問:每秒若干新的讀

  • 數據更新:每分鐘若干寫

  • 數據分發:毫秒級投遞

如果你的數據每秒都會產生變化,那最好是不要每次數據變更都清除緩存。(容忍一定程度的數據不一致性)

例如在高峰時期,我們可以限制清除的頻率,大部分讀請求還是由緩存數據來響應,稍候再更新數據。

Demo

這裡提供了託管在GitHub上的demo應用源代碼,它利用fastly和fanout提供一個live

counter服務。

請求會先到fanout,然後到fastly,最終傳遞到一個由Django實現的backend server。這個服務實現了簡單的計數器邏輯,當計數器的值更新了,fastly的緩存會被清除掉,同時再通過fanout發送出去。清除和更新的過程都由流控來限制,以儘可能提高緩存的效率。

腦洞一下

我們可以設計一個消息內容分發網路,它由完全是地理位置分布的若干組server構成,可以提供近實時的動態內容和靜態內容分發。

這種新類型的CDN網路可以使得數據處理延伸到網路邊緣,不用管應用本身的源服務位於哪裡。這將為移動應用和IoT應用形態帶來巨大的想像空間。

英文原文:

https://hackernoon.com/powering-your-app-with-a-realtime-messaging-cdn-13d92a6df5f3

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 高可用架構 的精彩文章:

PHP也能實現區塊鏈?基礎結構篇
螞蟻金服研發的金融級分散式中間件SOFA背後的故事

TAG:高可用架構 |