- Postgresのパブリッシュ/サブスクライブ(pub-sub) と キュー(queue) の性能をベンチマークし、単一データベースでもメッセージングシステムを置き換えられる可能性を提示
- 単一の4vCPUノードで 毎秒5,036件の書き込み・25,183件の読み取り、3ノードのレプリケーション環境でも同様のスループットを維持し、エンドツーエンド遅延186ms(p99) レベル
- 大型の96vCPUノードでは 書き込み238MiB/s、読み取り1.16GiB/s を達成し、CPU使用率10%未満で余裕のある処理を確認
- キューテストでも単一ノード基準で 毎秒2,885件、レプリケーション環境でも 2,397件 を処理可能で、ほとんどの企業規模には十分な性能
- 複雑な分散システムの代わりに Postgres単一インフラでも数MB/s規模のワークロードを処理できる可能性 を実証し、「必要になるまではシンプルな技術を使え」という実践的アプローチを強調
技術選択の二つの陣営
- 技術業界は バズワード中心の陣営 と 常識中心の陣営 に分かれる
- 前者は「リアルタイム」「無限スケール」「AIベース」などのマーケティング用語に惹かれる
- 後者はシンプルさと実用性を重視し、不必要な複雑さを避ける
- 最近は Small Data と Postgresルネサンス という二つの流れが後者を後押ししている
- データは小さくなり、ハードウェアは強力になっている
- Postgresは単一システムでさまざまな目的特化ソリューションを置き換えられる(
jsonb, pgvector, tsvector など)
ベンチマーク概要
- 目的: Postgresが pub/subメッセージング と キュー処理 でどの程度スケール可能かを測定
- テスト環境: AWS EC2
c7i.xlarge(4vCPU)および c7i.24xlarge(96vCPU)
- 三つの構成を比較
- 単一ノード
- 3ノードのレプリケーションクラスター
- 大型単一ノード
Pub/Subベンチマーク結果
- 4vCPU単一ノード
- 書き込み4.8MiB/s(5,036msg/s)、読み取り24.6MiB/s(25,183msg/s)、遅延60ms(p99)
- CPU使用率60%、ディスク書き込み46MiB/s
- 4vCPU 3ノードレプリケーション
- 書き込み4.9MiB/s、読み取り24.5MiB/s、遅延186ms(p99)
- スループットを維持し、年間コストは約 $11,514
- 96vCPU単一ノード
- 書き込み238MiB/s(243kmsg/s)、読み取り1.16GiB/s(1.2Mmsg/s)、遅延853ms(p99)
- CPU使用率10%未満で、ボトルネックはパーティションあたりの書き込み速度
- 結論: 低〜中規模のワークロードではKafkaと競合できる水準 で、シンプルな構成でも数十MB/sを処理可能
キューベンチマーク結果
SELECT FOR UPDATE SKIP LOCKED ベースのシンプルなキュー実装
- 4vCPU単一ノード
- 2.81MiB/s(2,885msg/s)、遅延17.7ms(p99)、CPU使用率60%
- 4vCPU 3ノードレプリケーション
- 2.34MiB/s(2,397msg/s)、遅延920ms(p99)、CPU使用率60%
- 96vCPU単一ノード
- 19.7MiB/s(20,144msg/s)、遅延930ms(p99)、CPU使用率40〜60%
- 単一ノードでもほとんどの企業のキュー処理量要件を満たせる
Postgresを使うべきかの判断
- ほとんどの場合 Postgresをデフォルト選択にするのが合理的
- SQLでメッセージのデバッグ、修正、結合が可能
- Kafkaと比べて運用がシンプルで保守しやすい
- Kafkaは高性能向けに最適化 されているが、小規模ワークロードには過剰な選択
- Donald Knuthの「早すぎる最適化は諸悪の根源」という警句を引用
最小実行インフラ(MVI)アプローチ
- Minimum Viable Infrastructure: 組織がすでに慣れている技術で最小限のシステムを構築する
- Postgresは広く採用されており、人材確保もしやすい
- 構成要素が少ないほど障害や運用負荷が減る
- 不要な技術導入は 組織的オーバーヘッド を招く
スケーラビリティの議論
- Postgresは実際にスケール可能
- OpenAIはいまも 単一書き込みインスタンスベースのPostgres を使用
- 数億人規模のユーザーに対しても安定運用できる
- ほとんどの企業は成長速度が緩やかで、技術を置き換えるまでに数年の猶予 がある
- 「バイラルに備えた設計」は過度な オーバーデザイン である
- 「Coldplayの前座のためにMarshallアンプを買うようなものだ」という比喩を示す
結論
- 「壊れるまでPostgresを使え」
- シンプルな技術でも十分に高い性能を確保できる
- 必要以上に複雑な分散システムを導入するのは非効率
- Postgresは現代のハードウェアと組み合わせることで、ほとんどのワークロードに耐えられる実用的な選択肢 である
1件のコメント
Hacker News の意見
パレートの法則をあらゆる状況に当てはめるのは誤った解釈である
Postgres が Kafka より 20% の労力で 80% のユースケースを処理できると言うのは根拠のない主張である
パレートの法則は べき乗則分布が現れる状況でのみ意味を持つ
単に Postgres は十分に多くのユースケースをカバーでき、安定していて、実績のあるツールだと言えばよい
小規模(毎時数百イベント)から大規模(毎時数兆イベント)まで扱ってきた経験上、まず キューが本当に必要か から検討すべきである
Postgres を万能用途に使うアプローチは危険である
ロックと分離レベル は直感的ではなく、性能ボトルネックを生むことがある
何十年も Postgres を使ってきたが、盲目的な信念で設計すべきではない
SQL ベースの イベントログテーブル アプローチは有効だと思う
ただし、クライアント側の ツール不足 が欠点である。Kafka はライブラリエコシステムが豊富なので、その点が強みである
私たちの会社では、サービス間イベント配送を SQL ベースで標準化した (feedapi-spec)
Kafka ほど成熟してはいないが、複数のストレージエンジンをサポートする共通ライブラリスタックへ発展する可能性がある
最近の人はあまりにも 新しい技術 に惹かれる傾向がある
Postgres は素晴らしいが、問題に合った道具 を使うべきである
Postgres は pub-sub 用に設計されたわけではなく、Kafka はそのために作られた
すべての製品が「何でもやろうとする」トレンドは避けるべきであり、それぞれ 一つのことをうまくやるツール のほうが良いと思う
「単調増加オフセット番号」を実装するのは厄介な問題である
単純なシーケンスはトランザクション順序とコミットタイミングがずれて問題を引き起こす
SELECT FOR UPDATE SKIP LOCKEDを使って重複処理を避ける方法もあるKafka を実際にベンチマークしたのか疑問である
96 vCPU 環境で得た結果は、Kafka の 4 vCPU 設定でも出せる
Postgres の性能が 異常に遅い
Kafka が不要なら使わなければよいが、Postgres で 5k msg/s を誇っても意味はない
「新技術に執着する人たち」と「学んだことだけに固執する人たち」という二つの極端がある
現実的なエンジニアはその中間で 実用的な選択 をする
Kafka の中核機能は コンシューマーごとのオフセット制御 である
複数チームが同じトピックを読む環境では必須の機能である
オフセットを前後に調整できる点が何度も 命綱 になった
Postgres キューでこうした機能をサポートできるのか気になる
「バズワードを追う陣営 vs 常識派」という構図そのものが間違っている
Kafka を Postgres で再実装しようとするのは常識ではない
本当に Kafka 級の機能が必要なら、そのまま Kafka を使えばよい