国产av一二三区|日本不卡动作网站|黄色天天久久影片|99草成人免费在线视频|AV三级片成人电影在线|成年人aV不卡免费播放|日韩无码成人一级片视频|人人看人人玩开心色AV|人妻系列在线观看|亚洲av无码一区二区三区在线播放

網(wǎng)易首頁(yè) > 網(wǎng)易號(hào) > 正文 申請(qǐng)入駐

別再裸寫 parseFrom() 了!這才是 MQTT + Protobuf 消費(fèi)的正確姿勢(shì)!

0
分享至

點(diǎn)擊下方“JavaEdge”,選擇“設(shè)為星標(biāo)”

第一時(shí)間關(guān)注技術(shù)干貨!


免責(zé)聲明~ 任何文章不要過度深思! 萬事萬物都經(jīng)不起審視,因?yàn)槭郎蠜]有同樣的成長(zhǎng)環(huán)境,也沒有同樣的認(rèn)知水平,更「沒有適用于所有人的解決方案」; 不要急著評(píng)判文章列出的觀點(diǎn),只需代入其中,適度審視一番自己即可,能「跳脫出來從外人的角度看看現(xiàn)在的自己處在什么樣的階段」才不為俗人。 怎么想、怎么做,全在乎自己「不斷實(shí)踐中尋找適合自己的大道」

本文已收錄在Github,關(guān)注我,緊跟本系列專欄文章,咱們下篇再續(xù)!

  • 魔都架構(gòu)師 | 全網(wǎng)30W技術(shù)追隨者

  • 大廠分布式系統(tǒng)/數(shù)據(jù)中臺(tái)實(shí)戰(zhàn)專家

  • 主導(dǎo)交易系統(tǒng)百萬級(jí)流量調(diào)優(yōu) & 車聯(lián)網(wǎng)平臺(tái)架構(gòu)

  • AIGC應(yīng)用開發(fā)先行者 | 區(qū)塊鏈落地實(shí)踐者

  • 以技術(shù)驅(qū)動(dòng)創(chuàng)新,我們的征途是改變世界!

  • 實(shí)戰(zhàn)干貨:編程嚴(yán)選網(wǎng)

本文已收錄在Github,關(guān)注我,緊跟本系列專欄文章,咱們下篇再續(xù)!

  • 魔都架構(gòu)師 | 全網(wǎng)30W技術(shù)追隨者

  • 大廠分布式系統(tǒng)/數(shù)據(jù)中臺(tái)實(shí)戰(zhàn)專家

  • 主導(dǎo)交易系統(tǒng)百萬級(jí)流量調(diào)優(yōu) & 車聯(lián)網(wǎng)平臺(tái)架構(gòu)

  • AIGC應(yīng)用開發(fā)先行者 | 區(qū)塊鏈落地實(shí)踐者

  • 以技術(shù)驅(qū)動(dòng)創(chuàng)新,我們的征途是改變世界!

  • 實(shí)戰(zhàn)干貨:編程嚴(yán)選網(wǎng)

0 前言

很多剛接觸這個(gè)技術(shù)棧的同學(xué),可能會(huì)覺得有點(diǎn)繞。MQTT 負(fù)責(zé)傳輸,Protobuf 負(fù)責(zé)定義數(shù)據(jù)結(jié)構(gòu),聽起來是天作之合,但具體到代碼層,咋寫最“哇塞”?本文以車聯(lián)網(wǎng)(V2X)場(chǎng)景為例,把這個(gè)事兒聊透,讓你不僅知其然,更知其所以然。

咱們的案例原型就是這段非常

1 典型的.proto文件

syntax = "proto3"; option java_multiple_files = true; option java_package = "cn.javaedge.v2x.protocol"; package cn.javaedge.v2x.pb; enum Message_Type {     UKNOWN_MSG = 0; } // 消息體定義,如車輛消息 message VehicleMessage {     string vehicle_id = 1; }

實(shí)際業(yè)務(wù)中,通常會(huì)有一個(gè)統(tǒng)一的“信封”消息,里面包含消息類型和真正的業(yè)務(wù)數(shù)據(jù)包。

