在後端數據量大起來之後,大部分的工作都是在“玩數據”。就像一捧沙子,左手換到右手,右手指縫間分流而出,再由另一雙手接住。所以作為產品經理,不僅要知道數據從哪來,還要理清楚獲取數據之後的運算邏輯、異常規則,以及異常情況、數據日誌等等。
本文繼數據庫之後,梳理了數據交互筆記,有興趣的朋友可以一起交流。
一、跨服務器數據傳輸
(1)公司的後端數據之所以存在不同的數據庫上,本質是為了解耦數據,提高單個數據庫的運算速度。多個子系統之間的交互,其本質就是數據傳輸。
數據傳輸方式:MQ(隊列)、http接口、otter、爬取、導入。
(2)MQ適用於公司內部,數據量大,規律性強,批量往來的數據。一般的配置是一方推出增量數據,另一方被動消費,像排隊進廁所一樣,不用設定頻率。
(3)http接口是最常用的。叫 interface,也有的叫 protocol。
如果數據源是一缸水,那麼接口就像是鑿了一個口。所以接口必須是在數據源這邊,由數據方定義接口。
接口規則就像過濾器一樣,設定推送前的篩選、轉化等運算規則,這就是接口的核心內容。
接口交互數據可以是主動推送,也可以是請求獲取。
- 主動推送一般是數據生產方一旦更新,則觸發推送,將所需字段對應值傳遞過去。
- 請求獲取就是數據需求方傳遞請求參數(請求參數一般是一個條件,比如:時間)。數據生產方則按照協議響應,給出滿足條件的數據到請求方(也就是返回參數)。
(4)接口定義是開發的事情,但產品需要確定出範圍:
接口定義的規則是什麼?傳參和返回參數是什麼?重複傳參時是跳過還是再次獲取(一般都再獲取)?必傳參數是什麼?是否回傳接收結果給數據生產方?
比如下圖:每小時/次取對方表中第一頁最新的50條數據。超過的數據下個小時繼續取。
(5)確保接口獲取的數據及時。
除了生產數據需要及時向下遊推送之外,還有基礎數據的更新也需要及時給下游同步,有時要做到同時。
方法是兩種:觸發式和定時腳本。
- 觸發式就是一旦一個參數值滿足條件則觸發。
- 腳本式一般用在請求獲取數據的時候。因為不知道數據源什麼時候更新,所以一般用定時腳本執行請求任務。
請求的頻率需要與更新的頻率相協調,比如:每次取6小時內更新的數據。每2小時取一次,則不會有問題。但是若每天取一次 就會有漏掉,也就是取數據的頻率要高於更新頻率。
(6)數據量大的時候,可以用otter:
- 方案1:直接請求對方的接口:數據多的時候 請求就多,會佔資源
- 方案2:為保證數據本身及時,OTTER是最好的,也就是庫對庫的傳輸(一般一個公司的才這樣)。
otter 方法:
- 數據全在一個表中;
- 本地庫建一個相同的表。
(7)爬取數據
一些第三方公司為了保密,會把文件存在網盤或網頁上,比如:第三方支付公司與協議公司約定好賬號密碼,登錄到SFTP篩選出需要的數據然後解析後保持到本地,這也實現了一個服務器之間的轉移。
(8)導入:數據量大的,且有規則數據也可以通過導入的方式。
文檔一般用csv格式,文件較小,兼容性好,然後需要定義好excel表格對應字段的關係即可。上傳時需要對文件檢驗,建議方案是一旦一處錯誤,就全部不予導入。
(9)爬取第三方數據的防止丟包機制
案例:到SFTP服務器抓取並解析字段,寫入數據表。
方案:
- 斷抓補抓:比如: 4號抓修改時間為3號的數據。5號斷抓,則6號抓取4、5號的數據。7號抓取6號的數據。
- 抓空補抓:網關的 每次抓取若抓空(獲取的數據是0個)則下次繼續抓。直到三次都未取到。則不再補救。
二、數據寫入
(1)先落地到中間表
如果獲取後還要再本地進行規則運算,則最好先落地到中間表,再由中間表寫入最終表。比如:從A系統獲取的數據取到B系統,要進行分攤後再寫入表。那麼最好先落地到B系統的中間表,然後再由中間表寫入目標表。
好處是,正向數據:可以異步處理,A——>中間表——>最終表,互相不影響。逆向數據:一旦數據異常,則方便追溯原因。
(2)去重規則:設置去重規則,以便再重複獲取數據時更新、插入或者跳過
注意去重規則一旦改變,則需要考慮到歷史數據對新數據的影響,因為二者的判重維度不一樣,可能會有交叉。
(3)數據日誌:目的是記錄數據的來龍去脈,追溯以分析bug
產品經理告訴開發加日誌,開發就會再後臺加,因為log4j開源代碼定義了5個主要級別的log:FATAL、ERROR、WARN、INFO、DEBUG,一般可以配置INFO或DEBUG級別的日誌。如果需要保留的時間長,則可以將其保存到本地。
本地的需求可以展示給用戶看,比如可以從以下維度展示:
(4)單進程鎖
腳本執行的頻率的時候,為保證數據是按單進程執行,不交疊,就要設置單進程鎖。比如:一小時一次,8點沒執行完 9點就不要執行。
另外在跑數據的規則上面,不要設置8點跑更新時間7點的,一旦小故障,就容易漏取。正確的要麼是更新時間為當前之前更久的,要麼就以狀態來限定, 比如:取is_use為否的。
(5)同步基礎數據的時候 是否提前過濾
比如:A系統維護了用戶基礎信息(其中有個狀態為是否啟用),B系統取用,但不做數據維護,只有啟用狀態的能用,那麼是否只取啟用狀態的到B,還是兩種狀態都取。
答案是:在數據量差異不大的情況下,取全量。
原因之一:若啟用狀態的用戶忽然被A系統禁用,那麼可能該用戶在B系統的生產數據報錯,這時候到中間表看狀態就可以看出來問題,而不需跨系統或跨部門溝通查證。
本文由 @ 環滁皆山也 原創發佈於人人都是產品經理。未經許可,禁止轉載
題圖來自 Pexels,基於 CC0 協議