公司的一個系統需要在兩台 EC2 之間傳輸資料,假設稱他們為 A 與 B,資料由 A 傳向 B,而這些傳輸偶爾會因資料庫連線時的身分驗證失敗。
B 機器使用 IAM authentication 連線到 RDS Proxy。
為此,要先用 Aws\Rds\AuthTokenGenerator
產生 RDS token,這個 Class 會透過 Aws\Credentials\CredentialProvider
的 Aws\Credentials\InstanceProfileProvider
向 IMDS 取得 temporary security credentials,並用來做 RDS Token 的簽章。
IMDS 會對每一台 instance 做 throttling,因此從這服務取得的 temporary security credentials 應該要儲存起來。不過併發請求會造成快取穿透,導致部分請求會因其無法向 IMDS 取得 credentials 而失敗。
解法有兩種:
- 在背景定期更新 credentials
- 參考 AWS Architecture Blog – Exponential Backoff And Jitter。在取得 credentials 失敗後,用 exponential backoff 重試,並且加入 jitter
關於第二種解法:
併發請求不適合只用 Exponential backoff 決定重試間隔。因為併發請求會同時失敗,並在相同的秒數後重試。所以有必要為其重試間隔再加入一段隨機長度的時間,也就是 jitter。
Jitter 可以有效地下次重試的時間點錯開