14 物聯(lián)網(wǎng)的設備接入層
我們有了物聯(lián)網(wǎng)數(shù)據(jù)接入的通信協(xié)議,例如MQTT;有了數(shù)據(jù)的存儲和處理的技術;現(xiàn)在面臨的一個挑戰(zhàn),就是怎么面對海量設備的接入和海量數(shù)據(jù)的輸入。
從架構設計來說,負責設備接入的部分被稱為設備接入層,在物聯(lián)網(wǎng)中被稱為IoT Hub。如果我們采用的通信協(xié)議是MQTT,那么這個接入層通常就是MQTT Broker。
通常來說,整個架構可以簡化為下面的圖:

上面的圖只是讓我們能夠更快的了解各個部分之間的關系,實際使用中要復雜的多,首先需要解決的就是物聯(lián)網(wǎng)接入層的高并發(fā)和高可用。
14.1 負載均衡
面對海量的設備接入,單臺服務器作為接入層的話,存在以下的問題:
- 很容易達到性能瓶頸,無法因?qū)A拷尤牒蛿?shù)據(jù)
- 存在單點故障
要達到高并發(fā)和高可用,必須要采用多臺服務器。服務器數(shù)量變多之后,具體要怎么協(xié)作來處理請求。這個時候就需要用到負載均衡技術。我們需要在所有的服務器之前添加一個組件——負載均衡器。所有的接入請求都會發(fā)送到負載均衡器,由負載均衡器將請求發(fā)送給后端的接入服務器。
負載均衡器可以通過各種預先設置好的策略,將請求分配給后面的各個接入服務器。通常使用的策略包括:
- 輪詢策略:將請求輪流發(fā)送給各個后端服務器。
- 加權輪詢策略:為各個后端服務器配置權重,根據(jù)權重將請求發(fā)送給后端的服務器。
- 最小連接數(shù)策略:將請求發(fā)送給當前連接數(shù)最少的后端服務器
- 加權最小連接數(shù)策略:在最小連接數(shù)策略中引入權重系數(shù)。
- 源地址hash策略:根據(jù)請求源地址的ip地址的hash值,將請求分發(fā)給后端的服務器。
14.2 消息隊列
采用負載均衡 + 多服務器的方式,能夠提供接入層的高可用和高并發(fā)。這個時候壓力會傳遞到更后面的數(shù)據(jù)庫中,造成的結果就是請求響應會變慢甚至超時。因此,我們還需要采用一些方法來讓設備接入層具有高性能。為了達到這個目的,我們會引入兩個組件:消息隊列和緩存。
** 消息隊列 **
消息隊列的一個常用的場景就是削峰填谷,這個功能也是我們在這里使用消息隊列的原因。設備接入層在接收到數(shù)據(jù)之后,將數(shù)據(jù)發(fā)送到消息隊列,就完成了自己的工作,可以給客戶端發(fā)送返回消息。由于消息隊列的高性能,這個過程會很快完成。后端的流處理程序和寫入數(shù)據(jù)庫的操作可以根據(jù)自己的節(jié)奏來從消息隊列中讀取數(shù)據(jù)進行消費。
常用的消息隊列由:
- kafka
- RabbitMQ
- RocketMQ
** 緩存系統(tǒng) **
消息隊列解決了寫入數(shù)據(jù)庫的性能問題,還需要解決讀取數(shù)據(jù)庫的性能問題。解決這個問題的方式就是使用緩存系統(tǒng)。
常用的緩存系統(tǒng)包括Redis和Memcached等。同時,還有些二級緩存的框架,例如JetCache和J2Cache等。
14.3 小結
加入了前面描述的這些技術之后,最終我們的架構會演變?yōu)槿缦碌臓顟B(tài):
