IM 通訊協議主題 10 了解節儉序列化協議

Mondo 科技 更新 2024-01-31

本文由位元組跳動技術團隊成員楊晨曦分享,本文經修訂修改。

本文將帶大家初步了解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 定義如下:

介面。

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"]

現象:服務 A 訪問服務 B,業務邏輯在短時間內處理完畢,但整個請求在 15 秒內超時。

直接原因:修改了 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

本文發表於:

相關問題答案

    IM即時通訊的私有化部署支撐資訊創新環境

    即時通訊軟體系統具有強大的社交功能,使用者可以通過查詢和新增朋友來建立自己的社交網路。他們可以更新自己的個人資料,分享故事和發布狀態,並與朋友分享他們的生活。同時,使用者還可以參與群組和社群,與志趣相投 話題相同的人進行交流互動,擴大社交圈。此外,即時通訊軟體系統還提供有用的輔助功能,例如語音翻譯 ...

    IM(即時通訊聊天工具)是一篇要了解、技術棧和介面設計的文章

    大家好,我是伯格前端工廠,本期繼續分享IM 即時通訊 的設計,歡迎大家關注。IM即時通訊工具是指用於實時通訊和通訊的一類軟體或應用程式。它們通過網際網絡或區域網等網路連線,並提供文字 語音 影象和 等實時通訊功能。IM即時通訊工具可以在PC 智慧型手機 平板電腦等裝置上執行,支援一對一或多人群聊。一...

    一種分布式IM即時通訊系統的技術選型與架構設計

    本文由冰河分享,由部落格冰河撰寫gitcode.主持人,原來的問題 如何在簡歷上寫這個分布式IM即時通訊系統?我已經幫你整理好了!本文件已經過修訂和修改。分布式IM即時通訊系統本質上是對線上聊天和使用者的管理。對於聊天本身,核心要求是 傳送文字 檔案 語音 訊息快取 訊息儲存 訊息未讀 已讀 召回 ...

    Web端IM產品RainbowChat Web的v6 0版本已經發布

    RainbowChat Web是乙個web即時通訊系統,是RainbowChat的姊妹系統 RainbowChat是基於開源即時通訊聊天框架MobileIMSDK GitHub位址 的生產級移動即時通訊系統 詳 版本歷史記錄 執行螢幕截圖 跑 此版本中的新增功能 更多歷史更新日誌 bug serve...

    IM 32EA絕緣監測模組有哪些特點?

    IM EA絕緣監測模組是一種用於監測電氣系統絕緣狀態的裝置。它可以實時監測電氣系統的絕緣電阻值,並在絕緣電阻值低於設定閾值時發出警報,以確保電氣系統的安全執行。該模組具有以下特點 高精度測量 採用先進的測量技術,可準確測量電氣系統的絕緣電阻值。實時監控 可實時監控電氣系統的絕緣狀態,及時發現潛在的絕...