本文由位元組跳動技術團隊成員楊晨曦分享,本文經修訂修改。本文將帶大家初步了解Thrift的序列化協議,包括Binary協議、緊湊協議(類似於ProtoBuf)、JSON協議,希望能為大家的通訊協議格式選擇提供參考。
本文是下面總結的系列文章中的第 10 篇
IM通訊協議專題研究(1):pRotobuf從初學者到精通,一篇文章就夠了!》
IM通訊協議專題(二):快速了解PROTOBUF的背景、原理、用途、優缺點
IM通訊協議專題(3):從淺到深,從根源理解PROTOBUF編解碼原理”。
IM通訊協議專題(四):從Base64到Protobuf,詳解Protobuf的資料編碼原理
IM通訊協議專題研究(5):p快多少倍Rotobuf 比 JSON 更?全方位測量!》
IM通訊協議專題學習(六):教你在Android上從零開始使用Protobuf
IM通訊協議專題(七):教你在NodeJS中從零開始使用Protobuf
IM通訊協議專題(八):金蝶手寫團隊Protobuf應用實踐(原理)
IM通訊協議專題研究(9):教你在iOS上從零開始使用Protobuf
IM通訊協議專題(10):節儉序列化協議的入門(*本文)。
另外:如果您還打算系統地學習 IM 開發,我們建議您閱讀“初學者入門:從頭開始開發移動 IM”。
Thrift 是 Facebook 開源的高效能、輕量級 RPC 服務框架,是包含序列化和服務通訊能力的全棧 RPC 解決方案,支援跨平台、跨語言。
Thrift的整體架構如圖所示:
Thrift軟體棧定義清晰,各層元件松耦合可插拔,可根據業務場景靈活組合。
如圖所示
節儉本身是乙個比較大的話題,本文不會涵蓋節儉的全部內容,只介紹其中的序列化協議。
下面是如何視覺化二進位訊息格式的示例。
IDL 定義如下:
介面。現象:服務 A 訪問服務 B,業務邏輯在短時間內處理完畢,但整個請求在 15 秒內超時。service supservice ,.
例。 map */
數": {
map": [
金鑰型別","值的型別"、元素數、"金鑰 1","值 1",..
鍵 n","值 n"
例。 map": [
i64","str",1,666,"mapvalue"
list */
數": {
set/lst": [
值的型別"、元素數、"ele1","ele2","elen"
例。 lst": [
str",2,"lark","keyword"]
直接原因:修改了 idl 型別;並且只公升級了伺服器端(服務 B),客戶端(服務 A)沒有公升級。
主要原因:string 是可變長度編碼,i64 是固定長度編碼。 由於客戶端尚未公升級,因此在反序列化時,signtime 將被解析為字串型別。 可變長度編碼處於 t-l-v 模式,因此在解析時,低 4 位元組的 signtime 將轉換為字串的長度。
signtime 是乙個時間戳,乙個大整數,例如 1624206147902,轉換為二進位,如下所示:
下面的 4 個位元組轉換為十進位,如下所示:也就是說,另外 378 個位元組被讀取為簽名時間的值,該值已經超過了整個有效負載的大小,並最終導致套接字讀取超時。
注意:修改型別不一定會導致超時,但如果值的值很小,則解析值的長度也很小,因此可以在一定程度上讀取。
但是不正確的解析可能會導致各種意外情況,包括:
亂碼;
零;
錯誤:報告未知資料型別 xxx(跳過異常)。
1) 新增字段:
跳到跳過新增的字段以確保相容性。
2) 刪除字段:
編譯後的解析器是基於字段 id 的切換大小寫結構,直接相容語法結構。
3)修改欄位名稱:
它不會破壞相容性,因為二進位協議不對名稱進行編碼。
節儉有兩個例外:
乙個是框架中內建的異常
一種是 IDL 定義的異常。
框架中內建的例外情況包括:
方法名稱不正確;
訊息序列號不正確;
協議錯誤。
這些異常由框架捕獲並封裝到異常訊息中,這些訊息被反序列化為錯誤並丟擲到上層。
邏輯如下:
另一種型別的異常是 IDL 中使用者定義的,關鍵字是 exception,與 struct 沒有太大區別。
可選表示該字段是可選的,require 表示該字段是必需的。
將字段標識為可選字段後:
基型別被編譯為指標型別;
序列化將確定 null 值,如果欄位為空,則不會對其進行編碼。
之後,該字段被標識為必填字段:
原始型別被編譯為非指標型別(復合型別可選與要求無異);
序列化不確定 null 值,並且必須對欄位進行編碼。 如果沒有顯式賦值,則對預設值進行編碼(預設 null 值,或 IDL 顯式指定的預設值)。
1] Protobuf 從初學者到精通,一篇文章就足夠了!
2] 如何選擇即時通訊應用程式的資料傳輸格式。
3] 強烈建議使用 protobuf 作為您的即時通訊應用程式資料傳輸格式。
4] 應用程式和後端之間資料格式的演變:從文字協議到二進位協議。
5]面試必考,史上最流行的大端和端。
6] 移動IM開發需要面對的技術問題(包括通訊協議選擇)。
7] 簡要描述移動 IM 開發的陷阱:架構設計、通訊協議和客戶端。
8] 理論與實踐:對一組典型的 IM 通訊協議設計的詳細說明。
9] 58 家庭實時訊息系統協議設計等技術實踐分享。
10] 金蝶筆記團隊Protobuf應用實踐(原理)。
11] 初學者一篇文章就夠了:從零開始開發移動IM
本文發表於: