在不少地方都有"數據交換"這個概念,本文所說的"數據交換" 是指在計算機網絡中,一個系統把數據傳遞給另一個系統。這很是相似於一我的要告訴另一我的一件事情。javascript
當一我的要把一件事情告訴另一我的的時候,咱們能夠經過電話、郵件、短信、IM工具或者當面說的方式來交流。這種方式相似於系統數據交換要經過 tcp、udp、管道等等的方式實現。當兩我的交流的時候,咱們須要一種共同的語言才能明白對方的意思,一樣的,兩個系統要交換數據,也須要定義一種雙方都明白的協議,咱們稱爲"數據交換協議"。php
數據交換協議的目的是讓兩個系統進行正確的數據交互。因此幾乎各類開發語言都提供了方便使用的數據交換功能。好比說使用JAVA語言的開發的系統使用 MySQL數據庫存儲數據,就是經過MySQL數據交換協議跟MySQL作數據交換;經過JAVA的RMI能夠方便的作跨機器的分佈式數據交換,RMI也就是一種數據交換協議。html
通常咱們在不一樣的系統、不一樣的語言之間交換數據的時候,咱們會選擇一種通用的交換協議或者本身定義一種容易使用的交換協議。 WebService曾經很是流行, 在Web 2.0時代,輕量級的REST協議又開始受到追捧。那麼究竟在咱們的系統中應該選擇什麼樣的協議呢?前端
選擇什麼樣的協議跟咱們的應用場景有很大的關係。咱們須要考慮咱們開發是否方便、接口是否容易發佈、是否須要考慮帶寬佔用成本、序列化和反序列化的性能、接口協議的擴展性等等。下面咱們看下幾個比較經常使用的交換協議實現。java
協議 | 實現 | 跨語言 | 性能 | 傳輸量 | 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 |
上面表格列出了一些經常使用數據交換協議的一些特性的比較。這裏並無比較好壞,只是想說明不一樣數據交換協議是有區別的,因此咱們須要在咱們的應用場景中進行選擇。git
像微博,SNS這種開放平臺、對靜態html頁面提供javascript接口調用的系統都屬於這種類型 。這種類型的特色是:github
因此在這種狀況下,須要考慮數據傳輸的帶寬消耗和數據交換協議的易用性,以及多語言支持程度。之前對於html頁面使用的javascript接口調用通常都使用XML格式,最近幾年幾乎都轉成了json格式了,由於json傳輸量更小,比XML更加容易使用。 而對於開放平臺,因爲使用的場景不少,因此須要提供多種交換協議格式。基本上都會提供XML和json。爲了提升平臺自己的性能和客戶端的性能,也能夠提供protobuf這種二進制交換協議而且增長壓縮支持,以節省帶寬傳輸和解析的性能消耗。數據庫
對於一個大型系統來講,內部服務的數據交換無處不在。從最基本和常見的數據庫數據交換、memcached緩存數據交換、消息隊列的數據交換到系統之間使用的RPC服務框架等等,均可以算做內部服務的數據交換。內部服務的特色是不用考慮防火牆,不對外開放,速度快(基本無帶寬成本)。apache
內部服務的數據交換協議的選擇空間很是大,通常須要考慮:json
對於持久化存儲來講,每一種數據交換協議其實均可以實現。通常須要根據應用場景考慮:
假設咱們的網站前端頁面展現層使用PHP語言開發,中間業務邏輯使用JAVA語言開發,那麼就涉及到跨語言數據交換的問題。只要系統不是單純的使用一種語言,那麼就必須考慮這個問題。事實上,考慮將來的擴展和需求變化問題,也最好考慮跨語言的數據交互協議。
在選擇數據交換協議的時候,咱們一樣須要考慮相似於數據庫表的?schema設計時的擴展問題。好比一個提供用戶信息的數據交換協議接口,如今包含用戶名、性別、住址的信息,在升級過程當中,增長了一個最後登陸的IP信息。若是不考慮數據交換協議升級帶來的影響,極可能會致使之前的客戶端出現異常或者舊的數據沒法正確解析的問題。
兼容協議的巧用很是有用,新產品兼容提供現有成熟的數據交換協議,能夠下降使用門檻和產品的開發速度。好比新浪開源的memcacheQ就使用了memcached協議。
數據交換協議的各類通用開源實現很是多,數據交換協議只是一個很是寬泛的說法,其實只要實現了數據的序列化和反序列化 ,那麼就能夠說是一個能夠交換數據的協議。數據交換協議的性能其實就是序列化和反序列化的性能,若是加上RPC,那麼跟RPC實現自己的性能也有很是大的關係。
個人新浪微博@sunli1223 ,歡迎與我討論。
參考連接: