閱讀581 返回首頁    go 王者榮耀


如何將個性化需求變成大數據解決方案

前言

大數據的技術日新月異,解決了很多傳統的方法所無法解決的問題,為軟件實現上提供了新思路。目前已經有很多企業已經基於大數據的相關技術已經搭建了很多係統。
在係統的搭建過程中,需要解決一個的問題:“我的這個需求,用大數據的技術如何實現”。這個問題需要個同時對業務和大數據技術都比較了解的人來做設計。本文就我在平時工作中總結出來的一些思路,希望對大家能有所幫助。

需求分析

在此之前首先需要先考慮,這個需求是否有必要用大數據手段來解決。一些大數據的典型場景,比如大規模離線計算、周期性的報表、機器學習算法等,目前大數據已經有非常成熟的方案,在考慮實現的時候,我們可以用通用的大數據技術來實現。但是大數據也不是萬能的,有一些場景可能用其他的方法更加合適。也有一些場景,看起來和大數據似乎沒啥關係,但是細細分析下來,這個需求是大數據擅長解決的場景。所以我們隻是需要把大數據當成解決問題的一種工具。在找對工具之前,我們需要先對需求做一些分析。

這裏舉個例子,地鐵站裏的人流,不停有人進來和出去。需要統計當前的地鐵站的人數,從而判斷是否啟動緊急措施進行分流限流,從而實現智能調度(這個需求是我自己想的,不過我確實在杭州看到人流高峰有一些地鐵站隻準出不準入,另外也可以動態增加一些班次)。地鐵有運營時間,假設到晚上11時30分結束,所以0點可以近似認為地鐵裏沒有乘客。

流程梳理

每天0定初始化人數為0,然後人數增加時(乘客從入口增加或者從地鐵上下來)增加人數,在人數減少時(乘客從出口離開或者乘坐地鐵離開)減少人數,最終實時或者近似實時得統計當前的站點內的人數。
這個需求的實現包含以下幾個部分功能模塊:
1. 數據采集。包括人員增加和減少場景下相關數據的采集。從入口進入和從出口離開比較容易,閘機上比較容易獲得通過人數,當人員通過閘機時,根據閘機的類型(出口還是入口)寫一條記錄。而上下地鐵可能需要用到一些諸如傳感器或者攝像頭配合圖像識別算法來實現。
2. 數據計算。根據數據的增加和減少,在滿足時效性需求的前提下,計算出當前的人數。這個典型的實現方法有兩種。一種是用數據庫的SQL來實現,把數據增減寫到數據庫裏,最後通過計算時間做過濾後,對增加人數和減少人數分別求和後相減得到最終的人數。這個計算方式比較容易被理解,實現上比較簡單,但是缺點是每次計算當前的人數需要把當天全部的人數重新統計一次,計算量比較大。另外一種方法是計算的時候,對於實時數據進入係統的時候,在原來的計算結果的基礎上,再做增量計算。比如當前有100人,增加1個,那就是100+1=101,又出去兩個人,就是101-2=99。中間的計算隻涉及增量的數據計算,而不會把全部的數據重新算一次。
3. 數據消費。計算出來的結果,可能需要對接到業務係統裏,這個需要看業務係統的對接方式。一個比較通用的方法是把計算結果實時寫入到數據庫裏供業務係統對接。另外也可能是需要以圖表的形式進行展示以便直觀地對數據進行理解。

功能實現

功能實現上,我比較喜歡從計算引擎上入手設計實現方法。就如這裏的數據計算部分,考慮到地鐵的人流量比較高(城市有多個地鐵站,而在人流高峰的時候進出較多),為了保證計算性能,我比較偏向於用相對計算複雜度較低的流式計算的方案從而獲得高並發和高性能。但是如果人流量比較少而且時效性要求很低,比如把這個場景變成某飯店/門診科室的人流量統計/排隊量統計,我可能會考慮用數據庫查詢+緩存的方式來實現。
計算引擎確定用流計算的方案後,對應的數據寫入就需要使用流計算引擎支持的流式數據上傳方式進行寫入。而流計算後的結果,可以通用的寫入到數據庫供後續調用,或者寫到消息中間件進行業務係統調用。

產品方案

以阿裏雲的雲產品為例,流計算產品(StreamCompute)能比較好的滿足計算引擎的需求。而數據可以用SDK寫入到Datahub。考慮到可能用到傳感器,這時候可以使用物聯網套件。最終的數據消費,可以寫入到RDS供業務係統調用/供DataV做可視化展示,也可以寫入到消息隊列/函數計算。

基於這個梳理,最終的架構圖可以使用IOT的標準架構圖
image

最後更新:2017-11-29 00:34:25

  上一篇:go  燃!阿裏的技術小哥們又又又拿冠軍了!
  下一篇:go  阿裏巴巴正式開源其自研容器技術Pouch