目錄
- 前言
- 場景
- 為什麼會很慢
- 優化數據獲取
- 拆分數據
- 約定分片
- 高可用
- 總結
前言
最近發現員工在處理業務時,一旦遇到大的數據量,就會很慢,而且經常會把jvm搞死。小夥伴們還理所應當的反饋,數據量太大了,所以這樣子。
記得畢業的時候,面試華為有個面試題,【如何網絡傳輸幾個G的大文件】?當初年輕沒有答上來。下面我們就來分析一下如何處理大的數據量。
場景
現在有100萬條數據等待著處理,我們怎麼去處理它?而且
能否抽象成公共的方法進行處理?我們這邊討論的是數據已經準備好了,可以理解為已經存儲在數據庫中了。我們來分析一下正常的處理數據流程:
1、獲取要處理的數據
2、處理數據
3、返回處理結果以及狀態:成功或失敗
4、處理結果進行上報
![你知道如何處理大數據量嗎?(數據拆分篇)](http://p2.ttnews.xyz/loading.gif)
為什麼會很慢
數據處理,一般的方法,先獲得數據,再對數據進行處理,等待處理結果,再上報。
- 獲取數據慢
如果有100萬的數據量,那我們在獲取數據這個邏輯,就要去獲取100萬次,數據存儲在數據庫中,那就要和數據庫交互100萬次,這個肯定會慢
- 處理數據慢
如果處理一條數據,我們耗時需要100ms,那麼處理100萬條,就需要10萬秒,也就是需要27.7個小時,單單處理數據就會很慢。
- 上報數據慢
處理一條數據後,要把結果上報,如果一條數據處理完後,上報到業務系統需要100ms,那100萬條,也需要27.7個小時,也會很慢
這個就是我們小夥伴按照正常的處理流程,去處理大數據量時,會很慢的原因。根本原因是用同步方式進行業務處理。
如何去解決?核心思想就是分拆模塊,並行處理。
記得華為【如何網絡傳輸幾個G的大文件】的面試題嗎?再想想一些下載軟件,是如何下載大的文件的?小夥伴應該一下子就會說用多線程,把大文件分拆成N個小文件,1個線程單獨去處理一個小文件。
優化數據獲取
在獲取數據時,一般是一次處理一條數據,每次到數據庫中獲取。那我們可以優化一下:
- 批量數據
每次獲取數據時,不要獲取一條數據進行處理,如:每次去數據庫獲取個1000條數據到本地jvm緩存中,然後進行本地循環處理數據。
處理完1000條之後,再去數據庫取1000條數據,這樣的批量獲取數據,就極大的優化了和數據庫交互的次數,提升了1000倍。
我們再想想可以不可以再優化一下。我們上面的批量方案,是在單個jvm進程中處理的,那能不能有多個進程或服務器去處理數據呢?
拆分數據
![你知道如何處理大數據量嗎?(數據拆分篇)](http://p2.ttnews.xyz/loading.gif)
上圖中,就利用多個服務器進行處理數據,這樣又提升了處理數據的能力,其實就是把數據拆分到多個處理服務器中。不過引入這個方案就會遇到一個問題,就是如何避免數據重複處理?
這個問題的產生是因為在獲取數據時,不知道數據是否已經被拿走去處理了,當然我們可以把數據增加個處理狀態:【未處理,處理中,處理成功,處理失敗】。獲取數據時選擇【未處理】的數據,獲取到數據後,要把數據的處理狀態設置為【處理中】。
上面的業務邏輯是沒有問題,但如果多個服務器去同時去獲取時,會產生競爭,也會有可能獲取到重複的數據。
- 分佈式鎖
這個時候可以引入分佈式鎖,避免同時去獲取數據, 小夥伴不瞭解分佈式鎖,可以看之前的文章。
我們再想一下,是否可以在優化一下,因為利用分佈鎖也是比較影響性能的,多服務器之間同時獲取時,還是要等待的,雖然他們大多數的時候不可能同時完成一批數據,但也是有可能的。
約定分片
我們可以採取約定分片的方式,如服務器A只處理ID為【1~30萬】數據,服務器B只處理ID【30萬~60萬】的數據,服務器C只處理【60萬~100萬】的數據。
也就是程序在獲取數據的時候,我們已經規劃好分片的規則,讓不同的服務器去處理不同的分片數據,這樣多個服務器就不存在數據競爭的問題。因為他們處理的是不同的數據。
如果覺得服務器不夠,可以在增加服務器,分片規則可以設置在數據庫中,和之前的 原理類似。
高可用
我們發現上面的設計,一旦某個分片處理服務器掛了,那這些分片的數據就沒法處理了。小夥伴有沒有解決方案?其實很簡單,就是在分片的基礎上面,加上集群化處理。
上圖中,增加了服務器A-1,A-2,同時負責【1~30萬】的數據處理任務,一旦服務器A掛了,A-1,A-2照樣可以處理數據。
當然一樣會遇到數據重複處理的問題,這個時候就可以採用分佈鎖方案,進行小範圍加鎖。
總結
這裡老顧介紹了如何把大數據量進行拆分,劃分成小份,同步進行處理,這樣就可以極大提升處理效率。
當然這裡介紹的是處理大數據量第一步,如何設計獲取數據?下面老顧還會介紹處理數據的優化、以及數據上報等,不過相對獲取數據的方案,處理數據以及上報數據結果,相對比較簡單,小夥伴們先自行思考一下。
-End-
如有收穫,請幫忙轉發,您的鼓勵是作者最大的動力,謝謝!
10幾年的經驗實戰分享
相關微服務,分佈式,高併發,高可用,企業實戰,乾貨等原創文章正在路上
1、
2、
3、
4、
5、
6、
7、
8、
9、
10、
11、
12、
閱讀更多 老顧聊技術 的文章