Sleep Rate Limit API Polling

Poll rate-limited APIs politely with sleep pacing, exponential spacing for empty results, and a hard attempt ceiling.

BashResilience

Code

snippet
# throttle the polling rate to stay under the API limit
#!/usr/bin/env bash
set -euo pipefail

readonly URL="https://api.example.com/jobs/${JOB_ID:-job-1}"
readonly BASE_INTERVAL=5
readonly MAX_INTERVAL=60
readonly MAX_ATTEMPTS=20

wait_for_completion() {
  local interval=${BASE_INTERVAL}
  local attempt=0

  while (( attempt < MAX_ATTEMPTS )); do
    (( attempt++ )) || true

    local status body
    body=$(curl -sf --max-time 8 "${URL}") || {
      echo "请求失败,${interval}s 后重试" >&2
      sleep "${interval}"
      continue
    }

    status=$(echo "${body}" | jq -r '.status')

    case "${status}" in
      completed)
        echo "${body}" | jq -r '.resultUrl'
        return 0
        ;;
      failed)
        echo "Error: 任务失败:$(echo "${body}" | jq -r '.error')" >&2
        return 1
        ;;
      pending|running)
        echo "状态 ${status},${interval}s 后再查 (${attempt}/${MAX_ATTEMPTS})" >&2
        ;;
      *)
        echo "未知状态: ${status}" >&2
        return 2
        ;;
    esac

    # 未完成时退避增长:对 API 更礼貌
    interval=$(( interval * 2 ))
    (( interval > MAX_INTERVAL )) && interval=${MAX_INTERVAL}
    sleep "${interval}"
  done

  echo "Error: 轮询 ${MAX_ATTEMPTS} 次仍未完成" >&2
  return 1
}

wait_for_completion