在 muduo 中實現 protobuf 轉碼器與訊息分發器

來源:互聯網
上載者:User

本文是《一種自動反射訊息類型的 Google Protobuf 網路傳輸方案》的延續,介紹如何將前文介紹 的打包方案與 muduo::net::Buffer 結合,實現了 protobuf codec 和 dispatcher。

Muduo 的 下載地址: http://muduo.googlecode.com/files/muduo-0.1.9-alpha.tar.gz ,SHA1 dc0bb5f7becdfc0277fb35f6dfaafee8209213bc ,本文的完整代碼可線上閱讀 http://code.google.com/p/muduo/source/browse/trunk/examples/protobuf/codec/ 。

考慮 到不是每個人都安裝了 Google Protobuf,muduo 中的 protobuf 相關樣本預設是不 build 的,如果 你的機器上安裝了 protobuf 2.3.0 或 2.4.0a,那麼可以用 ./build.sh protobuf_all 來構建 protobuf 相關的 examples。

在介紹 codec 和 dispatcher 之前,先講講前文的一個未決問題 。

為什麼 Protobuf 的預設序列化格式沒有包含訊息的長度與類型?

Protobuf 是經過 深思熟慮的訊息打包方案,它的預設序列化格式沒有包含訊息的長度與類型,自然有其道理。哪些情況 下不需要在 protobuf 序列化得到的位元組流中包含訊息的長度和(或)類型?我能想到的答案有:

如果把訊息寫入檔案,一個檔案存一個訊息,那麼序列化結果中不需要包含長度和類型,因為從文 件名和檔案長度中可以得知訊息的類型與長度。

如果把訊息寫入檔案,一個檔案存多個訊息,那麼序列化結果中不需要包含類型,因為檔案名稱就代 表了訊息的類型。

如果把訊息存入資料庫(或者 NoSQL),以 VARBINARY 欄位儲存,那麼序列化結果中不需要包含長 度和類型,因為從欄位名和欄位長度中可以得知訊息的類型與長度。

如果把訊息以 UDP 方式發生給對方,而且對方一個 UDP port 只接收一種訊息類型,那麼序列化結 果中不需要包含長度和類型,因為從 port 和 UDP packet 長度中可以得知訊息的類型與長度。

如果把訊息以 TCP 短串連方式發給對方,而且對方一個 TCP port 只接收一種訊息類型,那麼序列 化結果中不需要包含長度和類型,因為從 port 和 TCP 位元組流長度中可以得知訊息的類型與長度。

如果把訊息以 TCP 長串連方式發給對方,但是對方一個 TCP port 只接收一種訊息類型,那麼序列 化結果中不需要包含類型,因為 port 代表了訊息的類型。

如果採用 RPC 方式通訊,那麼只需要告訴對方 method name,對方自然能推斷出 Request 和 Response 的訊息類型,這些可以由 protoc 產生的 RPC stubs 自動搞定。

對於最後一點,比方說 sudoku.proto 定義為:

service SudokuService {  rpc Solve (SudokuRequest) returns (SudokuResponse);}

那麼 RPC method Sudoku.Solve 對應的請求和響應分別是 SudokuRequest 和 SudokuResponse。在發送 RPC 請求的時候,不需要包含 SudokuRequest 的類型,只需要發送 method name Sudoku.Solve,對方自知道應該按照 SudokuRequest 來解析(parse)請求。這個例子來自我的半 成品項目 evproto,見 http://blog.csdn.net/Solstice/archive/2010/04/17/5497699.aspx 。

對於上述這些情況,如果 protobuf 無條件地把長度和類型放到序列化的位元組串中,只會浪費 網路頻寬和儲存。可見 protobuf 預設不發送長度和類型是正確的決定。Protobuf 為訊息格式的設計 樹立了典範,哪些該自己搞定,哪些留給外部系統去解決,這些都考慮得很清楚。

只有在使用 TCP 長串連,且在一個串連上傳遞不止一種訊息的情況下(比方同時發 Heartbeat 和 Request/Response),才需要我前文提到的那種打包方案。(為什麼要在一個串連上同時發 Heartbeat 和業務訊息?請見陳碩《分布式系統的工程化開發方法》 p.51 心跳協議的設計。)這時候我們需要一 個分發器 dispatcher,把不同類型的訊息分給各個訊息處理函數,這正是本文的主題之一。

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。