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