文章目錄
- 開放式
- 內部服務
- 持久化儲存
- 跨語言
- 資料交換協議可升級
- 相容協議的巧用
- 總結
在很多地方都有“資料交換”這個概念,本文所說的“資料交換” 是指在電腦網路中,一個系統把資料傳遞給另外一個系統。這非常類似於一個人要告訴另外一個人一件事情。
當一個人要把一件事情告訴另外一個人的時候,我們可以通過電話、郵件、簡訊、IM工具或者當面說的方式來交流。這種方式類似於系統資料交換要通過 tcp、udp、管道等等的方式實現。當兩個人交流的時候,我們需要一種共同的語言才能明白對方的意思,同樣的,兩個系統要交換資料,也需要定義一種雙方都明白的協議,我們稱為“資料交換協議”。
資料交換協議
資料交換協議的目的是讓兩個系統進行正確的資料互動。所以幾乎各種開發語言都提供了方便使用的資料交換功能。比如說使用JAVA語言的開發的系統使用 MySQL資料庫儲存資料,就是通過MySQL資料交換協議跟MySQL做資料交換;通過JAVA的RMI可以方便的做跨機器的分布式資料交換,RMI也就是一種資料交換協議。
一般我們在不同的系統、不同的語言之間交換資料的時候,我們會選擇一種通用的交換協議或者自己定義一種容易使用的交換協議。 WebService曾經非常流行, 在Web 2.0時代,輕量級的REST協議又開始受到追捧。那麼究竟在我們的系統中應該選擇什麼樣的協議呢?
如何選擇資料交換協議
選擇什麼樣的協議跟我們的應用情境有很大的關係。我們需要考慮我們開發是否方便、介面是否容易發布、是否需要考慮頻寬佔用成本、序列化和還原序列化的效能、介面協議的擴充性等等。下面我們看下幾個比較常用的交換協議實現。
協議 |
實現 |
跨語言 |
效能 |
傳輸量 |
RPC |
xml |
廣泛 |
幾乎所有 |
低 |
很大 |
N(可實現) |
json |
廣泛 |
大量 |
一般 |
一般 |
N(可實現) |
php serialize |
PHPRPC |
大量 |
一般 |
一般 |
Y |
hessian |
hessian |
大量 |
一般 |
小 |
Y |
thrift |
thrift |
大量 |
高 |
小 |
Y |
protobuf |
protobuf |
大量 |
高 |
小 |
N(可實現) |
ice |
ice |
大量 |
高 |
小 |
Y |
avro |
Apache Avro |
少量 |
高 |
小 |
Y |
messagepack |
messagepack |
大量 |
高 |
小 |
Y |
上面表格列出了一些常用資料交換協議的一些特性的比較。這裡並沒有比較好壞,只是想說明不同資料交換協議是有區別的,所以我們需要在我們的應用情境中進行選擇。
開放式
像微博,SNS這種開放平台、對靜態html頁面提供javascript介面調用的系統都屬於這種類型 。這種類型的特點是:
- 調用方不完全可控,而且是針對公網的,你可能不知道是誰、是什麼語言、是什麼方式在調用你提供的資料介面;
- 介面訪問量一般都非常大,要求具有很高的效能和輸送量;
- 需要考慮安全問題,外部提交的資料可能不是合法的。
所以在這種情況下,需要考慮資料轉送的頻寬消耗和資料交換協議的易用性,以及多語言支援程度。以前對於html頁面使用的javascript介面調用一般都使用XML格式,最近幾年幾乎都轉成了json格式了,因為json傳輸量更小,比XML更加容易使用。 而對於開放平台,由於使用的情境很多,所以需要提供多種交換協議格式。基本上都會提供XML和json。為了提高平台本身的效能和用戶端的效能,也可以提供protobuf這種二進位交換協議並且增加壓縮支援,以節省頻寬傳輸和解析的效能消耗。
內部服務
對於一個大型系統來說,內部服務的資料交換無處不在。從最基本和常見的資料庫資料交換、memcached快取資料交換、訊息佇列的資料交換到系統之間使用的RPC服務架構等等,都可以算作內部服務的資料交換。內部服務的特點是不用考慮防火牆,不對外開放,速度快(基本無頻寬成本)。
內部服務的資料交換協議的選擇空間非常大,一般需要考慮:
- 資料交換協議的效能
- 是否需要跨語言支援
- 資料交換協議的訊息體大小
持久化儲存
對於持久化儲存來說,每一種資料交換協議其實都可以實現。一般需要根據應用情境考慮:
- 是否人工可閱讀
- 儲存的空間消耗
- 序列化和還原序列化的效能
- 是否經過壓縮
跨語言
假設我們的網站前端頁面展示層使用PHP語言開發,中間商務邏輯使用JAVA語言開發,那麼就涉及到跨語言資料交換的問題。只要系統不是單純的使用一種語言,那麼就必須考慮這個問題。事實上,考慮未來的擴充和需求變化問題,也最好考慮跨語言的資料互動協議。
資料交換協議可升級
在選擇資料交換協議的時候,我們同樣需要考慮類似於資料庫表的?schema設計時的擴充問題。比如一個提供使用者資訊的資料交換協議介面,現在包含使用者名稱、性別、住址的資訊,在升級過程中,增加了一個最後登入的IP資訊。如果不考慮資料交換協議升級帶來的影響,很可能會導致以前的用戶端出現異常或者舊的資料無法正確解析的問題。
相容協議的巧用
相容協議的巧用非常有用,新產品相容提供現有成熟的資料交換協議,可以降低使用門檻和產品的開發速度。比如新浪開源的memcacheQ就使用了memcached協議。
總結
資料交換協議的各種通用開源實現非常多,資料交換協議只是一個非常寬泛的說法,其實只要實現了資料的序列化和還原序列化 ,那麼就可以說是一個可以交換資料的協議。資料交換協議的效能其實就是序列化和還原序列化的效能,如果加上RPC,那麼跟RPC實現本身的效能也有非常大的關係。
我的新浪微博@sunli1223 ,歡迎與我討論。
參考連結:
- java序列化和還原序列化效能比較:https://github.com/eishay/jvm-serializers/wiki
- Java跨語言調用實現方案 http://rdc.taobao.com/team/jm/archives/389
關於作者
孫立,目前為去哪兒網(qunar.com)進階系統架構師。曾就職於鳳凰網、ku6和搜狐。多年互連網從業經驗和程式開發,對分布式搜尋引擎的開發,高並發,大資料量網站系統架構最佳化,高可用性,延展性,分布式系統緩衝,資料庫分表分庫(sharding)等有豐富的經驗,並且對營運監控和自動化營運控制有經驗。是開源項目phplock,phpbuffer的作者。近期開發了一個NOSQL資料庫儲存INetDB,是NoSQL資料庫愛好者。
本文已經首發於InfoQ中文站,著作權,原文為《
軟體系統開發中的資料交換協議》,如需轉載,請務必附帶本聲明,謝謝。
InfoQ中文站是一個面向中高端技術人員的線上獨立社區,為Java、.NET、Ruby、SOA、敏捷、架構等領域提供及時而有深度的資訊、高端技術大會如QCon 、線下技術交流活動QClub、免費迷你書下載如《架構師》等。