發布管理 - 向部分使用者發布 - 它如何適用於面向公眾的網站
我在某處讀到(抱歉不完全記得來源)facebook 已在周二發布。他們首先向內部員工發布新功能,然後向一小部分外部使用者發布,然後向全世界發布。我相信Google也做了類似的事情
我主要使用 Microsoft 堆棧(用於原始碼控制的 TFS、IIS、asp.net、具有大量數據的 sql 伺服器)。當然是面向公眾的網站,所以它們必須 24x7x365 全天候執行。雖然我可以設想僅在其中一台伺服器(在 webfarm 中)上發布我的 api/dll 並對其進行測試,但如果有數據庫(儲存的 proc 簽名、表模式更改),我將如何做到這一點?目前我們正在對 SP 進行版本控制(新的將是 mySPNameV2,舊的將是 mySPNameV1 - 兩者都採用不同的參數集,因此重命名),新的 API 將使用 SP-V2,而舊的 API 將繼續使用 SP -V1。
我看到了一些設計氣味,但有更好的方法嗎?
編輯:我們僅將新程式碼發佈到一台伺服器並對其進行測試,困難的是您將如何抽象(可能抽像不是正確的詞,但您明白了)數據庫架構從應用程序的多個並發版本更改
如果我對您的理解正確,您想要的是擁有兩種使用相同實時數據但 API 版本不同的機制。現在,假設您已經在使用雙緩衝機制,我猜您的實際問題是在過渡期間使用活動表。
解決方案是讓您的表同時包含 V1 和 V2 列(例如,一個使用者表將包含來自兩個 API 的欄位)。注意:所有非常用欄位都必須具有預設值。
為了使其無縫工作,您應該為 V1 和 V2 創建視圖,僅公開每個 API 版本的相關欄位,並且您應該為視圖而不是表進行開發(類似於為介面而不是實現開發的概念)。
儲存過程也是如此——所有非公用參數都必須具有預設值,等等……
在我的公司,我們幾乎總是以交錯的方式進行任何重大發布。我們通過為使用者表中的每個新功能添加一個標誌來實現這一點。預設情況下,此標誌設置為 false;當我們向更多使用者推出該功能時,我們只需在數據庫表中切換標誌。
這意味著在應用程序級別,我們必須確保在所有地方檢查此標誌。程式碼推送到所有伺服器。進行數據庫更改;但仍然只有部分使用者看到新功能。
在數據庫級別,我們確保對 SP 的任何更改都是“向後兼容的”。這是通過遵循一些簡單的規則來完成的:
- 任何添加到 SP 的新參數都必須放在參數列表的末尾。
- 新參數應該有一個預設值。這樣做是為了不會中斷對 SP 的現有呼叫。
- 如果必須更改 SP 的現有參數(或者如果必須更改參數順序),那麼顯然所有對 SP 的呼叫都會更改。但是 SP 的編碼方式使其支持啟用該功能的使用者以及未啟用該功能的使用者。
- 大多數表更改都與添加新列有關。當我們必須修改現有列時,這種情況非常罕見。所有新列都添加了預設值或允許 NULL。
至於 API,我們的大部分參數都是作為自定義對象(結構)傳遞的。通過這種方式,我們可以向 API 方法添加一個新參數,並且仍然可以防止對 API 的現有呼叫中斷。
此外,對於每個使用者,我們都會儲存他們正在使用的 API 版本。根據版本,使用者會轉到不同的 API URL。所以基本上當使用者進行第一次 API 呼叫以進行身份驗證時,我們會傳遞一個新的 API URL(基於使用者的 API 版本)。對於所有後續呼叫,它們應該呼叫新的 URL。Salesforce.com 的 API 呼叫也遵循這一點。