你知道如何處理大數據量嗎?(數據拆分篇)


目錄

  1. 前言
  2. 場景
  3. 為什麼會很慢
  4. 優化數據獲取
  5. 拆分數據
  6. 約定分片
  7. 高可用
  8. 總結

前言

最近發現員工在處理業務時,一旦遇到大的數據量,就會很慢,而且經常會把jvm搞死。小夥伴們還理所應當的反饋,數據量太大了,所以這樣子。

記得畢業的時候,面試華為有個面試題,【如何網絡傳輸幾個G的大文件】?當初年輕沒有答上來。下面我們就來分析一下如何處理大的數據量。

場景

現在有100萬條數據等待著處理,我們怎麼去處理它?而且

能否抽象成公共的方法進行處理?我們這邊討論的是數據已經準備好了,可以理解為已經存儲在數據庫中了。

我們來分析一下正常的處理數據流程

1、獲取要處理的數據

2、處理數據

3、返回處理結果以及狀態:成功或失敗

4、處理結果進行上報

你知道如何處理大數據量嗎?(數據拆分篇)

為什麼會很慢

數據處理,一般的方法,先獲得數據,再對數據進行處理,等待處理結果,再上報

  • 獲取數據慢

如果有100萬的數據量,那我們在獲取數據這個邏輯,就要去獲取100萬次,數據存儲在數據庫中,那就要和數據庫交互100萬次,這個肯定會慢

  • 處理數據慢

如果處理一條數據,我們耗時需要100ms,那麼處理100萬條,就需要10萬秒,也就是需要27.7個小時,單單處理數據就會很慢。

  • 上報數據慢

處理一條數據後,要把結果上報,如果一條數據處理完後,上報到業務系統需要100ms,那100萬條,也需要27.7個小時,也會很慢

這個就是我們小夥伴按照正常的處理流程去處理大數據量時,會很慢的原因。根本原因是用同步方式進行業務處理

如何去解決?核心思想就是分拆模塊,並行處理。

記得華為【如何網絡傳輸幾個G的大文件】的面試題嗎?再想想一些下載軟件,是如何下載大的文件的?小夥伴應該一下子就會說用多線程,把大文件分拆成N個小文件,1個線程單獨去處理一個小文件。

優化數據獲取

在獲取數據時,一般是一次處理一條數據,每次到數據庫中獲取。那我們可以優化一下:

  • 批量數據

每次獲取數據時,不要獲取一條數據進行處理,如:每次去數據庫獲取個1000條數據到本地jvm緩存中,然後進行本地循環處理數據

處理完1000條之後,再去數據庫取1000條數據,這樣的批量獲取數據,就極大的優化了和數據庫交互的次數,提升了1000倍。

我們再想想可以不可以再優化一下。我們上面的批量方案,是在單個jvm進程中處理的,那能不能有多個進程或服務器去處理數據呢?

拆分數據

你知道如何處理大數據量嗎?(數據拆分篇)

上圖中,就利用多個服務器進行處理數據,這樣又提升了處理數據的能力,其實就是把數據拆分到多個處理服務器中。不過引入這個方案就會遇到一個問題,就是如何避免數據重複處理?

這個問題的產生是因為在獲取數據時,不知道數據是否已經被拿走去處理了,當然我們可以把數據增加個處理狀態:【未處理,處理中,處理成功,處理失敗】獲取數據時選擇【未處理】的數據,獲取到數據後,要把數據的處理狀態設置為【處理中】。

上面的業務邏輯是沒有問題,但如果多個服務器去同時去獲取時,會產生競爭,也會有可能獲取到重複的數據。

  • 分佈式鎖

這個時候可以引入分佈式鎖,避免同時去獲取數據, 小夥伴不瞭解分佈式鎖,可以看之前的文章。

我們再想一下,是否可以在優化一下,因為利用分佈鎖也是比較影響性能的,多服務器之間同時獲取時,還是要等待的,雖然他們大多數的時候不可能同時完成一批數據,但也是有可能的。

約定分片

我們可以採取約定分片的方式,如服務器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、


分享到:


相關文章: