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

一個(gè)接口查詢(xún)關(guān)聯(lián)了十幾張表,響應(yīng)速度太慢?怎么辦?

數(shù)據(jù)庫(kù) MySQL
一個(gè)接口查詢(xún)關(guān)聯(lián)了十幾張表,響應(yīng)速度太慢?怎么辦?我們選擇了“通過(guò) ETL 提前進(jìn)行數(shù)據(jù)整合”的方案。

一個(gè)接口查詢(xún)關(guān)聯(lián)了十幾張表,響應(yīng)速度太慢?怎么辦?

 

不知道開(kāi)發(fā)的同學(xué)有沒(méi)有遇到過(guò)類(lèi)似這樣的需求:

  • 相同類(lèi)型的數(shù)據(jù)在多個(gè)系統(tǒng)中,如果要得到全部的信息,就要連續(xù)調(diào)多個(gè)系統(tǒng)的接口;
  • 業(yè)務(wù)復(fù)雜,一個(gè)需求需要關(guān)聯(lián)幾張表甚至幾十張表才能得到想要的結(jié)果;
  • 系統(tǒng)做了分庫(kù)分表,但是需要統(tǒng)計(jì)所有的數(shù)據(jù)。

那么此類(lèi)需求要如何滿(mǎn)足呢?我們選擇了“通過(guò) ETL 提前進(jìn)行數(shù)據(jù)整合”的方案。

什么是 ETL

說(shuō)到ETL,很多開(kāi)發(fā)伙伴可能會(huì)有些陌生,更多的時(shí)候 ETL 是用在大數(shù)據(jù)、數(shù)據(jù)分析的相關(guān)崗位;我也是在近幾年的工作過(guò)程中才接觸到ETL的,現(xiàn)在的項(xiàng)目比較依賴(lài) ETL,可以說(shuō)是項(xiàng)目中重要的一部分。

ETL 是三個(gè)單詞的縮寫(xiě):

  • Extraction:抽取、提??;就是把數(shù)據(jù)從數(shù)據(jù)庫(kù)里面取出來(lái);
  • Transformation:轉(zhuǎn)換;包括但不限于:數(shù)據(jù)篩選校驗(yàn)、數(shù)據(jù)關(guān)聯(lián)、數(shù)據(jù)內(nèi)容及結(jié)構(gòu)的修改、運(yùn)算、統(tǒng)計(jì)等等;
  • Loading:加載;將處理后的數(shù)據(jù)保存到目標(biāo)數(shù)據(jù)庫(kù)。

從這三個(gè)單詞基本可以了解 ETL 的作用:將各個(gè)業(yè)務(wù)系統(tǒng)的數(shù)據(jù),通過(guò)抽取、清洗、轉(zhuǎn)換之后,將加工后的數(shù)據(jù)落地到數(shù)據(jù)庫(kù)中(數(shù)據(jù)倉(cāng)庫(kù));在這個(gè)過(guò)程中,ETL 可以將分散、零亂、標(biāo)準(zhǔn)不統(tǒng)一的數(shù)據(jù)整合到一起。

一個(gè)接口查詢(xún)關(guān)聯(lián)了十幾張表,響應(yīng)速度太慢?怎么辦?

 

使用場(chǎng)景

我接觸過(guò)的項(xiàng)目,使用 ETL 工具的場(chǎng)景有這個(gè)幾種:

1. 報(bào)表、BI系統(tǒng):

在公司建設(shè)的初期,業(yè)務(wù)比較少,系統(tǒng)也比較少,一臺(tái)數(shù)據(jù)庫(kù)就搞定了;隨著公司業(yè)務(wù)的增加,業(yè)務(wù)系統(tǒng)被拆成很多系統(tǒng);隨著數(shù)據(jù)量的繼續(xù)增加,單個(gè)系統(tǒng)的數(shù)據(jù)增加到一定程度的時(shí)候,也做了分庫(kù)分表;

