REST架構風格的性能爲何比其他的架構風格更好

今天與一起翻譯Fielding論文的朋友楊光討論技術問題,楊光認爲因爲REST是基於文本來進行通信,所以其性能肯定不如基於二進制格式的通信協議 好。因爲這是一個對於REST的明顯的誤解,所以我覺得有必要專門在這裏澄清一下。以下是我們的討論內容,David是我,Allen是楊光。


David: 他們客戶端用C#,服務器端用Java,準備用RIA+REST+Java的架構。C#也有類似XMLHttpRequest的對象。
Allen: 爲啥是這麼怪異的結構,都用.net得了~
David: 那是不可能的,企業應用服務器端主要還是用Java。
Allen: 那就都用java
David: C#與Java通信,主要有兩種方式:基於SOAP或者基於HTTP。基於HTTP就是REST了。
David: 如果基於SOAP,肯定會影響開發效率。另外性能也會差很多。
Allen: 無論什麼方法,性能都要比單一使用一種平臺慢的
David: 不會的,REST只用到了HTTP。
David: 單個平臺,客戶服務器間走二進制的通信協議,性能也許比REST要好,那就與HTTP無關了。不過這樣做不夠靈活,客戶端與服務器耦合太緊。
Allen: 怎麼不會呢?rest也沒有直接用servlet快啊。
David: REST當然可以直接用Servlet提供服務
David: 但是你基於Servlet,很多日常事務的處理都要自己做,例如URI到處理器的映射。所以最好是有一個框架幫助你做這些事情。
Allen: 一種是通過xml或者json,一種是直接序列化的參數,性能還是不一樣吧
David: REST沒有說一定要用XML或者一定要用JSON格式,任何基於文本的格式都是允許的。
Allen: 但是肯定不是序列化的
David: 你說的序列化是什麼意思呢?
Allen: 我的意思是C#和java通信,走的肯定是語言外的通道,使用rest也是通過語言外的通道傳輸數據。如果是一個平臺,那麼就可以走語言內的通道,這個和rest沒關係了。
David: 這只是一種猜測。所謂的語言內的通道,對於Java來說,只有RMI,連SOAP都不算。
Allen: 嗯,我也是空想,實際做出來最有說服力。到時候你可以把資訊的經驗和我分享一下。
David: RMI是RPC的風格,中間傳輸二進制數據,性能應該比HTTP的純文本稍微高一些,但是這樣做有很多的代價。
David: 那篇論文將來我們都需要反覆多看幾次,實際上REST是權衡很多種架構風格之後的結果,已經能夠得到最佳的性能了。
David: 性能不單純取決於傳輸數據是二進制還是純文本。我告訴你爲什麼。
David: 因爲二進制數據的語義對於中間組件是不可見的,它就無法做有效的緩存,當然也無法確定此數據是否會對安全構成威脅。
David: REST強調通信語義對於中間組件的可見性,這樣可以改善性能和可伸縮性。
David: 所謂的中間組件,瀏覽器就是一種。瀏覽器可以根據通信的語義來確定數據有沒有發生改變,從而進行有效的緩存。
David: RMI傳輸數據再有效,它的數據也無法做有效的緩存。因此RMI的性能未必比REST好,況且不能緩存會帶來嚴重的可伸縮性問題。
David: 這些思想其實在論文中都有很詳細的描述,你再看一遍就全明白了。
Allen: 這麼說也有道理,等有實現rest的經驗後,就一切都明白了
發佈了7 篇原創文章 · 獲贊 1 · 訪問量 3742
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章