偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

處理億級(jí)數(shù)據(jù)的“定時(shí)任務(wù)”,如何縮短執(zhí)行時(shí)間?

開發(fā) 開發(fā)工具 前端
一個(gè)月執(zhí)行一次的定時(shí)任務(wù),會(huì)存在什么問(wèn)題?計(jì)算量很大,處理的數(shù)據(jù)量很大,耗時(shí)很久,按照水友的說(shuō)法,需要1-2天。

 

 

繼續(xù)答水友提問(wèn)。

問(wèn)題抽象:

  • 用戶會(huì)員系統(tǒng);
  • 用戶會(huì)有分?jǐn)?shù)流水,每個(gè)月要做一次分?jǐn)?shù)統(tǒng)計(jì),對(duì)不同分?jǐn)?shù)等級(jí)的會(huì)員做不同業(yè)務(wù)處理;

數(shù)據(jù)假設(shè):

  • 假設(shè)用戶在100w級(jí)別;
  • 假設(shè)用戶日均1條流水,也就是說(shuō)日增流水?dāng)?shù)據(jù)量在100W級(jí)別,月新增流水在3kW級(jí)別,3個(gè)月流水?dāng)?shù)據(jù)量在億級(jí)別;

常見解決方案:

用一個(gè)定時(shí)任務(wù),每個(gè)月的第一天計(jì)算一次。

  1. //(1)查詢出所有用戶 
  2. uids[] = select uid from t_user; 
  3. //(2)遍歷每個(gè)用戶 
  4. foreach $uid in uids[]{ 
  5.          //(3)查詢用戶3個(gè)月內(nèi)分?jǐn)?shù)流水 
  6.          scores[]= select score from t_flow 
  7.                    where uid=$uid and time=[3個(gè)月內(nèi)]; 
  8.          //(4)遍歷分?jǐn)?shù)流水 
  9.          foreach $score in scores[]{ 
  10.                    //(5)計(jì)算總分?jǐn)?shù) 
  11.                    sum+= $score; 
  12.          } 
  13.          //(6)根據(jù)分?jǐn)?shù)做業(yè)務(wù)處理 
  14.          switch(sum) 
  15.          升級(jí)降級(jí),發(fā)優(yōu)惠券,發(fā)獎(jiǎng)勵(lì); 

一個(gè)月執(zhí)行一次的定時(shí)任務(wù),會(huì)存在什么問(wèn)題?

計(jì)算量很大,處理的數(shù)據(jù)量很大,耗時(shí)很久,按照水友的說(shuō)法,需要1-2天。

畫外音:外層循環(huán)100W級(jí)別用戶;內(nèi)層循環(huán)9kW級(jí)別流水;業(yè)務(wù)處理需要10幾次數(shù)據(jù)庫(kù)交互。

可不可以多線程并行處理?

可以,每個(gè)用戶的流水處理不耦合。

改為多線程并行處理,例如按照用戶拆分,會(huì)存在什么問(wèn)題?

每個(gè)線程都要訪問(wèn)數(shù)據(jù)庫(kù)做業(yè)務(wù)處理,數(shù)據(jù)庫(kù)有可能扛不住。

這類問(wèn)題的優(yōu)化方向是:

  • 同一份數(shù)據(jù),減少重復(fù)計(jì)算次數(shù);
  • 分?jǐn)侰PU計(jì)算時(shí)間,盡量分散處理,而不是集中處理;
  • 減少單次計(jì)算數(shù)據(jù)量;

如何減少同一份數(shù)據(jù),重復(fù)計(jì)算次數(shù)?

如上圖,假設(shè)每一個(gè)方格是1個(gè)月的分?jǐn)?shù)流水?dāng)?shù)據(jù)(約3kW)。

  • 3月底計(jì)算時(shí),要查詢并計(jì)算1月,2月,3月三個(gè)月的9kW數(shù)據(jù);
  • 4月底計(jì)算時(shí),要查詢并計(jì)算2月,3月,4月三個(gè)月的9kW數(shù)據(jù);

會(huì)發(fā)現(xiàn),2月和3月的數(shù)據(jù)(粉色部分),被重復(fù)查詢和計(jì)算了多次。

畫外音:該業(yè)務(wù),每個(gè)月的數(shù)據(jù)會(huì)被計(jì)算3次。

新增月積分流水匯總表,每次只計(jì)算當(dāng)月增量:

  1. flow_month_sum(month, uid, flow_sum) 
  • 每到月底,只計(jì)算當(dāng)月分?jǐn)?shù),數(shù)據(jù)量減少到1/3,耗時(shí)也減少到1/3;
  • 同時(shí),把前2個(gè)月流水加和,就能得到最近3個(gè)月總分?jǐn)?shù)(這個(gè)動(dòng)作幾乎不花時(shí)間);