這時(shí)候領(lǐng)導(dǎo)、業(yè)務(wù)人員在用數(shù)據(jù)做分析的時(shí)候,數(shù)據(jù)來(lái)源可能是多個(gè)系統(tǒng)的多張表,這時(shí)候企圖通過(guò)一個(gè)復(fù)雜的 SQL 跑出來(lái)結(jié)果就很困難了;通常公司會(huì)建立一個(gè)數(shù)據(jù)倉(cāng)庫(kù),通過(guò) ETL 工具把數(shù)據(jù)抽取到數(shù)據(jù)倉(cāng)庫(kù)中,再做數(shù)據(jù)的擬合和展示。

2. 跨系統(tǒng)的數(shù)據(jù)加工或查詢(xún):

我們現(xiàn)在所在公司,業(yè)務(wù)系統(tǒng)有幾百個(gè),由于業(yè)務(wù)流程比較復(fù)雜,前端系統(tǒng)在做業(yè)務(wù)操作的時(shí)候,在正式提交交易之前,有很多業(yè)務(wù)校驗(yàn);

比如要查詢(xún)客戶(hù)在 X 系統(tǒng)的交易歷史,在 Y 系統(tǒng)的交易歷史,在 Z 系統(tǒng)的交易歷史;那么就需要分別調(diào)用 X、Y、Z 系統(tǒng)的接口,這個(gè)對(duì)前端系統(tǒng)很不友好,那么通常的解決方案是什么?

  • A 方案:做一個(gè)中間服務(wù),中間服務(wù)去調(diào)用 X、Y、Z 系統(tǒng)的接口,客戶(hù)端直接調(diào)用這個(gè)中間服務(wù);這種方案只是把前端要做的事情,轉(zhuǎn)移到了中間服務(wù);
  • B 方案:整合 X、Y、Z 三個(gè)系統(tǒng),建服務(wù)中臺(tái);這種方法很好,但是極為難,對(duì)于很多公司來(lái)說(shuō),別說(shuō)把 X、Y、Z 三個(gè)系統(tǒng)整合成一個(gè)中臺(tái)系統(tǒng),就是其中一個(gè)系統(tǒng)本身進(jìn)行重構(gòu),都是非常困難的;
  • C 方案:把 X、Y、Z 三個(gè)系統(tǒng)中需要的數(shù)據(jù),通過(guò) ETL 抽取加工到一個(gè)數(shù)據(jù)倉(cāng)庫(kù)中,對(duì)外提供服務(wù);這個(gè)系統(tǒng)最大的好處是在不改造 X、Y、Z 三個(gè)系統(tǒng)的前提下,又可以實(shí)現(xiàn)跨系統(tǒng)的查詢(xún)。

我們?cè)?C 方案的基礎(chǔ)上又往前做了一步,就是將落地后的數(shù)據(jù)又做了一次加工,將需要跨表關(guān)聯(lián)的數(shù)據(jù),提前關(guān)聯(lián)好存入 MongoDB 中,對(duì)外提供查詢(xún)服務(wù);這樣可以將多表關(guān)聯(lián)查詢(xún),變成了單表查詢(xún)。

一個(gè)接口查詢(xún)關(guān)聯(lián)了十幾張表,響應(yīng)速度太慢?怎么辦?

 

吐數(shù)據(jù) VS 抽數(shù)據(jù)

接上文中第二個(gè)例子中的 C 方案,有些同學(xué)可能會(huì)有個(gè)疑問(wèn):數(shù)據(jù)抽取,需要抽取哪些數(shù)據(jù)呢?為什么不讓這些系統(tǒng)把數(shù)據(jù)吐出來(lái)呢?

答案也簡(jiǎn)單,“有的時(shí)候,數(shù)據(jù)不一定能吐出來(lái)”。

MySQL 數(shù)據(jù)庫(kù)往外吐數(shù)據(jù)有比較成熟的中間件,比如 Canal,它可以通過(guò)監(jiān)聽(tīng) Mysql 的 binlog 日志來(lái)獲取數(shù)據(jù),binlog 設(shè)置為 row 模式,能夠獲取到每一條新增、刪除、修改的日志,同時(shí)還能獲取到修改前后的數(shù)據(jù);