需求明確:Java服務(wù)作MQTT客戶端,訂閱某Topic,源源不斷收到二進(jìn)制數(shù)據(jù)。這些數(shù)據(jù)就是用上面這.proto文件定義的VehicleMessage序列化后的結(jié)果。我們的任務(wù)就是把它高效、健壯地解碼出來。

2 核心思路:從“能跑就行”到“最佳實(shí)踐”

很多同學(xué)第一反應(yīng)直接在 MQTT 的messageArrived回調(diào)方法寫一堆try-catch,再調(diào)用 Protobuf 的parseFrom()方法:

// 偽代碼:一個(gè)“能跑就行”的例子 public void messageArrived(String topic, MqttMessage message) {     try {         byte[] payload = message.getPayload(); }

這段代碼能工作嗎?當(dāng)然能。但在高并發(fā)、要求高可用、業(yè)務(wù)邏輯復(fù)雜的生產(chǎn)環(huán)境中,這遠(yuǎn)遠(yuǎn)不夠。它就像一輛只有發(fā)動(dòng)機(jī)和輪子的裸車,能跑,但一陣風(fēng)雨就可能讓它趴窩。

最佳實(shí)踐是啥?,建立一套分層、解耦、易于維護(hù)和擴(kuò)展的處理流程。

3 最佳實(shí)踐:構(gòu)建穩(wěn)如泰山的 Protobuf 解析層

讓我們把這個(gè)過程拆解成幾個(gè)關(guān)鍵步驟,并逐一優(yōu)化。

3.1 Protobuf代碼生成與依賴管理

構(gòu)建階段,看似準(zhǔn)備工作,卻是保證后續(xù)一切順利的基石。

使用 Maven插件自動(dòng)生成代碼

別手動(dòng)執(zhí)行protoc命令,再把生成的.java文件拷貝到項(xiàng)目里。這是“上古時(shí)期”做法?,F(xiàn)代化的構(gòu)建工具能完美解決這個(gè)問題。

Maven示例:


 com.google.protobuf:protoc:3.25.3:exe:${os.detected.classifier} protocArtifact>
這樣做的好處
  1. 自動(dòng)化:每次構(gòu)建項(xiàng)目時(shí),都會(huì)自動(dòng)檢查.proto文件是否有更新,并重新生成 Java 類

  2. 版本一致性:確保protoc編譯器版本和protobuf-java運(yùn)行時(shí)庫(kù)版本的一致,避免因版本不匹配導(dǎo)致的各種詭異錯(cuò)誤

  3. IDE 友好:IDEA能很好識(shí)別這些生成的源代碼,提供代碼補(bǔ)全和導(dǎo)航

3.2 定義清晰的解析器接口

設(shè)計(jì)模式的應(yīng)用,直接在 MQTT 回調(diào)里寫解析邏輯,違反單一職責(zé)原則。MQTT 客戶端的核心職責(zé)是網(wǎng)絡(luò)通信,不應(yīng)關(guān)心消息體的具體格式。

應(yīng)將解析邏輯抽象出來:

// 定義一個(gè)通用的反序列化器接口 public interface MessageDeserializer

  { }

然后,為我們的VehicleMessage實(shí)現(xiàn)該接口:

publicclass VehicleMessageDeserializer implements MessageDeserializer

  { }
好處
  1. 解耦:MQTT 消費(fèi)者代碼與 Protobuf 解析邏輯完全分離。未來如果想把數(shù)據(jù)格式從 Protobuf 換成 JSON,只需要換一個(gè)MessageDeserializer的實(shí)現(xiàn)類即可,消費(fèi)者代碼一行都不用改。

  2. 職責(zé)單一VehicleMessageDeserializer只干一件事:解析VehicleMessage。代碼清晰,易于測(cè)試。

  3. 統(tǒng)一異常處理:通過自定義的DeserializationException,我們將底層的InvalidProtocolBufferException進(jìn)行了封裝。上層代碼只需要捕獲DeserializationException,大大簡(jiǎn)化了錯(cuò)誤處理邏輯。

3.3 在 MQTT 消費(fèi)者中優(yōu)雅地使用解析器

組合與分發(fā)?,F(xiàn)在,MQTT消費(fèi)者變得清爽:

public class MqttConsumerService { }
架構(gòu)精髓 ① 依賴注入 (DI)

