為重試 API 的間隔加入隨機性

#exponential-backoff #imds #jitter #rds-proxy

公司的一個系統需要在兩台 EC2 之間傳輸資料,假設稱他們為 A 與 B,資料由 A 傳向 B,而這些傳輸偶爾會因資料庫連線時的身分驗證失敗。



B 機器使用 IAM authentication 連線到 RDS Proxy

為此,要先用 Aws\Rds\AuthTokenGenerator 產生 RDS token,這個 Class 會透過 Aws\Credentials\CredentialProviderAws\Credentials\InstanceProfileProvider向 IMDS 取得 temporary security credentials,並用來做 RDS Token 的簽章。

IMDS 會對每一台 instance 做 throttling,因此從這服務取得的 temporary security credentials 應該要儲存起來。不過併發請求會造成快取穿透,導致部分請求會因其無法向 IMDS 取得 credentials 而失敗。
解法有兩種:

  1. 在背景定期更新 credentials
  2. 參考 AWS Architecture Blog – Exponential Backoff And Jitter。在取得 credentials 失敗後,用 exponential backoff 重試,並且加入 jitter



關於第二種解法:
併發請求不適合只用 Exponential backoff 決定重試間隔。因為併發請求會同時失敗,並在相同的秒數後重試。所以有必要為其重試間隔再加入一段隨機長度的時間,也就是 jitter。

Jitter 可以有效地下次重試的時間點錯開