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