通過構(gòu)造函數(shù)注入依賴(解析器和業(yè)務(wù)處理器),而不是在方法內(nèi)部new對(duì)象。這使得整個(gè)服務(wù)非常容易進(jìn)行單元測(cè)試。我們可以輕易地 mockMessageDeserializer來測(cè)試MqttConsumerService的邏輯,而不需要真實(shí)的 Protobuf 數(shù)據(jù)。

② 關(guān)注點(diǎn)分離 (SoC)

  • MqttConsumerService:負(fù)責(zé)從 MQTT 接收字節(jié)流,協(xié)調(diào)解析和業(yè)務(wù)處理的流程,并統(tǒng)一處理異常。

  • VehicleMessageDeserializer:負(fù)責(zé)將字節(jié)流轉(zhuǎn)換為VehicleMessage對(duì)象。

  • BusinessLogicHandler:負(fù)責(zé)拿到VehicleMessage對(duì)象后所有的業(yè)務(wù)計(jì)算和處理。

③ 健壯的異常處理
  • 區(qū)分已知和未知異常:我們明確捕獲DeserializationException,這是“已知”的解析失敗,通常意味著消息格式有問題。對(duì)于這種消息,最佳實(shí)踐是隔離它,比如發(fā)送到“死信隊(duì)列”,避免它反復(fù)阻塞正常消息的處理。

  • **捕獲頂級(jí)Exception**:這是一個(gè)保護(hù)性措施,確保任何意想不到的錯(cuò)誤(比如空指針、業(yè)務(wù)邏輯層的運(yùn)行時(shí)異常)都不會(huì)導(dǎo)致整個(gè) MQTT 消費(fèi)者線程崩潰。

4 進(jìn)階:應(yīng)對(duì)真實(shí)世界的復(fù)雜性

上面的架構(gòu)已很優(yōu)秀,但更復(fù)雜場(chǎng)景下,還需考慮更多。

4.1 多消息類型處理 (Message Dispatching)

通常一個(gè) MQTT Topic 不會(huì)只有一種消息類型。還記得我們.proto文件里的Message_Type枚舉嗎?這正是用于區(qū)分不同消息的。

實(shí)際的 Protobuf 結(jié)構(gòu)通常是這樣的“信封模式” (Envelope Pattern):

message UniversalMessage { }

google.protobuf.Any是 Protobuf 的一個(gè)標(biāo)準(zhǔn)類型,可以包含任意一種 Protobuf 消息。

消費(fèi)者的邏輯就需要升級(jí)為一個(gè)**分發(fā)器 (Dispatcher)**:

public class UniversalMessageDispatcher { }

這種基于“注冊(cè)表”和Any類型的分發(fā)模式,是處理多消息類型時(shí)擴(kuò)展性最好的方案。

4.2 性能考量:對(duì)象池與零拷貝

高吞吐量場(chǎng)景下(如每秒處理成千上萬條消息),頻繁創(chuàng)建和銷毀VehicleMessage對(duì)象會(huì)給 GC 帶來巨大壓力。

對(duì)象池技術(shù)

可以使用像 Apache Commons Pool2 這樣的庫(kù),來復(fù)用VehicleMessage.Builder對(duì)象。解析時(shí),從池中獲取一個(gè) Builder,用mergeFrom()方法填充數(shù)據(jù),構(gòu)建出VehicleMessage對(duì)象,使用完畢后再將 Builder 清理并歸還到池中。

零拷貝

Protobuf 的ByteString類型在內(nèi)部做很多優(yōu)化,可實(shí)現(xiàn)對(duì)底層byte[]的“零拷貝”引用。在傳遞數(shù)據(jù)時(shí),盡量傳遞ByteString而非byte[],可減少不必要的內(nèi)存復(fù)制。

5 總結(jié)