其他商用數(shù)據(jù)庫(kù),比如 Oracle、DB2 等,我也查閱過(guò)相關(guān)的資料,也是有觸發(fā)器機(jī)制,可以當(dāng)數(shù)據(jù)發(fā)生變化的時(shí)候通知出來(lái),比如調(diào)用一段程序,將數(shù)據(jù)發(fā)送到消息隊(duì)列中,再由其他程序監(jiān)聽(tīng)消息隊(duì)列做后續(xù)處理。

不管什么類(lèi)型的數(shù)據(jù)庫(kù),這種“吐數(shù)據(jù)”的方案,對(duì)于基礎(chǔ)設(shè)施的要求都比較高,并且對(duì)原有系統(tǒng)有一定的侵入性;所以我們采用了對(duì)原有系統(tǒng)侵入性更小的方案:主動(dòng)抽數(shù)據(jù)。

ETL 方案的優(yōu)缺點(diǎn)

1. 優(yōu)點(diǎn)

  • 侵入性較低,數(shù)據(jù)源系統(tǒng)只需要開(kāi)通數(shù)據(jù)庫(kù)的訪問(wèn)權(quán)限即可,為保證數(shù)據(jù)抽取對(duì)業(yè)務(wù)的影響,通常是訪問(wèn)源系統(tǒng)的備庫(kù),并且單獨(dú)設(shè)置一個(gè)只讀權(quán)限的數(shù)據(jù)庫(kù)用戶(hù);
  • 支持不同類(lèi)型數(shù)據(jù)源的數(shù)據(jù)抽取,比如源庫(kù)有 Mysql、DB2、Oracle,通過(guò) ETL 也可以輕松搞定;
  • 數(shù)據(jù)整合,將不同業(yè)務(wù)系統(tǒng)的相同數(shù)據(jù)整合在一起,比如有些系統(tǒng) M/F 表示男女,有些系統(tǒng) 1/0 表示男女,ETL 在抽取加工后轉(zhuǎn)換成統(tǒng)一的編碼;

2. 缺點(diǎn)

  • 比較致命的一個(gè)缺點(diǎn),就是數(shù)據(jù)抽取和加工有一定的延遲,需要根據(jù)業(yè)務(wù)場(chǎng)景進(jìn)行評(píng)估,是否接受這個(gè)延遲;
  • 可能會(huì)受到源庫(kù)表結(jié)構(gòu)變化的影響;
  • 如果源庫(kù)中的表沒(méi)有時(shí)間戳,或者時(shí)間戳不準(zhǔn)確,那么增量抽取就變得很困難;
  • 需要招聘 ETL 開(kāi)發(fā)崗,從我目前的經(jīng)驗(yàn)看,不是特別好招。

 

責(zé)任編輯:龐桂玉 來(lái)源: 今日頭條
相關(guān)推薦

2024-08-06 08:08:14

2022-12-20 08:46:41

MySQL主從復(fù)制

2014-03-31 16:15:47

移動(dòng)應(yīng)用優(yōu)化

2011-08-29 17:16:29

Ubuntu

2020-03-24 15:35:35

C盤(pán)GB系統(tǒng)技巧

2017-06-12 15:53:40

程序員代碼編程

2022-07-28 07:49:29

數(shù)據(jù)庫(kù)分頁(yè)查詢(xún)

2022-09-07 09:00:00

計(jì)算數(shù)據(jù)庫(kù)

2009-11-03 08:56:02

linux死機(jī)操作系統(tǒng)

2022-12-19 11:31:57

緩存失效數(shù)據(jù)庫(kù)

2022-07-05 11:48:47

MySQL死鎖表鎖

2025-02-19 13:00:00

移動(dòng)端觸摸事件響應(yīng)速度JavaScrip

2019-12-09 09:34:47

緩存響應(yīng)數(shù)據(jù)

2022-06-13 09:45:51

Hook技術(shù)移動(dòng)應(yīng)用響應(yīng)速度

2023-09-02 20:13:01

代碼網(wǎng)速

2022-02-24 10:31:14

前端API命令

2020-10-15 07:51:57

緩存庫(kù)數(shù)據(jù)庫(kù)

2022-07-05 14:19:30

Spring接口CGLIB

2011-11-16 10:02:48

DNSDNS記錄DNS記錄消失

2011-11-18 10:52:00

點(diǎn)贊
收藏

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