リトライ処理とは
常に成功するとは限らない処理に対して、時間間隔を開けてもう一度同じ処理を実行する試み。時間をずらせば、成功する可能性がある処理について行われる。
リトライ処理が必要とされる例としては次の通り。
- なんらかのAPIが、時間単位でのリクエスト数の制限を掛けているとき
- リソース不足で処理が中断される場合があるが、リソース不足をリクエスト元から観測できないとき
実際の利用事例
- BigQuery の
bq load
を並列処理させていたが、 RateLimited にひっかかるので時間をおいてリトライしたい - スクレイピングのコードを動かしていたがネットワークが安定しないため、成功する場合と失敗する場合があったため、成功するまでリトライしたい
コード
コンソールが色制御に対応していれば、
# !/bin/sh
set -eu
ESC=$(printf '\033')
TAB=$(printf '\011')
RED="${ESC}[31m"
GREEN="${ESC}[32m"
YELLOW="${ESC}[33m"
NORMAL="${ESC}[0m"
retryable() {
(
i=0 MAX_RETRY=10
COMMAND="$@"
while [ $((i+=1)) -le $MAX_RETRY ]; do
eval "$COMMAND" && printf "[${GREEN}success${NORMAL} $i/$MAX_RETRY]${TAB}$COMMAND\n" && break
printf "[${RED}retry${NORMAL} $i/$MAX_RETRY]${TAB}$COMMAND\n"
sleep 1
done
return $?
)
}
# 使い方(retryable の後ろにコマンドを書く)
retryable printf "hello world"