物联网架构方案思考
1.前言
1.1.系統設計有無通用方案?
? ? ? ? 一般的IT系統,稍微復雜一些,都會存在一個架構。架構在初期可能不覺得有多么重要,但隨著業務發展,架構可能成為系統開發的瓶頸,導致無法再迭代下去。
? ? ? ? 不同的系統,會有不同的架構,即使同一個系統,由不同的架構師設計也會有不同的架構。架構不存在正確與否的,只能說在不同的場景,存在優劣之分。
? ? ? ? 如何設計一個系統,此問題過于龐大不在本文討論范圍。那么如果細化一個問題:架構設計能否有通用方案?
? ? ? ? 上述問題,如果限制了系統范圍,同時只要求解決該范圍80%的問題,那么確實是可以設計出通用方案的。
? ? ? ? 本文根據筆者的經驗,探討物聯網一般的設計方案,如有錯誤,請輕拍磚。
2.物聯網系統設計目標
2.1.物聯網系統要解決的問題
2.1.1.“連”是核心需求
? ? ? ? 物聯網首先要解決的問題,是讓大量的設備接入系統。一般的物聯網系統要求和設備實現雙向通信,故要求的連接一般是長連接(TCP連接),并且需要連接穩定,為保證連接穩定,一般都會加入心跳機制。由于長連接是耗資源的,單臺服務器能承受的連接有限,故設計的系統必須是可以擴展的,即可以通過堆機器增加連接能力。
2.1.2.數據處理是主要任務
? ? ? ? 物聯網產生的數據大部分為時序數據,由設備按周期產生。由于考慮到設備眾多,每臺服務器處理能力有限,同樣需要設計的系統必須是可以擴展的。同時一般要求設備連接服務器和數據處理服務器要解耦,因為不同的設備數據,一般處理過程也不一樣。
2.1.3.指令和控制是基本需求
? ? ? ? 一般物聯網還需要由上向下發送指令,如快遞柜打開,門鎖打開等。故系統需要設計一個指令通道。指令通道如果需要相當的可靠性,還需要一個獨立的指令通道,和數據通道分開傳輸予保證可靠性。
3.系統總體設計
3.1.總體架構框圖
3.2.設備登錄過程
? ? ? ? 設備登錄可以采用登錄網關http方式登錄。http為大多數開發者熟悉,開發簡單。設備通過http報文(一般為json)把設備號,設備類型,位置等信息傳遞到服務端,服務端驗證真偽后通過算法返回一個登錄令牌和一個負載較低的連接服務器地址,設備通過這兩個信息,使用TCP接入連接服務器,完成登錄。
3.3.設備在線狀態維護
? ? ? ? 已經登錄的設備,通過TCP心跳包,定時向連接服務器上報心跳信息。連接服務器把當前活動的設備登記到緩存數據庫(redis),并設置過期時間,如果連接服務器一定時間未收到心跳,則關閉連接同時redis的活動信息亦會自動刪除。
其中redis中的活動設備信息,是為了管理后臺和業務服務器查看當前活動設備使用,作為一個信息交換媒介。
3.4.消息和數據處理
? ? ? ? 連接服務器收到的設備信息,通過消息隊列(kafka)轉發到業務處理服務器。這里通過消息隊列的方式,實現了連接服務器和業務處理服務器之間的解耦。因為解耦,連接服務和業務處理可以完成獨立開發而不相互影響。比如連接服務因為性能可以使用Java或者C++開發,業務處理因為靈活性的要求可以使用python開發。
3.5.指令處理
? ? ? ? 上述的消息和數據出來,通過kafka消息隊列轉發,是考慮到kafka的高性能,kafka的多主架構,可以抗住更大量的流量轉發。
? ? ? ? 但在指令轉發場景,更重要的是可靠性,并且通常指令流量不會很大。rabbitmq具有較高的嚴謹性,數據丟失的可能性更小,故指令通道采用rabbitmq實現轉發。
? ? ? ? 同時消息和指令通過不同通道轉發,可以故障隔離,不會因為消息數據太大,影響了指令的傳輸。
3.6.存儲設計
? ? ? ? 采用不同的數據庫,存放不同的數據庫方式。業務數據一般要求嚴謹性,采用關系型數據庫mysql,時序數據因為性能的需要,采用時序數據庫cratedb。
3.7.管理后臺
? ? ? ? 管理后臺可以使用典型的B/S系統。管理后臺的主要職責是管理當前系統的設備,查看當前接入設備的狀態,給設備發送指令等。管理系統可以同時在緩存數據庫redis,業務數據庫mysql,時序數據庫cratedb獲取信息進行展示和管理。
4.其他
? ? ? ? 本文所描述的物聯網架構,作為開源項目在github開發并持續更新,歡迎大家關注。
總結
- 上一篇: Mac不想安装虚拟机,Windows T
- 下一篇: 三未信安荣获“年度中国最具潜力企业奖”