從HTTP到MQTT 乙個移動後端案例概述

2021-09-23 13:00:17 字數 1359 閱讀 5320

在基於位置服務的移動應用領域,移動裝置端和服務端之間總是存在大量的互動。裝置向服務端傳送它的位置資訊和其它裝置資訊,服務端接收這些資料,對它們進行處理,並返回給裝置端一些命令。裝置端根據這些命令執行一些操作,比如gps資料的收集和傳送頻率等。

裝置端和服務端之間可以通過多種通訊協議進行互動,比如http(同步)或者基於訊息傳遞的非同步協議。因為流動網路的不穩定性,在選擇通訊協議時要綜合考慮它的穩定性和效能。同時,考慮到移動裝置對電池使用時間的敏感度,最好能夠選擇乙個相對比較節省資源的協議,這樣可以減少對電池的消耗。

http是一種同步無狀態的協議,不支援推送,裝置端需要通過輪詢模擬推送,反覆的輪詢需要耗費額外的資源。相比之下,另一種基於訊息傳遞的協議mqtt在這種情況下似乎更有優勢:

mqtt可以保持裝置與伺服器之間的長連線,避免反覆的輪詢,減少資源消耗,所以更加省電 mqtt可以在裝置和伺服器之間建立雙向連線,從而可以使用推送

有乙個基於位置服務的移動專案,最開始使用的是http協議,但是基於上述的原因,需要使用mqtt來替換http。下面來看看如何實現這個架構的演變。

首先,在ec2上安裝乙個mosquitto**。裝置端把原先http裡的訊息頭和訊息體合併到乙個mqtt訊息裡,併發送到mosquitto**的乙個主題上。後端的api端點對這個主題進行訂閱,然後處理接收到的訊息。api服務對訊息進行處理後,把相應的響應訊息發回mosquitto**,再推送給裝置端。

不過在有多個api伺服器的情況下,存在重複處理訊息的問題。因為多個api伺服器同時訂閱相同的主題,它們會收到乙個訊息的多個拷貝。為了解決這個問題,在系統裡引入了aws的iot。aws iot在它的內部使用了mqtt**,同時包含了乙個強大的規則引擎,可以利用這個引擎對mosquitto的訊息進行處理,比如把它們儲存起來,傳送通知或者使用lambda函式處理訊息的響應。不過這裡需要先把mosquitto和aws iot橋接起來,這樣訊息就可以進入到aws iot。然後使用lambda函式對訊息進行處理,抽取訊息裡的訊息頭和訊息體,最後呼叫後端的http api服務。

使用這套架構會涉及到:

qos - mqtt提供了三層qos。這個是非常重要的,因為在底層網路不是很穩定的時候,mqtt仍然能通過重試等手段保證訊息可以被正確送達。 訊息保留 - mqtt可以為每個主題保留最後乙個訊息。這對客戶端來說,可以反應主題的狀態。 處理mqtt訊息 - 設定乙個mosquitto**並讓訊息流入這個**是很容易的,但因為缺少第三方包,要讓一般的規則引擎來出來這些訊息有點棘手。所以最後選用了aws iot自帶的規則引擎。 日誌 - 需要對mosquitto的日誌進行捕捉,並儲存起來,方便監控和問題定位。可以使用remote syslog來把日誌傳輸到*****trail。

除了伺服器端,在客戶端也需要使用mqtt的客戶端包。mqtt有各種語言客戶端,並支援android、ios平台。

SQL拼接乙個滿足條件篩選後的字段到乙個虛擬欄位中

1 表ec chengji中包含多個字段,其中有以下幾個字段 2 希望實現,滿足條件的效果 安全文明側中ibk 1的顯示 cxybh,dtime進行短日期格式拼接 實現方法 1 在sql2000中只能借助函式實現 函式getbukaotime alter function dbo.getbukaot...

乙個晶元的誕生 從需求到實物

我們用的手機電腦最重要的部分就是裡面的晶元,本文試圖講講晶元從設計到製造出來的過程。水平有限,將就看吧。任何產品都是為了滿足需求,晶元也是如此,首先我們要知道為啥需要晶元。一台計算機要工作需要軟體和硬體的協同合作,硬體包括晶元和一大堆外設,我們只關注晶元部分,可以認為軟體就是直接執行在晶元之上的。我...

Angular從零到一1 4 第乙個元件

1.4 第乙個元件 wangpengdemacbook pro blog wangpeng ng generate component login inline template inline style installing component wangpengdemacbook pro blog...