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