Skip to content

レスポンスの設計 ― 200 を返すのが遅れたら

📖この章のキーワード
用語意味なぜ重要か
即時レスポンス処理完了前にクライアントへ応答を返すパターンタイムアウトを防ぐ
タイムアウト一定時間内に応答がない場合に接続を切断すること遅い応答は再送を誘発する
再送(Retry)クライアントが応答を受け取れず同じリクエストを再度送ること二重処理のリスク
response()->send()Laravel で即座にレスポンスを送信する PHP メソッド後続処理を分離する手段

Phase 1: 観察

trade-off 即時レスポンスのパターンを学ぶためのコードです。

WebhookController の構造をもう一度見てみましょう。今度は レスポンスのタイミング に注目します。

php
// WebhookController.php(レスポンス構造の概要)
// Label: trade-off

public function webhook(Request $request): array
{
    // 署名検証...

    if (/* 署名OK */) {
        // ① 即座に 200 レスポンスを返す
        response()->json(['message' => 'ok'], 200)->send();

        // ② 外部 Webhook URL へ転送(Bot に設定されている場合)
        foreach (['webhook_url1', 'webhook_url2', 'webhook_url3'] as $field) {
            if ($bot->$field) {
                $this->sendToExternalWebhook(...);
            }
        }

        // ③ LINE Platform イベントの処理
        foreach ($request->input('events', []) as $item) {
            $event = new WebhookEvent($bot, $item);
            $event->process();
        }
    }
}

ポイント: response()->send() の時点でクライアント(LINE Platform)への応答は完了しています。 その の処理(外部転送、イベント処理)はクライアントを待たせません。


Phase 2: 判断

AI禁止ゾーン

もし response()->send() を処理の 最後 に移動したらどうなりますか?

php
// こうしたら?
foreach ($request->input('events', []) as $item) {
    $event = new WebhookEvent($bot, $item);
    $event->process();  // ← 時間がかかる場合がある
}

// 全処理が終わってから応答
return response()->json(['message' => 'ok'], 200);
  • 何が起きる可能性 がありますか?
  • LINE Platform 側 はどう振る舞いますか?
  • LIBOT の現行設計は 何を守っている のですか?

AIに聞く前に、自分の頭で考えてみましょう。

テキストを入力すると有効になります