別のタスクに料金を支払わずにタイムアウトしたリクエストを復旧する

著者:solvethree読了時間:1分

接続のタイムアウトは、タスクの作成失敗を意味しません。レスポンスが失われる前に、solvethree がタスクを作成している可能性があります。新しい論理タスクを送信するのではなく、同じタスク入力を同じ requestId で送信して復旧してください。

このページの内容

リクエストを保存し、変更せずに再送する

requestId は、複数回の作成試行にわたって 1 つの論理タスクを識別します。ASCII の英字、数字、アンダースコア、ハイフンを 1–64 文字使用できます。リクエストを送信する前に決めて、元のタスク入力と一緒に保存してください。

  1. 1.

    タスクの本文を保存する

    requestId を含むリクエスト全体を request.json に保存します。reCAPTCHA Enterprise では、ホスト名としての site、action、および proxy または proxyCandidates のどちらか一方のみを含めてください。type や url は追加しないでください。プロキシの認証情報が含まれるため、ファイルは非公開にしてください。

  2. 2.

    保存したファイルを送信する

    ワークスペースの API キーを使って、以下のコマンドを実行します。キーはサーバー側で管理してください。

  3. 3.

    接続がタイムアウトしたら、同じコマンドを再実行する

    同一のコマンドと、変更していない request.json を使用してください。レスポンスが届かなかったという理由だけで、別の requestId を生成したり、タスク入力を編集したりしないでください。

cURL · 同じリクエストファイルで再実行
# request.json contains one valid task body and a saved requestId.
# Keep the file private: it contains your proxy credentials.
curl --fail-with-body --max-time 30 \
  'https://api.solvethree.com/v1/tasks?waitMs=0' \
  -H "Authorization: Bearer $SOLVETHREE_API_KEY" \
  -H 'Content-Type: application/json' --data-binary @request.json

# If the connection broke, run the identical command with the identical file.
# New task: HTTP 201. Same requestId + same inputs: HTTP 200, existing task.
# Same requestId + changed inputs: HTTP 409.

HTTP 201 は、新しいタスクが作成されたことを意味します。HTTP 200 は、同一のリクエストによって既存のタスクが復旧されたことを意味します。どちらの場合も、返されたタスク ID とステータスを確認してください。HTTP ステータスだけでは、どちらも解答が使用可能になったことを意味しません。

入力を変更した場合の具体例として、保存済みリクエストの action が login に設定されているとします。同じ requestId のまま checkout に変更すると、リクエスト ID の競合を示す HTTP 409 が返されます。元のタスクを復旧するには、元のファイルに戻して再送してください。変更後の入力が意図的に必要な場合は、その新しい論理タスクに新しい requestId を割り当ててください。

タスクの成功ペイロードを読み取る前に、成功以外の HTTP レスポンスを処理してください。409 は HTTP リクエストのエラーであり、元のタスクが失敗の終端状態になったことを意味しません。

SDK エラーから ID を取得する

どちらの公式 SDK も、requestId を省略すると生成しますが、タスクの作成を自動で再試行することはありません。SDK 呼び出しで例外が発生した場合は、別のタスクを開始する前に、復旧用のフィールドを確認してください。

  • JavaScript: SolvethreeError は requestId と taskId を公開します。
  • Python: SolvethreeError は request_id と task_id を公開します。

エラーにタスク ID が含まれている場合は、そのタスクの GET ポーリングを再開してください。作成を繰り返す必要はありません。リクエスト ID だけが含まれている場合は、その ID と元の入力で作成リクエストを再送し、返されたタスク ID を使用してください。SDK が ID を生成した場合でも、元の入力を保持することが重要です。

すべての例外を、作成処理の中断として扱わないでください。TaskFailedError は、すでに失敗の終端状態に達したタスクを表し、復旧が必要なリクエストではありません。

復旧したタスクの処理を続ける

GET /v1/tasks/:id で復旧したタスクを取得します。ステータスが pending または solving の間はポーリングを続けてください。使用可能な解答が含まれるのは ready の場合だけです。

ステータスが failed の場合は、ポーリングを停止して errorCode と error を確認してください。解答生成に失敗した場合は返金されます。これは、ウェブサイトが生成済みの解答を拒否する場合とは異なります。ready は解答が使用可能であることを意味し、対象サイトが受け入れたことを意味するわけではありません。

完了済みの結果は、保持期間が過ぎると HTTP 410 を返すことがあるため、復旧機能は結果の永続的な保存手段ではありません。ポーリングループ自体については、タスクのポーリングとタイムアウトを参照してください。

解決しませんか?

タスクIDと発生したエラーをサポートにお送りください。

サポートに問い合わせる
別のタスクに料金を支払わずにタイムアウトしたリクエストを復旧する · solvethree