web-dev-qa-db-ja.com

カール再試行メカニズム

2つのWebサービスとフロントエンドアプリケーションをデプロイするために実行するスクリプトがあります。スクリプトは、2つのバックエンドサービスが稼働中であるかどうかを確認するメソッドを呼び出します。その場合、デプロイは成功したとみなし、そうでない場合は元に戻します。

2つのサービスは、フロントエンドよりも起動に時間がかかる場合があります。現在、Webサービスチェックを遅らせるためにスリープコールを入れています。これにより、起動する時間を確保できます。

このスリープを削除して再試行メカニズムを追加して、サービスがダウンした場合に、応答が返されるまでチェックを繰り返し再試行するようにします。

Tpは、デバイスが起動しているかどうかを確認します。curlを使用します。 curlには再試行メカニズムがあると読みましたが、使用したことはありません。

この問題を解決した人はいますか?解決する際に考慮しなければならないことを理解したい。サービスからHTTP 200を取得するまで再試行しますか?

誰も私がこれをテストする方法を提案しますか?ダウンしていたサービスを見つける必要があります。

編集:-retryは一時的なエラーのみに反応するようです。「一時的なエラーとは、タイムアウト、FTP 4xx応答コード、またはHTTP 5xx応答コードのいずれかを意味します」。私のサービスは404を返すことができるため、カールの再試行は私の解決策ではありません。

21
TheCoder

次のステートメントは、5秒の接続タイムアウトで5回または最大40秒を再試行します。指数バックオフポリシーはありません

curl --connect-timeout 5 \
    --max-time 10 \
    --retry 5 \
    --retry-delay 0 \
    --retry-max-time 40 \
    'http://your_url'


--max-time 10     (how long each retry will wait)
--retry 5         (it will retry 5 times)
--retry-delay 0   (an exponential backoff algorithm)
--retry-max-time  (total time before it's considered failed)

接続が拒否された場合でも再試行する--retry-connrefuseもあることに注意してください。

32
Dan Ionescu

誰でも新しい混乱を避けるために...

参照してください: https://curl.haxx.se/docs/manpage.html

- リトライ

Curlが転送を実行しようとしたときに一時的なエラーが返された場合、この回数だけ再試行してからgivingめます。数値を0に設定すると、curlは再試行しません(これがデフォルトです)。一時的なエラーは、タイムアウト、FTP 4xx応答コード、またはHTTP 5xx応答コードのいずれかを意味します。

Curlが転送を再試行しようとすると、最初に1秒間待機し、その後のすべての再試行に対して10分間に達するまで待機時間が2倍になり、残りの再試行間の遅延になります。 --retry-delayを使用すると、この指数バックオフアルゴリズムを無効にできます。関連項目--retry-再試行に許可される合計時間を制限するmax-time。

このオプションを複数回使用すると、最後のオプションが使用されます。

7.12.3で追加されました。

--max-time 10を使用すると、10秒前に接続が切断されるため、ダウンロード時に役立ちません。

以下は、5秒の遅延と30秒の接続タイムアウトで300回再試行します

curl \
    --connect-timeout 30 \
    --retry 300 \
    --retry-delay 5 \
    URL
1
Max Barrass