跨系統(tǒng)數(shù)據(jù)對接的相關(guān)機制
在后端產(chǎn)品的世界里,各子系統(tǒng)之間,或與外部系統(tǒng)之間的對接非常常見,對接的本質(zhì)是為了實現(xiàn)數(shù)據(jù)信息的傳輸。
系統(tǒng)間數(shù)據(jù)傳輸?shù)姆绞街饕薪涌趥鬏?、?shù)據(jù)庫傳輸、文件共享傳輸、消息隊列方式傳輸?shù)?,以上在另一篇文章中已?jīng)有所介紹。本文僅關(guān)于獲取數(shù)據(jù)之后的運算邏輯、異常機制等,在這里做具體的舉例探討。
一、觸發(fā)式和定時任務(wù)方式獲取數(shù)據(jù)
數(shù)據(jù)獲取的方式,一種是操作事件觸發(fā),比如點擊頁面按鈕,則觸發(fā)傳遞最新數(shù)據(jù)。
這種的時效性比較高,但是也會由于并發(fā)而增加系統(tǒng)負荷。
如果對時效要求不高,就可以采用另一種方式,即定時任務(wù)方式獲取數(shù)據(jù)。
定時任務(wù)在后端產(chǎn)品中是很常用的。就是建立起一個腳本,然后布置到定時任務(wù)管理系統(tǒng)上,按一定的頻率,從數(shù)據(jù)生產(chǎn)方查詢滿足條件的數(shù)據(jù),并進行數(shù)據(jù)推送或者拉取操作。
定時任務(wù)獲取數(shù)據(jù)示意圖如下所示:
如上圖所示,“定時任務(wù)”即按照一定的頻率,查詢“數(shù)據(jù)提供方”的數(shù)據(jù)源中,滿足條件的數(shù)據(jù)(如圖中的“數(shù)據(jù)4”和“數(shù)據(jù)1”),并獲取到“數(shù)據(jù)需求方”。
定時任務(wù)的方式,可以從增量數(shù)據(jù)中查詢滿足條件的數(shù)據(jù),比如:
設(shè)定每次獲取6小時內(nèi)更新的數(shù)據(jù),獲取頻率為6小時一次(注意:該例子中,執(zhí)行的時間間隔不能大于6小時,以避免遺漏);
也可以從全量數(shù)據(jù)中查詢,比如:定義表字段“is_got”為“是否已獲取”,初始值為否,每次獲取表中“is_got”為否的數(shù)據(jù)。
注意這種方案下,“is_got”是要做表索引的,這樣每次遍歷數(shù)據(jù)庫的時候才不會影響運算速度。
二、數(shù)據(jù)獲取和應(yīng)用是否異步執(zhí)行
上文提到的“觸發(fā)式和定時任務(wù)方式”,是獲取數(shù)據(jù)時候的機制,那么獲取之后,寫入或應(yīng)用的時候,也可以設(shè)計適合的機制。
一般而言,如果獲取數(shù)據(jù)后還要在本地進行規(guī)則運算或數(shù)據(jù)處理,那么最好先落地到本地的中轉(zhuǎn)表,再由中轉(zhuǎn)表寫入最終表或參與運算,也就是將數(shù)據(jù)的獲取和應(yīng)用異步進行。
異步執(zhí)行如下圖所示:
看下面的例子:
需求:按照“訂單+包裹號”維度,從物流系統(tǒng)獲取包裹的運費到財務(wù)系統(tǒng),然后財務(wù)系統(tǒng)再將該運費分攤到該包裹的商品上面,算出每個商品分攤的運費金額。
如果采用從獲取數(shù)據(jù)到分攤運算一步完成的話,那么一旦因初始數(shù)據(jù)不準確或者算法BUG導(dǎo)致結(jié)果出錯,想要追查錯誤原因并修復(fù)數(shù)據(jù),就需要追溯到數(shù)據(jù)提供方,耦合性和復(fù)雜程度就很高。
所以對這種含有復(fù)雜運算的場景,建議采用異步機制:
即在進行分攤之前,先落地到財務(wù)系統(tǒng)的中間表中。然后待獲取數(shù)據(jù)完成,再啟動第二個獨立的機制,進行分攤并最終寫入。
總的來說,異步處理數(shù)據(jù)的獲取和應(yīng)用,一方面方便追溯異常問題,另一方面減少系統(tǒng)或功能之間的藕聯(lián);同時它作為一個基礎(chǔ)數(shù)據(jù),存入本地也可以被其他功能調(diào)用。
在獲取的數(shù)據(jù)若數(shù)據(jù)量萬級以上,或運算邏輯復(fù)雜的,只要時效性允許,建議都采用異步機制。
三、判重機制
數(shù)據(jù)通道搭建好之后,系統(tǒng)間的數(shù)據(jù)流往往是持續(xù)的傳輸。由于各種原因,常常同一條數(shù)據(jù)可能會多次被獲取到。
這種情況下,是新插入該數(shù)據(jù)、覆蓋原數(shù)據(jù),還是更新舊數(shù)據(jù)呢?
在確定這個機制之前,首先要先確定表關(guān)鍵字,即確定若干字段做為判斷重復(fù)的標準。
比如,職工信息表字段:姓名+手機號+性別+家鄉(xiāng)+身份證號。這幾個字段中身份證號對一個職工是唯一的。因此如果我們更新這里的數(shù)據(jù),就以身份證號為唯一標示。
當獲取到數(shù)據(jù)庫不存在的身份證號碼,則插入該數(shù)據(jù);獲取到的身份證號在數(shù)據(jù)庫中已經(jīng)存在,而手機號不同,就可以更新數(shù)據(jù)庫中該數(shù)據(jù)的手機號。
注意:若改變了表的去重字段,則需要考慮新數(shù)據(jù)對歷史數(shù)據(jù)的影響,因為二者的判重維度不一樣,可能會獲取到和以前的歷史數(shù)據(jù)沖突,但又不被新判重規(guī)則識別的數(shù)據(jù)。
四、記錄數(shù)據(jù)獲取日志
從其他系統(tǒng)的獲取的過程,一般都要創(chuàng)建數(shù)據(jù)日志:目的是記錄數(shù)據(jù)的來龍去脈,以便追溯。
數(shù)據(jù)對接的日志重點要記錄三個事項:數(shù)據(jù)提供方是否提供了該數(shù)據(jù)、數(shù)據(jù)接收方是否接收到該數(shù)據(jù)、數(shù)據(jù)接收方是否寫入了該數(shù)據(jù)。
在設(shè)定數(shù)據(jù)對接日志的時候,需要告知開發(fā)員是否將日志數(shù)據(jù)存到本地數(shù)據(jù)庫中。
因為開發(fā)者后臺本身是有一個系統(tǒng)運作記錄的(Server log),只是保存時間不會太長,比如一個月就會清除了。
因此如果需要保留較長的時間,則可以將其保存到本地數(shù)據(jù)庫。
小結(jié)
在后端產(chǎn)品工作中,技術(shù)與產(chǎn)品的交叉領(lǐng)域較多。后端產(chǎn)品經(jīng)理需要深入了解這些邊界知識,才能更好地完成后端產(chǎn)品的方案,提高溝通和需求實現(xiàn)的效率。
#專欄作家#
唧唧歪歪PM,公眾號:唧唧歪歪PM(ID:jjyypm),人人都是產(chǎn)品經(jīng)理專欄作家。書籍《后端產(chǎn)品經(jīng)理寶典》作者,藥學(xué)碩士轉(zhuǎn)行互聯(lián)網(wǎng)產(chǎn)品多年;熟悉跨境電商業(yè)務(wù),醫(yī)藥領(lǐng)域;擅長大型后臺體系,社交App。
本文原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理,未經(jīng)作者許可,禁止轉(zhuǎn)載。
題圖來自Unsplash,基于CC0協(xié)議
O(∩_∩)O謝謝
閱讀你的第三篇文章了,,質(zhì)量都很高,謝謝分享,收獲很多
只是工作中的整理。謝謝鼓勵