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