IoT MQ設計篇:基於開源項目二次開發的坑

概述

在對開源項目進行一些調研後,結合實際情況,我們選擇了基於Moquette進行開發,本篇主要從以下兩個個維度介紹在二次開發遇到的問題:

  1. moquette介紹,爲什麼選擇moquette

  2. 從選擇到放棄,趟不過去的坑就不趟了吧

moquette

moquette是一個用java和netty實現的mqtt broker,主要特性有以下幾點:

  1. 基本完整支持了mqtt協議

  2. 支持websocket,SSL等協議

  3. 支持h2,mapdb數據本地持久化

選擇moquette作爲研究的開源項目的原因主要有以下兩點:

  1. Java和netty開發,技術棧很匹配,人力成本比較低

  2. 項目比較小,學習成本低,可以借鑑很多處理mqtt協議的思想

從選擇到放棄

上面介紹了爲什麼選擇moqutte,在實際開發中,我們基於moquette,基本實現了一個版本,但是在經過測試時,遇到了很多問題:

  1. 高可用問題:moquette不支持集羣,所以我們要完全自己實現集羣,纔開始我們的架構是不太想用集中式存儲的,所以用hazelcast做了jvm分佈式集羣,但是性能並不好,並且有的集羣功能也沒有實現好,在改動方面因爲moquette這方面的規劃並不是很好,所以對原生代碼侵入非常大,改動也很困難

  2. 高可靠問題:moquette原生是基於內存的,再採用mapdb持久化後,發現數據量大了之後也有比較多的問題。很多本該基於內存的也持久化了,而且持久化的數據在集羣間共享也是個問題

  3. 性能問題:我們測試了原生的moquette,單機(4c16g)只能支持6W的長連接,之後的連接就會出錯,並且瞬時併發連接數支持的也很低,這塊我們經過了大量的優化後(後續會講具體的優化),性能提高了很多。

  4. 功能:moquette是一個沒有專門社區維護的項目,所以功能方面只是通用的功能,對於我們很多定製功能都無法滿足,比如p2p消息,消息上行到雲存儲,權限控制,黑名單,設備管理等。這塊需要在broker核心改動,導致改動也比較麻煩

綜上,是我們在具體實踐時遇到的一些問題,後面我們還是選擇了自研的方式,但是通過moquette還是學習了很多處理mqtt協議邏輯的思想,放棄moquette的原因主要是擴展實在太困難了,改動非常麻煩,所以不如自己造輪子了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章