一千萬個為什麽

搜索

在生產中同時部署兩個獨立托管的服務,無需停機



我有兩種不同的服務。假設服務A和服務B.服務B依賴於服務A.兩個代碼庫都在Bitbucket中的單獨倉庫中托管,代碼庫由不同的團隊維護。服務A有三個後端服務器,服務B有七個後端服務器。我使用Jenkins作為代碼部署的CI。因此,每當我們合並主分支中的代碼時,Jenkins就會開始部署。服務A和服務B的過程相同,但它們有兩個不同的Jenkins服務器。

現在,問題在於,如果服務A團隊在生產中獨立部署某些內容,並且代碼庫發生了重大變化。然後整個應用程序將中斷。因為服務B尚未準備好與服務A的代碼更改兼容。假設,在服務B期望不同參數的情況下,函數的參數已經改變。

我正在尋找一個解決方案,其中服務A代碼在主服務器中合並只會發生服務B的部署。因此,在服務B的每個部署中,它首先部署服務A的代碼然後跟隨服務B.整個部署將花費大量時間。此時主應用程序不應該關閉(因為一旦部署了服務A,那麽用戶必須等待服務B部署,否則他們將面臨錯誤)。

所以,我在想是否可能在單獨的實例中進行新部署當在該實例中完成部署時,它將替換先前的實例。因此,代碼將在主要生產中更新,沒有任何停機時間或錯誤。

推薦的方法是什麽?在這種情況下,我可以使用 Ansible 做些什麽嗎?

轉載註明原文: 在生產中同時部署兩個獨立托管的服務,無需停機

一共有 2 個回答:

我認為你把問題放在了錯誤的一邊,你可以拋開一個全新的基礎設施,然後將負載均衡器從藍色切換到綠色,失去會話,打破正在進行的交易等。

實現你正在做的事情的正確方法是編碼不同,當A重新發布一個破壞API ni版本n時,a應該能夠繼續回答對版本n-1中的api的調用。通常的方法是將文件放在uri或標題中,例如:

/api/1/getCustomers and /api/2/getCustomerList (for exemple if n is 2). With that, you can do a rolling update of B, with backends still using api v1 and new ones using api v2.

我將做出以下假設:

  • 服務B使用任何應用層協議(例如HTTP)與服務A通信
  • 服務B是服務A的唯一消費者
  • 用戶僅與服務B交互

停機解決方案

升級服務A並進行重大更改時,請將這些更改移至另一個“版本”。

您的目標是主動創建一個新的界面版本(即API版本),以實現重大變化。在某些情況下,這可能需要大量重構。在其他方面(取決於你的代碼庫是否正確分層),不是。然後你可以開始在服務A和B之間實施“合同”測試,以確保A不會破壞與B的合同。

這裏的問題是,在部署此解決方案時,您將無法訪問這兩種API。

無需停機的解決方案

進行與上述解決方案相同的更改,但也要考慮在我們引入服務A.2時服務A.1始終處於啟動狀態的部署策略。當沒有對A.1的請求進入時,它可能會向下移動以僅使A.2保持活動狀態以服務所有請求。這是藍綠色的部署策略。

如果您的整體解決方案需要最少的停機時間部署,那麽這就是頂級產品。