讀程式員的README筆記17_構建可演進的架構(下)

来源:https://www.cnblogs.com/lying7/archive/2023/12/21/17910680.html
-Advertisement-
Play Games

1. 可演進的API 1.1. 隨著需求的變化,你需要改變你的API,即代碼之間的共用介面 1.2. 改變API很容易,但很難做到正確 1.3. 保持API小巧 1.3.1. 小巧的API更易於理解和演進 1.3.2. 只添加即刻需要的API方法或欄位 1.3.3. 帶有許多欄位的API方法應該有合 ...


1. 可演進的API

1.1. 隨著需求的變化,你需要改變你的API,即代碼之間的共用介面

1.2. 改變API很容易,但很難做到正確

1.3. 保持API小巧

1.3.1. 小巧的API更易於理解和演進

1.3.2. 只添加即刻需要的API方法或欄位

1.3.3. 帶有許多欄位的API方法應該有合理的預設值

1.3.3.1. 開發人員可以只專註於和自己相關的欄位,因為它們會繼承其他欄位的預設值

1.3.3.2. 預設值可使大型API在感覺上很小巧

1.4. 公開定義良好的服務端API

1.4.1. 切記使用標準工具來定義服務端API

1.4.1.1. OpenAPI通常用於RESTful服務

1.4.1.2. non-REST服務則使用Protocol Buffers、Thrift或類似的介面定義語言(interface definition language,IDL)

1.4.1.3. 介面定義工具自帶代碼生成器,可以將服務的定義轉換為客戶端和服務端代碼

1.4.1.4. 文檔也可以被生成,測試工具可以使用IDL來生成stub數據和模擬數據

1.5. 保持API變更的相容性

1.5.1. 向前相容

1.5.1.1. 向前相容的變更允許客戶端在調用舊版的服務時使用新版的API

1.5.1.2. 一個正在運行1.0版API的網路服務,但可以接收來自使用1.1版API的客戶端的調用,這就是向前相容

1.5.2. 向後相容

1.5.2.1. 向後相容的變更:新版本的庫或服務不需要改變舊的客戶端代碼

1.5.2.2. 如果針對1.0版API開發的代碼在使用1.1版時能繼續編譯和運行,這種變更就被稱為向後相容

1.6. API版本化

1.6.1. 隨著API的不斷演進,你將需要決定如何處理多個版本的相容性

1.6.2. 完全向後相容和向前相容的變更意味著API的所有的歷史版本和未來版本都可以相互操作

1.6.3. 你會想變更你的API,使之與舊的客戶端不相容

1.6.3.1. 當客戶端代碼難以變更時,API的版本管理最有價值

1.6.4. 版本化你的API意味著你在做出改變時將引入一個新的版本

1.6.4.1. API版本化自有其代價

1.6.4.2. 舊的主版本服務需要被維護,修複的bug也需要回傳到以前的版本

1.6.5. API版本通常由API網關或服務網格來管理

1.6.5.1. 管理版本所採用的方法要務實

1.6.6. 將文檔與你的API一起保持版本化

2. 可持續的數據管理

2.1. API比持久化數據存續的時間更短

2.1.1. 一旦客戶端和服務端API都升級了,就意味著工作完成了

2.2. 隔離資料庫和使用明確的schema將使數據演進更易於管理

2.3. 資料庫隔離

2.3.1. 共用的資料庫很難演進,並且會導致喪失自主性

2.3.1.1. 圖

2.3.2. 擁有共用資料庫的應用程式可以發展到直接依賴對方的數據,應用程式應該作為它們所使用的底層數據的控制點

2.3.3. 隔離的資料庫只有一個讀取者和寫入者

2.3.3.1. 其他所有流量都通過遠程過程調用

2.3.3.2. 圖

2.3.4. 隔離資料庫為你提供了共用資料庫所不具備的靈活性和隔離性

2.4. 使用schema

2.4.1. 僵化的預定義數據列和類型,以及它們演進的重量級過程,會導致流行的無模式(schemaless)數據管理的出現

2.4.2. 無模式並不意味著“沒有模式”(數據將無法使用)

2.4.3. 不要將無模式的數據隱藏在已經模式化的數據中

2.4.3.1. 隱藏無模式的數據是“自取滅亡”,你獲得了顯式schema的所有痛苦,卻沒有任何收益

2.4.4. 無模式數據有一種隱含的模式,可以在讀取時被提供或推斷出來

2.4.5. 採用無模式的方法會產生明顯的數據完整性和複雜性問題

2.4.6. 強類型的面向schema的方法降低了應用程式的隱蔽性,因此也降低了其複雜性

