Load-Balancing

什麼 HTTP 狀態程式碼可以避免實例在 AWS Elastic Beanstalk 上被標記為不健康

  • May 10, 2019

我正在 AWS Elastic Beanstalk 上執行應用程序。如果實例過於頻繁地響應 500(伺服器錯誤)範圍內的 HTTP 狀態程式碼,AWS 會將此實例標記為執行狀況不佳並從負載均衡器中刪除該實例。

我理解這一點並同意這實際上是一種良好的行為。但不幸的是,這會導致我的應用程序出現問題。

我的應用程序需要連接到幾個外部 API 並聚合它們的數據。其中一個不受我控制的外部 API 很不穩定,並且經常以 500 狀態程式碼響應。

目前,如果 API 引發錯誤,我的應用程序只會將該錯誤傳遞回使用者。導致 AWS 認為我的應用程序有錯誤,因此終止該實例並啟動新伺服器。但實際上,它只是導致 500 錯誤率恆定的端點之一,而所有其他端點仍然正常。

一方面,外部伺服器錯誤導致我的應用程序只返回該錯誤是正確的。另一方面,這種外部伺服器錯誤不在我的應用程序中,我可以捕捉到它。但即使我發現錯誤,我也無法返回任何對使用者有用的東西,因此仍然需要返回錯誤程式碼。

怎麼能處理這個?避免伺服器錯誤狀態程式碼不會觸發不健康的實例,但同時不使用客戶端錯誤狀態程式碼,因為使用者無能為力,他們只需要重試?

你有什麼建議?或者是否有其他選項可以微調 AWS Elastic Beanstalks 行為?

那麼問題主要是:當對該 API 的請求失敗時,您的應用程序工作流程是否要求您的客戶/使用者

a) 被通知

b) 需要採取後續行動

c) 是 HTTP 錯誤響應,這是他們可以做到的唯一方式收到通知?

如果是這樣:然後考慮遠端 API 何時生成 500 內部伺服器錯誤以讓您的應用程序返回 408 錯誤響應,這有點合適,因為它允許客戶端稍後重新送出相同的請求。(如果沒有以下限制,“502 Bad Gateway”會更好:)

此外,您可以在 Elastic Beanstalk 中配置高級執行狀況規則,指示 Elastic Beanstalk 忽略 4xx 錯誤以指示執行狀況不佳。不幸的是,在撰寫本文時,您無法對 5xx 甚至更具體的 http 狀態程式碼執行相同操作。

引用自:https://serverfault.com/questions/966700