從一個(gè)簡(jiǎn)單的parseFrom()調(diào)用,逐步構(gòu)建一套企業(yè)級(jí) MQTT-Protobuf 消費(fèi)方案。

  1. 構(gòu)建自動(dòng)化:Maven插件管理 Protobuf 代碼生成,告別刀耕火種

  2. 設(shè)計(jì)模式先行:定義MessageDeserializer接口,實(shí)現(xiàn)策略模式,解耦【解析】與【消費(fèi)】邏輯

  3. 分層與解耦:將流程清晰劃分為網(wǎng)絡(luò)接入層(MQTT Client)、反序列化層(Deserializer) 和業(yè)務(wù)邏輯層(Handler),職責(zé)分明,易維護(hù)

  4. 健壯的錯(cuò)誤處理:封裝自定義異常,并設(shè)計(jì)了對(duì)解析失敗消息的隔離機(jī)制(如死信隊(duì)列),保證系統(tǒng)的韌性

  5. 面向未來的擴(kuò)展性:引入“信封模式”和“分發(fā)器”,從容應(yīng)對(duì)未來不斷增加的新消息類型

優(yōu)秀的代碼不僅是讓機(jī)器讀懂,更是讓同事(及半年后的自己)輕松讀懂。核心思想即通過抽象、解耦和分層,來管理軟件的復(fù)雜性。

加我好友,一起AI探索交流!

特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關(guān)推薦
熱點(diǎn)推薦
取消中小學(xué)期末統(tǒng)考!多地通知!

取消中小學(xué)期末統(tǒng)考!多地通知!

威寧融媒
2026-01-11 11:33:44
離婚僅過兩個(gè)月,54歲的李亞鵬傳來“噩耗”,海哈金喜真沒說謊

離婚僅過兩個(gè)月,54歲的李亞鵬傳來“噩耗”,海哈金喜真沒說謊

馬浵在解說
2026-01-11 16:28:26
湖南警方通報(bào):一裝載煙花爆竹貨車側(cè)翻起火引燃8臺(tái)小車,2人受傷,駕駛?cè)思案瘪{駛已被控制

湖南警方通報(bào):一裝載煙花爆竹貨車側(cè)翻起火引燃8臺(tái)小車,2人受傷,駕駛?cè)思案瘪{駛已被控制

大風(fēng)新聞
2026-01-11 12:28:03
最令大齡剩女崩潰的一瞬間在什么時(shí)候?看網(wǎng)友的評(píng)論引起萬千共鳴

最令大齡剩女崩潰的一瞬間在什么時(shí)候?看網(wǎng)友的評(píng)論引起萬千共鳴

夜深愛雜談
2026-01-10 22:27:12
俄軍擊中卡塔爾大使館,又有救援人員殉職!別爾哥羅德全城大停電

俄軍擊中卡塔爾大使館,又有救援人員殉職!別爾哥羅德全城大停電

鷹眼Defence
2026-01-10 17:14:20
王思聰東京豪宅內(nèi)景罕見曝光,送99朵玫瑰給女友,和懶懶已同居了

王思聰東京豪宅內(nèi)景罕見曝光,送99朵玫瑰給女友,和懶懶已同居了

娛樂團(tuán)長(zhǎng)
2026-01-10 20:34:28
沉默11天后,73歲李顯龍發(fā)聲,臺(tái)海和平至關(guān)重要,不許改變現(xiàn)狀

沉默11天后,73歲李顯龍發(fā)聲,臺(tái)海和平至關(guān)重要,不許改變現(xiàn)狀

南宮一二
2026-01-09 18:02:34
她是葉帥最后一任妻子,生下一雙兒女,現(xiàn)年96歲,孫女是知名歌星

她是葉帥最后一任妻子,生下一雙兒女,現(xiàn)年96歲,孫女是知名歌星

歷史龍?jiān)w
2026-01-10 08:55:08
湖北下周“火箭式”升溫,多地最高溫達(dá)20℃,局地晝夜溫差超15℃

湖北下周“火箭式”升溫,多地最高溫達(dá)20℃,局地晝夜溫差超15℃

環(huán)球網(wǎng)資訊
2026-01-11 16:41:14
果然是你!名記:東契奇是施羅德在走廊尋找并且想揍的人

果然是你!名記:東契奇是施羅德在走廊尋找并且想揍的人

懂球帝
2026-01-11 10:32:00
科學(xué)家讓一對(duì)情侶在核磁共振里實(shí)戰(zhàn),才發(fā)現(xiàn)人體驚人真相!

