一. 大流量的互聯(lián)網(wǎng)項(xiàng)目
1.項(xiàng)目背景
之前負(fù)責(zé)的一個項(xiàng)目,業(yè)務(wù)背景是這樣的。城市的基礎(chǔ)設(shè)施建設(shè)是每個城市和地區(qū)都會涉及到的,如何在基建工地中實(shí)現(xiàn)人性化管理,是當(dāng)前項(xiàng)目的主要訴求。該項(xiàng)目要實(shí)現(xiàn)如下目標(biāo):
工地工人的智慧考勤:
考勤機(jī)通過面容做人臉識別就能打卡,工人不需要脫手套按指紋,甚至不需要卸下口罩;
工地安全檢測:
檢測某一個區(qū)域沒有戴安全帽的工人,可以快速觸發(fā)總控臺,提醒管理員監(jiān)管;
工地機(jī)器的工作情況:
統(tǒng)計工地機(jī)器是否正在工作及已經(jīng)連續(xù)工作時長,用于檢測機(jī)器是否在安全時間內(nèi)使用。
從上述項(xiàng)目背景中我們就能看出,每一個功能的實(shí)現(xiàn)都需要硬件設(shè)備來實(shí)現(xiàn):比如人臉識別考勤機(jī)來實(shí)現(xiàn)智慧打卡,帶有人體識別功能的攝像頭來捕捉?jīng)]有戴安全帽的人員,傳感器設(shè)備來統(tǒng)計機(jī)器是否正在工作。
除了工地項(xiàng)目外,還有另一種很有意思的應(yīng)用場景,就是統(tǒng)計商場、超市的熱門門店。大家肯定很好奇,這是怎么實(shí)現(xiàn)的?——對!也是通過攝像頭。攝像頭采集進(jìn)入商場的人員,不用采集到臉,只需要根據(jù)人體的形態(tài)、衣服顏色、身高等特征值來標(biāo)識一個主體。根據(jù)人體識別算法,統(tǒng)計哪些類型的人,在什么時間段,去了哪些門店。如果特征值足夠匹配,甚至還能統(tǒng)計出性別和老幼。這個應(yīng)用場景是不是非常有意思?其實(shí),很多城市已經(jīng)在用這一套系統(tǒng)。甚至還有更有意思的應(yīng)用場景,物聯(lián)網(wǎng)早已深入生活,而IOT的項(xiàng)目中的流量數(shù)據(jù)是非常大的。
索爾為什么要說這些呢?你有沒有發(fā)現(xiàn),其實(shí)這些都跟硬件設(shè)備有關(guān)。如果老師所在的公司是一個硬件廠商,或者是一個小B中間商,就需要知道我買的這些設(shè)備,是否都能夠正常工作。如果能有一個類似于下面這樣的數(shù)據(jù)大屏,那是不是更加完美呢?我們就是這么干的。
問題來了,設(shè)備的心跳數(shù)據(jù)該多久上報一次?上報時間間隔的不同會對整個系統(tǒng)造成怎樣的影響?心跳數(shù)據(jù)怎么判斷設(shè)備是否正常?會有多少的心跳數(shù)據(jù)?
2.設(shè)備上報心跳的時間間隔
設(shè)備的上報心跳動作其實(shí)是一個很簡單的邏輯,就是上報將自己的設(shè)備key,和當(dāng)前時間封裝成一個http請求消息,發(fā)送給平臺。
根據(jù)當(dāng)時硬件部門的設(shè)定,不同設(shè)備的約定不同,每個設(shè)備大致會在2秒到5秒之間向平臺發(fā)送一次心跳。
3.如何通過心跳計算出當(dāng)前時間段設(shè)備是否正常
根據(jù)目前的情況,平臺收到的設(shè)備的心跳信息可以通過這張表體現(xiàn)出來:
這個表就是用來記錄當(dāng)前設(shè)備的最后活躍時間。那么問題來了,該怎么統(tǒng)計當(dāng)前時間段的正常設(shè)備和異常設(shè)備?多久沒有上報心跳的設(shè)備會被判定為異常設(shè)備呢?
心跳、服務(wù)發(fā)現(xiàn)。對!你也發(fā)現(xiàn)了,它們好像在描述同一件事情。在這里,參考了微服務(wù)中注冊中心對于服務(wù)剔除的方案。比如Nacos的服務(wù)健康檢查機(jī)制:
Nacos Server會開啟一個定時任務(wù)用來檢查注冊服務(wù)實(shí)例的健康情況,對于超過15秒沒有收到客戶端心跳的實(shí)例會將它的健康屬性置為false,如果某個實(shí)例超過30秒沒有收到心跳,則直接剔除該實(shí)例。
開啟了一個每隔30秒定時任務(wù),去設(shè)備心跳表中統(tǒng)計今日上報心跳的設(shè)備數(shù)量,具體的sql操作如下:
針對于這條sql,有同學(xué)會問,為什么不直接用日期函數(shù):
因?yàn)樾阅?,使用函?shù)會導(dǎo)致索引失效,關(guān)于SQL優(yōu)化這一塊的內(nèi)容,大家可以在MySQL優(yōu)化專題里進(jìn)行學(xué)習(xí)。
我們可以將統(tǒng)計到的數(shù)據(jù),維護(hù)在redis中。也就是說,redis中維護(hù)了今日正常設(shè)備的總數(shù),這個數(shù)據(jù)每30秒更新一次。
4.并發(fā)量的產(chǎn)生
在上一章節(jié)中我們提到,任何一個設(shè)備,都會上報其心跳到平臺,而且每個設(shè)備會每隔2到5秒左右上報一次心跳,我們試算下:
一臺設(shè)備:每隔3秒上報一次;
三十萬臺設(shè)備:每隔3秒會上報30萬次;
平臺:每秒接收到10萬次訪問,每天將會收到將近百億的消息。
可以推算出,一個平臺基本上每秒都會收到大約10萬次訪問。這樣的并發(fā)量不算大,但也不能說少,而且這樣每秒10萬的請求是持續(xù)的,這10萬的請求每秒都會來,不間斷的來,此時考驗(yàn)后端接口的時刻就到了。
5.業(yè)務(wù)如何處理
后端接口做到高性能、高可用設(shè)計,我們會在之后的專題去講,這里先聊一下接口收到數(shù)據(jù)后,該如何處理。
很顯然,接口收到設(shè)備上報的心跳數(shù)據(jù)后,要把數(shù)據(jù)落到數(shù)據(jù)庫里。這就是具體業(yè)務(wù)要做的事,很簡單,只要落到數(shù)據(jù)庫里就可以。
二. 待解決的核心業(yè)務(wù)邏輯
1.項(xiàng)目模塊
整個項(xiàng)目分成了以下幾個子項(xiàng)目:
數(shù)據(jù)大屏前端項(xiàng)目
數(shù)據(jù)大屏后端項(xiàng)目
硬件后端項(xiàng)目
硬件設(shè)備
Redis緩存服務(wù)器
MySQL關(guān)系型數(shù)據(jù)庫
這些項(xiàng)目之間有著重要的聯(lián)系,這樣的聯(lián)系可以總結(jié)為兩點(diǎn):一是數(shù)據(jù)大屏的后端為數(shù)據(jù)大屏的前端提供數(shù)據(jù),二是硬件設(shè)備的后端供硬件設(shè)備訪問實(shí)現(xiàn)數(shù)據(jù)交互。
那么問題來了,以第一點(diǎn)為例,后端和前端的數(shù)據(jù)交互方式是什么樣?
2.前后端交互方式
“前端”的概念可以是多種終端的瀏覽器。部署在web服務(wù)器上的Java Web應(yīng)用程序(即“后端”)提供了供http協(xié)議訪問的web接口,也就是程序的調(diào)用入口。前端通過http協(xié)議訪問后端的web接口,實(shí)現(xiàn)數(shù)據(jù)的交互。比如前端通過http協(xié)議訪問后端獲取網(wǎng)絡(luò)資源的web接口,后端通過io流的方式獲得網(wǎng)絡(luò)資源并使用http協(xié)議返回給前端。這就是一個完整的前后端交互過程。
3.核心業(yè)務(wù)
如何編寫Java程序。關(guān)于Java入門及Java核心基礎(chǔ)部分的知識,老師為大家準(zhǔn)備了這一套Java核心基礎(chǔ)課程視頻非常建議剛?cè)腴T的同學(xué)好好學(xué)一遍。
硬件如何訪問到Java程序:
硬件也可以通過http協(xié)議來訪問到j(luò)ava的web接口;
數(shù)據(jù)存到哪:
打卡機(jī)等硬件生成員工的打卡數(shù)據(jù),將數(shù)據(jù)發(fā)送給后端Java程序,Java程序?qū)?shù)據(jù)保存到MySQL數(shù)據(jù)庫中。但這還不夠,因?yàn)閿?shù)據(jù)大屏的前端也需要獲得數(shù)據(jù),于是需要讓數(shù)據(jù)大屏的后端去數(shù)據(jù)庫獲取數(shù)據(jù);
優(yōu)化點(diǎn)在哪里。
很顯然,設(shè)備的數(shù)據(jù)量非常大,勢必給數(shù)據(jù)庫造成過大的壓力。優(yōu)化點(diǎn)就在于如何讓數(shù)據(jù)庫更輕松一些。使用在處理能力上面非常優(yōu)秀的Redis緩存數(shù)據(jù)庫,解決數(shù)據(jù)庫的壓力。此時,與硬件對應(yīng)的后端java程序?qū)?shù)據(jù)存入到redis中,數(shù)據(jù)大屏的后端程序從redis中取出數(shù)據(jù),展示在數(shù)據(jù)大屏前端項(xiàng)目中。
三. 核心業(yè)務(wù)代碼
1.供硬件訪問的后端Java程序
1.1 Controller
1.2 service
2.數(shù)據(jù)大屏前端訪問后端接口
前端使用VUE的axios來發(fā)送http請求,訪問后端接口,并實(shí)時展示在DataV前端數(shù)據(jù)大屏框架的翻牌器組件中。
3.數(shù)據(jù)大屏后端提供數(shù)據(jù)的接口
3.1 Controller
3.2 service
四. 前后端聯(lián)調(diào)及測試
1.使用Postman測試后端硬件打卡接口
模擬使用id是1003,姓名是xiaoming的用戶進(jìn)行打卡,并返回打卡成功。
2.使用Postman測試后端獲得打卡數(shù)據(jù)接口
訪問后端獲得打卡總數(shù)的接口,獲得的打卡總數(shù)為18。
3.啟動前端項(xiàng)目獲得打卡總數(shù)
在項(xiàng)目路徑中使用cnpm install 安裝vue項(xiàng)目需要的依賴;
在項(xiàng)目路徑中使用npm run serve 啟動項(xiàng)目;
獲得頁面數(shù)據(jù)。
以上內(nèi)容就是為大家分享的億級流量互聯(lián)網(wǎng)項(xiàng)目構(gòu)建思路,不知道你現(xiàn)在是不是得到了一些啟發(fā)呢?在我們的線下課程里,這個智慧工地的項(xiàng)目會有詳細(xì)的講解哦,歡迎你來學(xué)習(xí)。