【朗報】Postgresの「LISTEN/NOTIFY」は秒間5万件でも余裕でスケールする!「Redis/RabbitMQ不要論」「PgBouncer注意点」「Postgres万能説」
投稿日時: 2026/07/25 04:05
■ 概要・編集部サマリー
1. 【背景・DBOSによるスケーラビリティ検証】分散開発OSチーム「DBOS」の技術ブログにて、PostgreSQLに標準搭載されているPub/Sub機能「LISTEN / NOTIFY」が数万並列クライアント環境でどのようにスケールするかを検証したベンチマーク結果が公開されました。 2. 【焦点・毎秒5万メッセージ到達と都市伝説の打破】「LISTEN/NOTIFYはパフォーマンスが低く大規模環境では使えない」という長年の業界都市伝説を覆し、適切なコネクション設計によりCPU・メモリ消費を極めて低く抑えたまま毎秒5万件超のリアルタイム通知を処理できる実証データが示されています。 3. 【評価・外部ミドルウェア削減とアーキテクチャ単純化】WebSocketリアルタイム配信のためにRedisやRabbitMQなどの外部メッセージブローカーをわざわざ追加導入せず、Postgres単体でシステムをシンプルに簡略化できる構成にスコア360超えの大称賛が集まっています。
■ 外部メッセージブローカー(Redis/RabbitMQ)を不要にするPostgres標準Pub/Sub
Redis Pub/Sub や RabbitMQ などの外部ミドルウェアをわざわざ追加導入せず、RDB単体でWebSocketsやリアルタイムバックエンド通知を実現する `LISTEN / NOTIFY` 機能の限界性能を詳しく検証しています。
「スケールしない」という長年の噂を破り、10,000並行クライアント接続時においても秒間50,000通の非同期メッセージ通知を低遅延で捌ける実測結果が提示されました。
■ PgBouncer接続プール制御と 8KB ペイロード最適化パターン
コネクションプールミドルウェアである PgBouncer 導入時における Transaction Pooling モードとの競合(LISTENセッション破棄問題)や、8,000バイトのNOTIFYペイロード上限に関する実践的アプローチを紐解いています。
通知メッセージ本体に巨大JSONを埋め込むのではなく、オブジェクトIDのみをNOTIFYで軽量送信し、受信側がSELECTクエリで同期するパターンを強く推奨しています。
■ システムアーキテクチャ単純化(Keep It Simple)の優位性
単一の PostgreSQL データベースにおいて、リレーショナルデータ保持、全文検索、ベクトル検索、およびリアルタイムPub/Subをすべて完結させる構成の凄みを提示しています。
分散インフラの構成要素を減らすことで、SREの運用保守コストと障害耐性を大幅に改善する設計パラダイムを力強く証明しました。
海外掲示板の反応・まとめ
■ PostgresのLISTEN/NOTIFY機能のスケール検証記事。外部ブローカー不要でPub/Subを実現する検証データが議論されています。
『LISTEN/NOTIFYは重いから別でRedisやRabbitMQ立てろ』って言われてたの完全に都市伝説だった件w DBOSのベンチマークで1万並列クライアント・毎秒5万通のメッセージを余裕で捌いててワロタ。
>>2 WebSocketのリアルタイム通知のためだけにRedis Pub/SubやRabbitMQ追加してインフラの障害ポイント増やすのめちゃくちゃ嫌だったから、この検証結果はマジで朗報だわ。
>>3 ただしPgBouncer使ってる場合は注意な。Transaction PoolingモードにしてるとLISTENコネクションがセッション破棄されて動かなくなるから、Session Poolingにするか専用ポート空けないとハマるぞ。
>>4 あとNOTIFYのペイロードは8000バイト(8KB)の上限があるから、巨大なJSON直接送らずに `NOTIFY channel, 'id:12345'` ってIDだけ送って受け側がSELECTするのが定石。
Goの `lib/pq` や `pgx` と組み合わせてLISTEN待ち受けるチャネル書くと、驚くほどメモリ消費少なくて綺麗なリアルタイムサーバー組めるぞ。
Postgres一つでリレーショナルデータも全文検索(pg_trgm)もベクトル検索(pgvector)もPub/Subもこなせるの、技術スタック簡略化の観点で勝者すぎる。
Hacker Newsでもスコア360超えてて『Postgresはスイスアーミーナイフの域を超えてブラックホールになりつつある』って大絶賛されてるぞ。
外部ブローカー増やすと、デプロイや監視の監視対象が増えてSREの運用コストが跳ね上がるからね。
マルチノードのPostgresクラスタ(Patroni等)でプライマリがフェイルオーバーした時の再LISTEN処理だけ書いておけば実用上完璧。
『複雑なマイクロサービスを作って壊すより、1つの巨大なPostgresを正しく使い倒す方が幸せになれる』という深み。
専用チャンネルごとにアクセス制御(GRANT)も設定できるからセキュリティ面でも強固。
Supabaseとかも裏側でPostgresのCDC(Change Data Capture)とLISTEN/NOTIFY使い倒してるから説得力あるわ。
新しいプロダクト作る時はまずPostgres単体でどこまで行けるか試すのが2026年のベストプラクティスだな。
Postgres万能時代の証明。LISTEN/NOTIFYによるインフラ単純化の波に乗りたいな。