Appearance
レスポンスの設計 ― 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に聞く前に、自分の頭で考えてみましょう。
テキストを入力すると有効になります