后端產(chǎn)品經(jīng)理筆記:數(shù)據(jù)傳輸和寫入
在后端數(shù)據(jù)量大起來之后,大部分的工作都是在“玩數(shù)據(jù)”。就像一捧沙子,左手換到右手,右手指縫間分流而出,再由另一雙手接住。所以作為產(chǎn)品經(jīng)理,不僅要知道數(shù)據(jù)從哪來,還要理清楚獲取數(shù)據(jù)之后的運(yùn)算邏輯、異常規(guī)則,以及異常情況、數(shù)據(jù)日志等等。
本文繼數(shù)據(jù)庫之后,梳理了數(shù)據(jù)交互筆記,有興趣的朋友可以一起交流。
一、跨服務(wù)器數(shù)據(jù)傳輸
(1)公司的后端數(shù)據(jù)之所以存在不同的數(shù)據(jù)庫上,本質(zhì)是為了解耦數(shù)據(jù),提高單個(gè)數(shù)據(jù)庫的運(yùn)算速度。多個(gè)子系統(tǒng)之間的交互,其本質(zhì)就是數(shù)據(jù)傳輸。
數(shù)據(jù)傳輸方式:MQ(隊(duì)列)、http接口、otter、爬取、導(dǎo)入。
(2)MQ適用于公司內(nèi)部,數(shù)據(jù)量大,規(guī)律性強(qiáng),批量往來的數(shù)據(jù)。一般的配置是一方推出增量數(shù)據(jù),另一方被動(dòng)消費(fèi),像排隊(duì)進(jìn)廁所一樣,不用設(shè)定頻率。
(3)http接口是最常用的。叫 interface,也有的叫 protocol。
如果數(shù)據(jù)源是一缸水,那么接口就像是鑿了一個(gè)口。所以接口必須是在數(shù)據(jù)源這邊,由數(shù)據(jù)方定義接口。
接口規(guī)則就像過濾器一樣,設(shè)定推送前的篩選、轉(zhuǎn)化等運(yùn)算規(guī)則,這就是接口的核心內(nèi)容。
接口交互數(shù)據(jù)可以是主動(dòng)推送,也可以是請求獲取。
- 主動(dòng)推送一般是數(shù)據(jù)生產(chǎn)方一旦更新,則觸發(fā)推送,將所需字段對應(yīng)值傳遞過去。
- 請求獲取就是數(shù)據(jù)需求方傳遞請求參數(shù)(請求參數(shù)一般是一個(gè)條件,比如:時(shí)間)。數(shù)據(jù)生產(chǎn)方則按照協(xié)議響應(yīng),給出滿足條件的數(shù)據(jù)到請求方(也就是返回參數(shù))。
(4)接口定義是開發(fā)的事情,但產(chǎn)品需要確定出范圍:
接口定義的規(guī)則是什么?傳參和返回參數(shù)是什么?重復(fù)傳參時(shí)是跳過還是再次獲?。ㄒ话愣荚佾@取)?必傳參數(shù)是什么?是否回傳接收結(jié)果給數(shù)據(jù)生產(chǎn)方?
比如下圖:每小時(shí)/次取對方表中第一頁最新的50條數(shù)據(jù)。超過的數(shù)據(jù)下個(gè)小時(shí)繼續(xù)取。
(5)確保接口獲取的數(shù)據(jù)及時(shí)。
除了生產(chǎn)數(shù)據(jù)需要及時(shí)向下游推送之外,還有基礎(chǔ)數(shù)據(jù)的更新也需要及時(shí)給下游同步,有時(shí)要做到同時(shí)。
方法是兩種:觸發(fā)式和定時(shí)腳本。
- 觸發(fā)式就是一旦一個(gè)參數(shù)值滿足條件則觸發(fā)。
- 腳本式一般用在請求獲取數(shù)據(jù)的時(shí)候。因?yàn)椴恢罃?shù)據(jù)源什么時(shí)候更新,所以一般用定時(shí)腳本執(zhí)行請求任務(wù)。
請求的頻率需要與更新的頻率相協(xié)調(diào),比如:每次取6小時(shí)內(nèi)更新的數(shù)據(jù)。每2小時(shí)取一次,則不會(huì)有問題。但是若每天取一次 ?就會(huì)有漏掉,也就是取數(shù)據(jù)的頻率要高于更新頻率。
(6)數(shù)據(jù)量大的時(shí)候,可以用otter:
- 方案1:直接請求對方的接口:數(shù)據(jù)多的時(shí)候 請求就多,會(huì)占資源
- 方案2:為保證數(shù)據(jù)本身及時(shí),OTTER是最好的,也就是庫對庫的傳輸(一般一個(gè)公司的才這樣)。
otter 方法:
- 數(shù)據(jù)全在一個(gè)表中;
- 本地庫建一個(gè)相同的表。
(7)爬取數(shù)據(jù)
一些第三方公司為了保密,會(huì)把文件存在網(wǎng)盤或網(wǎng)頁上,比如:第三方支付公司與協(xié)議公司約定好賬號密碼,登錄到SFTP篩選出需要的數(shù)據(jù)然后解析后保持到本地,這也實(shí)現(xiàn)了一個(gè)服務(wù)器之間的轉(zhuǎn)移。
(8)導(dǎo)入:數(shù)據(jù)量大的,且有規(guī)則數(shù)據(jù)也可以通過導(dǎo)入的方式。
文檔一般用csv格式,文件較小,兼容性好,然后需要定義好excel表格對應(yīng)字段的關(guān)系即可。上傳時(shí)需要對文件檢驗(yàn),建議方案是一旦一處錯(cuò)誤,就全部不予導(dǎo)入。
(9)爬取第三方數(shù)據(jù)的防止丟包機(jī)制
案例:到SFTP服務(wù)器抓取并解析字段,寫入數(shù)據(jù)表。
方案:
- 斷抓補(bǔ)抓:比如: 4號抓修改時(shí)間為3號的數(shù)據(jù)。5號斷抓,則6號抓取4、5號的數(shù)據(jù)。7號抓取6號的數(shù)據(jù)。
- 抓空補(bǔ)抓:網(wǎng)關(guān)的 每次抓取若抓空(獲取的數(shù)據(jù)是0個(gè))則下次繼續(xù)抓。直到三次都未取到。則不再補(bǔ)救。
二、數(shù)據(jù)寫入
(1)先落地到中間表
如果獲取后還要再本地進(jìn)行規(guī)則運(yùn)算,則最好先落地到中間表,再由中間表寫入最終表。比如:從A系統(tǒng)獲取的數(shù)據(jù)取到B系統(tǒng),要進(jìn)行分?jǐn)偤笤賹懭氡?。那么最好先落地到B系統(tǒng)的中間表,然后再由中間表寫入目標(biāo)表。
好處是,正向數(shù)據(jù):可以異步處理,A——>中間表——>最終表,互相不影響。逆向數(shù)據(jù):一旦數(shù)據(jù)異常,則方便追溯原因。
(2)去重規(guī)則:設(shè)置去重規(guī)則,以便再重復(fù)獲取數(shù)據(jù)時(shí)更新、插入或者跳過
注意去重規(guī)則一旦改變,則需要考慮到歷史數(shù)據(jù)對新數(shù)據(jù)的影響,因?yàn)槎叩呐兄鼐S度不一樣,可能會(huì)有交叉。
(3)數(shù)據(jù)日志:目的是記錄數(shù)據(jù)的來龍去脈,追溯以分析bug
產(chǎn)品經(jīng)理告訴開發(fā)加日志,開發(fā)就會(huì)再后臺加,因?yàn)閘og4j開源代碼定義了5個(gè)主要級別的log:FATAL、ERROR、WARN、INFO、DEBUG,一般可以配置INFO或DEBUG級別的日志。如果需要保留的時(shí)間長,則可以將其保存到本地。
本地的需求可以展示給用戶看,比如可以從以下維度展示:
(4)單進(jìn)程鎖
腳本執(zhí)行的頻率的時(shí)候,為保證數(shù)據(jù)是按單進(jìn)程執(zhí)行,不交疊,就要設(shè)置單進(jìn)程鎖。比如:一小時(shí)一次,8點(diǎn)沒執(zhí)行完 9點(diǎn)就不要執(zhí)行。
另外在跑數(shù)據(jù)的規(guī)則上面,不要設(shè)置8點(diǎn)跑更新時(shí)間7點(diǎn)的,一旦小故障,就容易漏取。正確的要么是更新時(shí)間為當(dāng)前之前更久的,要么就以狀態(tài)來限定,?比如:取is_use為否的。
(5)同步基礎(chǔ)數(shù)據(jù)的時(shí)候 是否提前過濾
比如:A系統(tǒng)維護(hù)了用戶基礎(chǔ)信息(其中有個(gè)狀態(tài)為是否啟用),B系統(tǒng)取用,但不做數(shù)據(jù)維護(hù),只有啟用狀態(tài)的能用,那么是否只取啟用狀態(tài)的到B,還是兩種狀態(tài)都取。
答案是:在數(shù)據(jù)量差異不大的情況下,取全量。
原因之一:若啟用狀態(tài)的用戶忽然被A系統(tǒng)禁用,那么可能該用戶在B系統(tǒng)的生產(chǎn)數(shù)據(jù)報(bào)錯(cuò),這時(shí)候到中間表看狀態(tài)就可以看出來問題,而不需跨系統(tǒng)或跨部門溝通查證。
本文由 @ 環(huán)滁皆山也 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉(zhuǎn)載
題圖來自 Pexels,基于 CC0 協(xié)議
看了你的幾篇文章,這一篇對于我來說,是相對于其他較難理解的了,準(zhǔn)備通過各種方式吃透這篇文章
老哥滁州的嘛?
深圳,臨時(shí)想到一句就拿來做名字
明白人