現在許多的智能硬件應用都需要從傳感器獲得相應的數據,處理后把這些數據傳遞到后端。為了能夠評估這些應用的性能,首先我們需要解決以下的問題:
- 每秒從網關發送到后端的信息數
- 在反應模塊和純Java環境中創建解決方案的比較
- 如何在多核的環境下並行收發和處理數據的進程
在本次的測試中我們使用Raspberry Pi 2 (Model B),具體的參數如下:
Quad-core Broadcom BCM 2836 CPU
900 MHz
1GB RAM
從網關發送消息到后端
我們使用MQTT協議將信息發送到后端,使用在愛爾蘭的AWS數據中心作為MQTT的服務器。由於我們的網關設定在挪威的特隆赫姆,所以傳輸的距離跨越了整個北海。
下圖是測試應用的配置:
信息將會以1,2,5…10000的信息組的模式發送,並記錄發送的時間。
首先,這個實驗說明了在qos=0和qos=2時的顯著的差異。在MQTT是可以設置qos的(quality of service)。當qos=0時,信息是沒有保證送達和認證的,當qos=2時,信息是保證送達並且不會有重復。如果沒有以上的配置,qos=2時每秒平均可以送達8到9條認證的消息,而當qos=0時每秒平均可送達1000條,是qos=2時的100多倍。這並不是件很稀奇的情形,主要還是因為后者不需要花大量時間從服務器的到認證。因此,確定一個應用需要什么樣的qos等級是非常重要的。
純Java和反應模塊比較
我們同樣也要在反應模塊和純Java(使用Paho)環境中創建解決方案進行比較。雖然反應模塊同樣使用的Paho核心,但和自動生成的code封裝成模塊。下面是測試的結果:
從圖中我們可以看到用純java應用和通過反應模塊產生jave code來推送一定數量的MQTT信息,所耗費的時間幾乎是一樣的。那就意味着generated code和programmed code一樣的高效。
使用多核心
擁有quad-core CPU的Raspberry Pi 2可以並行相關任務。這使得網關應用更方便接收典型的傳感器的數據,我們用單線程的模擬傳感數據測試了這一典型的應用,通過不同的線程來進行多項式計算和通過MQTT發布數據。
這些任務可以通過划分不同的線程來在四核的Raspberry Pi上並行。這里我們選着每秒產生大約18000個傳感器事件。模塊化的多項式計算解決了每個事件的多項式方程,並賦予每2000個事件的平均值。這些均值將會通過MQTT發布模塊進行發布。也就是說,將會有每秒大約9條qos=2的MQTT消息被發布。無論MQTT發布模塊什么時候報告進程消息,緩沖庫里的BES(Buffer Eager Simple)模塊將會存儲要被發布的生產消息。
通過java可以將這種應用划分成不同的核。然而反應模塊卻能使得所有同步的線程更加容易的產生純凈而且可靠的應用。
本文翻譯至http://www.bitreactive.com/how-fast-can-you-publish-mqtt-messages/?utm_campaign=shareaholic&utm_medium=twitter&utm_source=socialnetwork (How Fast Can You Publish MQTT Messages?)如轉載請請注明出處
后記:之后自己也做過類似的實驗測試(同樣用的類似的板,用的雲巴的MQTT)在qos>0時速度比原作者快,可能也和距離有關吧~但基本差不多