Skip to content

バッチチャンク ― 10万件を一気にやるか、分割するか

📖この章のキーワード
用語意味なぜ重要か
array_chunk()配列を指定サイズに分割する PHP 関数バッチ処理の分割に使う
障害局所化失敗の影響を一部に限定する設計チャンク分割の核心的な価値
チャンクサイズ1回に処理するデータ量メモリ、タイムアウト、リトライコストのバランス

Phase 1: 観察

exemplar チャンク処理と障害局所化の設計パターンです。

LIBOT のバッチインポート処理:

php
// ProcessBatchImportChunkJob.php
// Label: exemplar

class ProcessBatchImportChunkJob implements ShouldQueue
{
    public int $tries = 3;
    public int $timeout = 300;  // 5分

    public function __construct(
        private int $jobId,
        private array $rows,     // ← チャンクされた行データ
    ) {}

    public function handle(BatchImportService $service): void
    {
        $job = BatchImportJob::find($this->jobId);
        if (!$job || $job->isCancelled()) {
            return;
        }

        $service->processChunk($job, $this->rows);
    }
}

一斉送信でもチャンク分割:

php
// SendBroadcast.php(配信処理の一部)
// Label: exemplar

// 友だちリストを 10 人ずつに分割
$chunks = array_chunk($friendIds, 10);

foreach ($chunks as $chunk) {
    SendReferralBatch::dispatch($broadcast, $chunk);
}

Phase 2: 判断

AI禁止ゾーン

10 万件のユーザーデータをインポートする機能を作ります。

方法 A: 10 万件を 1 つの Job で処理する 方法 B: 1000 件 x 100 Job に分割する

  • それぞれの メリットとデメリット は?
  • チャンクサイズを 10 件 にしたらどうなりますか? 10 万件(分割しない)だったら?
  • 方法 B の 37 番目の Job が失敗 したら、何が起きますか?

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

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