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