配送ラベルというワークロードを一段落で見る
注文ごとに1つのPDFが作られ、そのPDFは感熱プリンターで一度印刷されます。処理が遅いときの失敗は「ページ表示が遅い」ではありません。「倉庫の集荷作業が、ラベル生成APIの待ち行列に詰まる」です。配送ラベルでは、p99レイテンシがそのままプロダクト指標になります。再印刷は日常的に起こるため、出力の決定性も重要です。バーコード品質も、ピクセルではなくGS1のX-dimension許容差で測られ、スキャナーが一度でラベルを読めるかどうかを左右します。
ヘッドレスブラウザーを使うPDFスタックは、この3つを同時に満たすのが苦手です。ピーク時にはコールドスタートのコストが積み上がり、小さな感熱ラベルではラスターバーコードの品質が落ち、Chromiumのバージョン差でフォントのラスタライズも揺れます。そのため「バイト単位で同一の再印刷」は実現しにくくなります。
gPdfがこの用途に合う理由
4×6インチの感熱ラベルは小さく(203 dpiで576 × 864ピクセル)、要素数も少なく(テキストブロック、1〜2個のバーコード、必要に応じて配送業者ロゴ)、しかも大量に生成されます。中規模の3PLでも1日に5万〜50万枚を生成します。gPdfはこの種の負荷を前提に設計されています。レンダラーは次のように動きます。
- レイアウトを一度だけコンパイルします。ページ座標、フォントカスケード、バーコード形状はリクエスト時に解決され、ブラウザーのレイアウトエンジンには渡しません。
- すべてのバーコードをベクター化します。モジュールをPDFストリームに直接描画するため、幅30 mmのGS1-128でも、203 dpiや600 dpiで鮮明に読めます。呼び出し側でDPIを意識したラスタライズ処理を書く必要はありません。
- NotoSans CJK + Latinを埋め込みます。同じ入力データで中国語の配送業者名も正しく描画でき、レンダリング用コンテナーにフォントを用意する必要がありません。
p99は、EU-WESTで上記サンプルを1,000回実行した参照ワークロードで8 msのままです。1つのisolateが1枚だけラベルを生成した場合でも、1万枚生成した後でも変わりません。
ボリュームとコストの計算
一般的な中規模3PLでは、1日あたり約5万枚、つまり月間約150万枚のラベルを扱います。**Basicプラン(月額5 USDで10万ページ、超過分は1ページあたり0.00005 USD)**では、次の計算になります。
150万ページ × 0.00005 USD = 75.00 USDの超過料金
+ Basicプラン基本料金 = 5.00 USD
─────────────────────────────────────
合計 = 80.00 USD/月
同じワークロードをPuppeteer-on-Lambdaで動かすと、一般的なLambda同時実行設定では月額200〜400 USD程度になります。ピーク時のコールドスタートによる運用コストは、この金額にはまだ含まれていません。
Black Friday: 具体例
ピーク時こそ、Edgeレンダリングの価値がもっともはっきり出る負荷です。ある小売業者がBlack Fridayの最初の1時間に通常の200%のラベル量に達したとします。60分で10万枚、平均で毎分1,700枚、バースト時は毎分5,000枚です。この負荷は、単一のCloudflare Workersリージョンプール内で完了し、コールドスタートの税金は発生しません。同じ負荷を平均トラフィックに合わせてサイズ調整したPuppeteerのウォームプールで処理すると、バースト時に追加起動されたコンテナーで1.5〜2.5秒のコールドスタートが発生し、倉庫の集荷カウンターはその遅延を1枚ごとに感じることになります。
次に読むべきもの
- JSON Render APIでは、上のラベル例で使ったすべてのフィールドを説明しています。
- バーコード形状の詳細は、GS1-128の精度に関する記事を参照してください。
- iTextベースのラベルパイプラインを置き換える場合は、物流ラベルにおけるgPdfとiTextの比較、または配送ラベルTCOを10万〜1億ページ/月で比較した詳細を読んでください。
- Chromiumベースのスタックと比較する場合は、gPdf vs Puppeteerを参照してください。