畫外音:該表的數(shù)量級(jí)和用戶表數(shù)據(jù)量一致,100w級(jí)別。

這樣一來(lái),每條分?jǐn)?shù)流水只會(huì)被計(jì)算一次。

如何分?jǐn)侰PU計(jì)算時(shí)間,減少單次計(jì)算數(shù)據(jù)量呢?

業(yè)務(wù)需求是一個(gè)月重新計(jì)算一次分?jǐn)?shù),但一個(gè)月集中計(jì)算,數(shù)據(jù)量太大,耗時(shí)太久,可以將計(jì)算分?jǐn)偟矫刻臁?/p>

如上圖,月積分流水匯總表,升級(jí)為,日積分流水匯總表。

把每月1次集中計(jì)算,分?jǐn)倿?0次分散計(jì)算,每次計(jì)算數(shù)據(jù)量減少到1/30,就只需要花幾十分鐘處理了。

甚至,每一個(gè)小時(shí)計(jì)算一次,每次計(jì)算數(shù)據(jù)量又能減少到1/24,每次就只需要花幾分鐘處理了。

雖然時(shí)間縮短了,但畢竟是定時(shí)任務(wù),能不能實(shí)時(shí)計(jì)算分?jǐn)?shù)流水呢?

每天只新增100w分?jǐn)?shù)流水,完全可以實(shí)時(shí)累加計(jì)算“日積分流水匯總”。

使用DTS(或者canal)增加一個(gè)分?jǐn)?shù)流水表的監(jiān)聽,當(dāng)用戶的分?jǐn)?shù)變化時(shí),實(shí)時(shí)進(jìn)行日分?jǐn)?shù)流水累加,將1小時(shí)一次的定時(shí)任務(wù)計(jì)算,均勻分?jǐn)偟?ldquo;每時(shí)每刻”,每天新增100w流水,數(shù)據(jù)庫(kù)寫壓力每秒鐘10多次,完全扛得住。

畫外音:如果不能使用DTS/canal,可以使用MQ。

總結(jié)

對(duì)于這類一次性集中處理大量數(shù)據(jù)的定時(shí)任務(wù),優(yōu)化思路是:

  • 同一份數(shù)據(jù),減少重復(fù)計(jì)算次數(shù);
  • 分?jǐn)侰PU計(jì)算時(shí)間,盡量分散處理(甚至可以實(shí)時(shí)),而不是集中處理;
  • 減少單次計(jì)算數(shù)據(jù)量; 希望大家有所啟示,思路比結(jié)論重要。

歡迎大家繼續(xù)提問(wèn),有問(wèn)必答。

【本文為51CTO專欄作者“58沈劍”原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)聯(lián)系原作者】

戳這里,看該作者更多好文

 

責(zé)任編輯:趙寧寧 來(lái)源: 51CTO專欄
相關(guān)推薦

2021-02-24 11:44:35

語(yǔ)言計(jì)算函數(shù)嵌入式系統(tǒng)

2018-07-18 15:13:56

MCU代碼時(shí)間

2010-09-06 13:17:19

SQL Server語(yǔ)句

2010-04-28 12:33:36

Oracle自定義函數(shù)

2010-09-08 15:00:03

SQL語(yǔ)句執(zhí)行

2022-03-28 08:31:29

線程池定時(shí)任務(wù)

2011-05-17 13:32:04

oracle

2024-04-09 10:40:04

2010-11-18 15:53:30

Oracle語(yǔ)句執(zhí)行時(shí)

2024-11-04 16:01:01

2024-09-05 09:54:32

2022-07-29 15:47:33

時(shí)間輪環(huán)狀數(shù)組

2019-05-28 09:31:05

Elasticsear億級(jí)數(shù)據(jù)ES

2024-08-22 14:16:08

2019-05-27 09:56:00

數(shù)據(jù)庫(kù)高可用架構(gòu)

2010-03-10 15:47:58

crontab定時(shí)任務(wù)

2024-04-18 09:00:00

數(shù)據(jù)存儲(chǔ)數(shù)據(jù)庫(kù)

2009-11-26 11:05:44

PHP計(jì)算頁(yè)面執(zhí)行時(shí)間

2020-07-14 08:17:26

代碼執(zhí)行時(shí)間

2024-04-12 07:50:40

Python監(jiān)控利器Time 模塊
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)