成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

 

 

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

問題抽象:

  • 用戶會員系統(tǒng);
  • 用戶會有分數(shù)流水,每個月要做一次分數(shù)統(tǒng)計,對不同分數(shù)等級的會員做不同業(yè)務處理;

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

  • 假設用戶在100w級別;
  • 假設用戶日均1條流水,也就是說日增流水數(shù)據(jù)量在100W級別,月新增流水在3kW級別,3個月流水數(shù)據(jù)量在億級別;

常見解決方案:

用一個定時任務,每個月的第一天計算一次。

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

一個月執(zhí)行一次的定時任務,會存在什么問題?

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

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

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

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

改為多線程并行處理,例如按照用戶拆分,會存在什么問題?

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

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

  • 同一份數(shù)據(jù),減少重復計算次數(shù);
  • 分攤CPU計算時間,盡量分散處理,而不是集中處理;
  • 減少單次計算數(shù)據(jù)量;

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

如上圖,假設每一個方格是1個月的分數(shù)流水數(shù)據(jù)(約3kW)。

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

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

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

新增月積分流水匯總表,每次只計算當月增量:

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

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

這樣一來,每條分數(shù)流水只會被計算一次。

如何分攤CPU計算時間,減少單次計算數(shù)據(jù)量呢?

業(yè)務需求是一個月重新計算一次分數(shù),但一個月集中計算,數(shù)據(jù)量太大,耗時太久,可以將計算分攤到每天。

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

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

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

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

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

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

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

總結(jié)

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

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

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

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

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

 

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2021-02-24 11:44:35

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

2018-07-18 15:13:56

MCU代碼時間

2010-09-06 13:17:19

SQL Server語句

2010-04-28 12:33:36

Oracle自定義函數(shù)

2010-09-08 15:00:03

SQL語句執(zhí)行

2022-03-28 08:31:29

線程池定時任務

2011-05-17 13:32:04

oracle

2024-04-09 10:40:04

2010-11-18 15:53:30

Oracle語句執(zhí)行時

2024-11-04 16:01:01

2024-09-05 09:54:32

2022-07-29 15:47:33

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

2019-05-28 09:31:05

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

2024-08-22 14:16:08

2019-05-27 09:56:00

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

2010-03-10 15:47:58

crontab定時任務

2024-04-18 09:00:00

數(shù)據(jù)存儲數(shù)據(jù)庫

2009-11-26 11:05:44

PHP計算頁面執(zhí)行時間

2020-07-14 08:17:26

代碼執(zhí)行時間

2024-04-12 07:50:40

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

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

主站蜘蛛池模板: 中文字幕综合 | 亚洲精品久久久久久久久久吃药 | 欧美一级片中文字幕 | 久久专区 | 麻豆亚洲 | 日韩一区二区三区在线视频 | 欧美日韩在线一区二区 | 天天操天天拍 | 午夜精品久久久久久久星辰影院 | aaaaaaa片毛片免费观看 | 日韩欧美在线一区二区 | av中文字幕在线播放 | 国产极品车模吞精高潮呻吟 | 狠狠做六月爱婷婷综合aⅴ 国产精品视频网 | 亚洲精品久久久久久久不卡四虎 | 精品国产伦一区二区三区观看方式 | 亚洲视频在线观看一区二区三区 | 中文字幕视频在线观看 | 天天躁日日躁性色aⅴ电影 免费在线观看成年人视频 国产欧美精品 | 亚洲欧美国产精品久久 | 国产乱码精品一区二区三区中文 | 欧美精品中文字幕久久二区 | 欧美a在线观看 | 三级av在线 | 国产清纯白嫩初高生在线播放视频 | 精品伊人 | 在线国产一区二区 | 日本三级网站在线观看 | 一区在线播放 | 狠狠综合久久av一区二区老牛 | 亚洲精品一区二区三区蜜桃久 | 精品一区二区在线观看 | 欧美日韩国产在线观看 | 一区二区手机在线 | 一区二区在线免费观看 | 亚洲激情一区二区三区 | 精品国产一区二区三区日日嗨 | 国产精品久久久久久久久久 | 国产黄色电影 | 亚洲精品亚洲人成人网 | 免费在线观看一区二区 |