什么是數(shù)據(jù)播種以及為什么我們需要它
流線型開(kāi)發(fā)過(guò)程對(duì)于任何軟件公司來(lái)說(shuō)都至關(guān)重要,尤其是像Rise這樣快速增長(zhǎng)的公司。使用生產(chǎn)數(shù)據(jù)作為應(yīng)用程序初始數(shù)據(jù)集的工程師可能會(huì)嚴(yán)重影響性能。他們可能正在處理敏感的客戶信息,這些信息可能需要增加額外的清洗步驟而延長(zhǎng)處理時(shí)間。此外,由于各自國(guó)家的潛在限制性法律,生產(chǎn)數(shù)據(jù)可能會(huì)阻止位于其它地區(qū)的工程師訪問(wèn)數(shù)據(jù)。最后,當(dāng)其他工程師需要為其功能添加新的SQL語(yǔ)句時(shí),他們可能很難更新數(shù)據(jù)庫(kù)備份文件。因此,管理初始數(shù)據(jù)集變得非常困難,而且非常耗時(shí)。
擁有數(shù)據(jù)播種機(jī)制可以使性能測(cè)試和數(shù)據(jù)庫(kù)管理更加準(zhǔn)確、高效和可管理。作為一名工程師,你可能希望應(yīng)用程序從已經(jīng)裝載并清洗的最小數(shù)據(jù)集開(kāi)始,或者你可能需要一組特定的數(shù)據(jù)來(lái)進(jìn)行測(cè)試。無(wú)論哪種情況,你都已經(jīng)到達(dá)了一個(gè)稱為數(shù)據(jù)播種的過(guò)程。從長(zhǎng)遠(yuǎn)來(lái)看,一組易于管理的合成數(shù)據(jù)肯定會(huì)改善你的開(kāi)發(fā)過(guò)程。
如何填充數(shù)據(jù)庫(kù)
在研究Rise的解決方案時(shí),我們發(fā)現(xiàn)了一些有趣的方法來(lái)填充數(shù)據(jù)庫(kù)以進(jìn)行開(kāi)發(fā)。最常見(jiàn)的方法是直接從生產(chǎn)環(huán)境檢索數(shù)據(jù)。但這并不是一個(gè)理想的開(kāi)發(fā)體驗(yàn),因?yàn)榭赡軙?huì)涉及PII(個(gè)人身份信息)數(shù)據(jù)。
另一種方法是使用SQL備份文件,其中包含表結(jié)構(gòu)的記錄和數(shù)據(jù)庫(kù)中的數(shù)據(jù)——但該方法也不夠理想,而且可能難以管理。例如,當(dāng)你的服務(wù)具有多個(gè)微服務(wù)時(shí),由于表之間的復(fù)雜關(guān)系,你的數(shù)據(jù)庫(kù)可能會(huì)以出現(xiàn)數(shù)據(jù)完整性問(wèn)題而告終。
現(xiàn)在,一些簡(jiǎn)單的可選方法是使用第三方庫(kù)(如“Faker”)來(lái)生成虛擬數(shù)據(jù),或者僅通過(guò)調(diào)用API調(diào)用來(lái)創(chuàng)建數(shù)據(jù)庫(kù)。
為了使開(kāi)發(fā)過(guò)程更具效率,數(shù)據(jù)播種應(yīng)該是可讀的、可共享的、易修改的,并且需要生成沒(méi)有PII的真實(shí)數(shù)據(jù)。為了滿足這些需求,我們最終使用typeScript創(chuàng)建了一個(gè)框架,混合使用了SQL語(yǔ)句和API。
數(shù)據(jù)播種架構(gòu)
通過(guò)這種方法,我們可以使用“引導(dǎo) SQL語(yǔ)句”為每個(gè)服務(wù)保留最少的引導(dǎo)數(shù)據(jù),并且可以發(fā)送多個(gè)HTTP請(qǐng)求來(lái)生成特定數(shù)據(jù)集的記錄。
使用此過(guò)程為開(kāi)發(fā)團(tuán)隊(duì)提供了三個(gè)主要益處:
因?yàn)槲覀冎赶虻氖钦鎸?shí)的API端點(diǎn),所以不需要關(guān)心數(shù)據(jù)庫(kù)約束或表關(guān)系(與在SQL中添加語(yǔ)句的做法截然不同)。
只需簡(jiǎn)單地創(chuàng)建一個(gè)新的API函數(shù)來(lái)生成初始數(shù)據(jù),就可以更容易地更新新特性。腳本也變得具有很高的可讀性,尤其是與一個(gè)SQL文件中的無(wú)數(shù)行相比,這些行讀起來(lái)可能很乏味。
腳本是從命令行運(yùn)行的,只要一個(gè)命令可以隨時(shí)運(yùn)行。
1. 引導(dǎo)SQL語(yǔ)句
引導(dǎo)語(yǔ)句做什么?這個(gè)裝載器是在所有服務(wù)啟動(dòng)時(shí)運(yùn)行的第一段代碼,負(fù)責(zé)生成發(fā)送給API請(qǐng)求所需的最小數(shù)據(jù)集。因此它充分依賴于你的服務(wù)或業(yè)務(wù)邏輯。例如,在Rise中,為了進(jìn)行API調(diào)用以生成組織和用戶表,支持提供者的授權(quán)標(biāo)記應(yīng)該與數(shù)據(jù)一起傳遞。所以,引導(dǎo)包含一個(gè)用于創(chuàng)建支持提供者用戶的語(yǔ)句。
2. 對(duì)應(yīng)編碼
這個(gè)簡(jiǎn)單的代碼片段將清空組織表,并且創(chuàng)建一個(gè)具有組織的支持提供者用戶。
TRUNCATE organizations RESTART IDENTITY CASCADE;
— Insert a Organization into Organization table
— Insert Support Role User into User table
— Insert a Role into that user
— Code is needed below
3. API請(qǐng)求
我們目前使用Axios產(chǎn)生HTTP請(qǐng)求。Axios是一個(gè)基于promise的HTTP客戶端,用于瀏覽器和Node.js,可以簡(jiǎn)單發(fā)送異步請(qǐng)求并執(zhí)行CRUD操作。它通過(guò)在發(fā)送這些請(qǐng)求時(shí)提供自動(dòng)JSON字符串化來(lái)實(shí)現(xiàn)這一點(diǎn),而“Fetch API”沒(méi)有提供這種功能??傊?,axios是一個(gè)輕量級(jí)庫(kù),提供了許多有用的功能。
4. 對(duì)應(yīng)編碼
在本節(jié)中,你將向項(xiàng)目中添加Axios,并生成可以創(chuàng)建組織的API函數(shù)。
要將Axios添加到項(xiàng)目中,運(yùn)行以下命令以安裝Axios:
$ npm install axios
在TypeScript項(xiàng)目的src文件夾中,創(chuàng)建一個(gè)名為organization.ts的新組件。
將以下代碼添加到該組件中:
首先,要導(dǎo)入axios和env,以便兩者都可以在組件中使用。然后創(chuàng)建一個(gè)名為createOrganization的異步函數(shù)來(lái)執(zhí)行POST請(qǐng)求。
之后使用axios.post(url、data、option)獲得一個(gè)promise,該promise返回一個(gè)響應(yīng)對(duì)象。第二個(gè)參數(shù)“data”應(yīng)該包含創(chuàng)建Organization記錄所需的實(shí)際數(shù)據(jù)。這里好處是,當(dāng)作為第二個(gè)參數(shù)傳遞給POST函數(shù)時(shí),axios會(huì)自動(dòng)將JavaScript對(duì)象序列化為JSON,因此我們就不需要再做處理了。
結(jié)論
總而言之,擁有數(shù)據(jù)播種管理工具對(duì)于開(kāi)發(fā)高質(zhì)量軟件非常重要,因?yàn)樗兄谔岣邤?shù)據(jù)安全性,增加組織對(duì)數(shù)據(jù)的可訪問(wèn)性,減少數(shù)據(jù)冗余,并提供更好的數(shù)據(jù)完整性和數(shù)據(jù)一致性。通過(guò)實(shí)施這個(gè)相對(duì)簡(jiǎn)單的過(guò)程,大大提高了我們?cè)赗ise的效率和生產(chǎn)力。