2.4.7. 為你的數據定義明確的schema將使你的應用程式保持穩定,並使你的數據可用

2.4.7.1. 明確的schema會讓你在編寫數據時可以對其進行合理性檢查

2.4.7.2. 使用顯式schema解析數據通常會更快捷

2.4.7.3. 架構還可以幫助你檢測到前後不相容的變化

2.4.8. 數據有時被描述為“一次寫入,多次讀取”,使用schema可以使讀取更容易

2.4.9. schema自動化遷移

2.4.9.1. 改變一個資料庫的schema是危險的

2.4.9.2. 可以管理資料庫遷移的工具

2.4.9.2.1. Liquibase
2.4.9.2.2. Flyway
2.4.9.2.3. Alembic
2.4.9.2.4. GitHub的gh-ost
2.4.9.2.5. Percona的pt-online-schema-change
2.4.9.2.6. Skeema
2.4.9.2.7. Square的Shift

2.4.9.3. 大多數遷移工具都支持回滾,也就是可以撤銷遷移產生的變化

2.4.10. 保持schema的相容性

2.4.10.1. 寫入磁碟的數據也有和API一樣的相容性問題

2.4.10.2. 變更數據捕獲(change data capture,CDC)是一種基於事件的架構,將插入、更新和刪除操作轉換為下游使用者的消息

2.4.10.3. 數據倉庫管道和下游用戶必須受到保護,以免遭受schema變更帶來的不良影響

2.4.10.4. 相容性檢查應該儘早地進行,最好是在提交代碼時通過檢查資料庫DDL語句來進行

2.4.10.5. 獨立的數據產品,可能只是資料庫視圖,允許團隊與數據的消費者保持相容,而不必凍結其內部的資料庫schema


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Flink是一個分散式系統,需要有效地分配和管理計算資源才能執行流應用程式。它集成了所有常見的集群資源管理器,如Hadoop YARN和Kubernetes,但也可以設置為作為一個獨立的集群運行,甚至作為一個庫。 Flink集群的剖析 Flink運行時由兩種類型的進程組成:一個JobManager和 ...
  • 最近開始體驗FastGPT開源知識庫問答系統,用他們試著開發調試一些小助手。這中間需要使用到Redis,就在自己伺服器上進行了安裝,特此記錄下。 環境說明:阿裡雲ECS,2核8G,X86架構,CentOS 7.9操作系統。 選擇版本 1.打開Redis官網下載頁面,可以選擇需要的版本下載。我這裡選擇 ...
  • 文章摘要 安卓架構技術主要包括MVC、MVP、MVVM等。下麵分別對這些架構技術進行分析優劣勢,並附上代碼示例。 正文 MVC(Model-View-Controller)架構 MVC是一種常用的軟體架構,它將應用程式分為三個主要組成部分:Model(模型)、View(視圖)和Controller( ...
  • 成功路上並不擁擠,因為堅持的人並不多。只有堅持了,我們才知道,這一路上有多少事情需要實幹,有多少東西需要學習。 1. 環境變數的理解 環境變數一般是指在操作系統中用來指定操作系統運行環境的一些參數,如臨時文件夾位置、系統文件夾位置以及某些應用軟體文件的路徑等等。環境變數相當於給系統或用戶應用程式設置 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 unplugin-generate-component-name 一款用於以文件夾名或者setup標簽寫入名字來自動生成Vue組件名的插件。 項目地址 功能 💚 支持 Vue 3 開箱即用。 ⚡️ 支持 Vite、Webpack、Rsp ...
  • 大家好,我是歸思君 起因是最近瞭解JS執行上下文的時候,發現很多書籍和資料,包括《JavaScript高級程式設計》、《JavaScript權威指南》和網上的一些博客專欄,都是從 ES3 角度來談執行上下文,用ES6規範解讀的比較少,所以想從ES6的角度看一下執行上下文。 下麵我嘗試用ECMAScr ...
  • 本文將介紹如何用JS實現簡單的屏幕錄像機。 一、錄製準備 創建一個按鈕 <button id="recording-toggle">Start recording</button> 書寫JavaScript var RECORDING_ONGOING = false; var recordingTo ...
  • 記得更改完配置後,要重啟編輯器(如:VSCode)!!! 記得更改完配置後,要重啟編輯器(如:VSCode)!!! 記得更改完配置後,要重啟編輯器(如:VSCode)!!! 這個錯誤通常發生在你嘗試在一個不支持 ES6 模塊語法的環境中使用 import 關鍵字。 ESLint 預設使用的是 ES5 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...