科學(xué)家讓一對(duì)情侶在核磁共振里實(shí)戰(zhàn),才發(fā)現(xiàn)人體驚人真相!

徐德文科學(xué)頻道
2026-01-06 19:51:55
記者:阿莫林下課后不到一天索帥就接到曼聯(lián)電話,回應(yīng)稱有意向

記者:阿莫林下課后不到一天索帥就接到曼聯(lián)電話,回應(yīng)稱有意向

懂球帝
2026-01-11 10:31:59
一路走好。2026年不到3天,5位名人接連去世,最年輕的僅25歲

一路走好。2026年不到3天,5位名人接連去世,最年輕的僅25歲

山野盧員外
2026-01-11 17:21:20
足球報(bào):U23國(guó)足大概率延續(xù)532陣型,鮑世蒙可能因傷缺戰(zhàn)

足球報(bào):U23國(guó)足大概率延續(xù)532陣型,鮑世蒙可能因傷缺戰(zhàn)

懂球帝
2026-01-11 15:49:30
為什么老一輩說財(cái)不外露?網(wǎng)友 :炫耀了一下,就帶著全家跪下借錢

為什么老一輩說財(cái)不外露?網(wǎng)友 :炫耀了一下,就帶著全家跪下借錢

夜深愛雜談
2026-01-10 23:00:25
雞腿公主給科技大佬當(dāng)外室

雞腿公主給科技大佬當(dāng)外室

毒舌扒姨太
2026-01-10 22:27:26
最新后續(xù),閆學(xué)晶終于回應(yīng):態(tài)度令人意外,這回里子面子全都沒了

最新后續(xù),閆學(xué)晶終于回應(yīng):態(tài)度令人意外,這回里子面子全都沒了

小椰的奶奶
2026-01-09 12:08:59
林徽因落選的國(guó)徽方案,網(wǎng)友看后感嘆:審美確實(shí)一絕,但真不合適

林徽因落選的國(guó)徽方案,網(wǎng)友看后感嘆:審美確實(shí)一絕,但真不合適

小豫講故事
2026-01-11 06:00:07
伊朗,進(jìn)入倒計(jì)時(shí)

伊朗,進(jìn)入倒計(jì)時(shí)

難得君
2026-01-10 08:24:21
空中“貨拉拉”來了!“天馬-1000”無人運(yùn)輸機(jī)成功首飛

空中“貨拉拉”來了!“天馬-1000”無人運(yùn)輸機(jī)成功首飛

澎湃新聞
2026-01-11 09:55:03
2026-01-11 17:55:00
JavaEdge incentive-icons
JavaEdge
Java 技術(shù)
466文章數(shù) 457關(guān)注度
往期回顧 全部

科技要聞

“我們與美國(guó)的差距也許還在拉大”

頭條要聞

網(wǎng)約車送斷指乘客在交警帶路闖紅燈時(shí)出車禍 被判全責(zé)

頭條要聞

網(wǎng)約車送斷指乘客在交警帶路闖紅燈時(shí)出車禍 被判全責(zé)

體育要聞

詹皇曬照不滿打手沒哨 裁判報(bào)告最后兩分鐘無誤判

娛樂要聞

留幾手為閆學(xué)晶叫屈?稱網(wǎng)友自卑敏感

財(cái)經(jīng)要聞

外賣平臺(tái)"燒錢搶存量市場(chǎng)"迎來終局?

汽車要聞

2026款宋Pro DM-i長(zhǎng)續(xù)航補(bǔ)貼后9.98萬起

態(tài)度原創(chuàng)

教育
藝術(shù)
數(shù)碼
房產(chǎn)
軍事航空

教育要聞

監(jiān)考老師怎么抓作弊?很容易抓,同學(xué)們千萬別作弊!

藝術(shù)要聞

引爆期待!275米,東莞第四高樓封頂!

數(shù)碼要聞

追覓電視斬獲CES媒體大獎(jiǎng),Aura Mini LED與AI技術(shù)實(shí)力獲國(guó)際認(rèn)可

房產(chǎn)要聞

66萬方!4755套!三亞巨量房源正瘋狂砸出!

軍事要聞

俄大使:馬杜羅夫婦被控制時(shí)身邊沒人

無障礙瀏覽 進(jìn)入關(guān)懷版