墨穗app.notebase.cn
控制台
内容库
动态
管理
账户
U
用户
--
在线
v1.0.165 · 墨穗笔记
笔记

Notebase墨穗
静水流深,落墨成穗。

0笔记
0工具
30推荐

分类导航

按主题直达

编辑精选

站内用户贡献 · 真实笔记

最新收录

每日更新
继续浏览全部内容 →

笔记

0
加载中...

工具

0

此页用于记录用户反馈问题后的每一次改进

关于

笔记用法

“写笔记”支持四种格式——Word 文档、Excel 表格、Markdown、纯文本,起稿或二次编辑时都能随时切换,同一篇笔记想用哪种形态来记,都由你说了算。

md、txt、csv、json 这类纯文本则原样载入,不做多余加工。拿一张现成的表倒进来、改几笔、再导出去,等于白用一台免费的格式转换器。

要带走就在右上角点“下载”,可导出 PDF、Word、Markdown、Excel、TXT 等格式;列表卡片“⋯”菜单里,也有同样的下载入口。

工具用法

在“工具”页点“+ 上传工具”即可发布:填好名称与链接,再用 Markdown 把使用方法写清楚——能解决什么问题、怎么装、怎么用,比堆介绍实在。

要分发安装包就一并上传压缩包(ZIP、RAR、7Z、TAR.GZ,最大 35MB),别人在详情页一键下载;只放链接不带附件也可以。

工具按大家的收藏热度排序,好用的自然会被顶上来。发布后可在详情页或卡片菜单里编辑、下架。

隐藏笔记

写笔记时勾上“隐藏”,这篇就只存在于你自己的账号里:不进列表、不进搜索、不上首页精选,也不会出现在任何公开的页面,链接发给别人同样打不开。

适合放密码、草稿、日记这类只给自己看的内容;想公开,去“发布”打开它,把“隐藏”的勾去掉再保存,之后编辑会默认保持原状态,不会悄悄变回公开。

不想公开、只想临时给人看:点“分享”生成一条带密码和有效期的链接,到期自动失效,你也能随时撤销。

数据安全

你的内容会同时保存在多个副本上,系统定期做备份与完整性校验,再配合异地容灾机制:就算某台机器出问题,数据也不会丢,可以长期放心存放;特别重要的资料,仍建议你另外再留一份备份。

技术

全站跑在容器化、模块化的现代架构上,更新、部署、回滚都很快,扩展性和稳定性都按长期运营的标准来设计(Built for reliability, designed to scale)。

理念

这个网站最早只是一个人的笔记仓库,后来慢慢长成现在的知识中枢。设计上很克制——没有广告、没有追踪、没有推荐算法,只是干干净净地存放一些东西;既然做好了,就公开出来,万一有人用得上呢。

原则

不做大而全,不做平台梦,保持简单、保持克制、保持好奇。所有内容都由用户贡献、由用户维护:不会突然冒出付费墙,不会在角落塞广告位,也不会把你的数据卖给第三方。

更多

产品会持续迭代,站内日志页记录着每一次改动,改了什么都有迹可循;想了解这个站是怎么一步步走到今天的,翻翻日志就能看到来龙去脉。

举报

如果在这里看到涉嫌违规的内容,点对应卡片右侧的“举报”按钮就能提交,我们会尽快核实处理;也谢谢你花一点时间,一起把这里维护干净。

趋势

// 点击导航加载发现
归档
// 归档为空
最近浏览
// 暂无浏览记录
发布
// 加载中...
用户发布
// 加载中...
用户管理
// 加载中...
访问统计
// 加载中...
内容审核
// 加载中...
个人信息
// 加载中...
返回首页

PgDog:打破连接池器“漏油抽象”的下一代 Postgres 代理

2026-07-08数据库

PgDog 通过内置 SQL 解析器、多线程 Tokio 运行时和原生 LISTEN/NOTIFY 支持,解决了传统连接池器(如 PgBouncer)中 SET 语句状态泄漏、发布/订阅功能缺失和单进程性能瓶颈的问题。

背景:为什么 Postgres 需要连接池?

PostgreSQL 的每个客户端连接都会消耗服务器资源(内存、文件描述符、进程/线程)。默认情况下,Postgres 的最大连接数通常设置为 100-500,但现代微服务架构中,每个服务实例都可能创建数十个连接,很快就能耗尽数据库连接池。连接池器(connection pooler)作为代理层,让多个客户端复用少量数据库连接,从而突破这一限制。

现有的连接池器包括:

  • PgBouncer:最流行的轻量级池器,使用单进程事件循环模型。
  • RDS Proxy:AWS 托管的池器,支持自动缩放。
  • Pgpool-II:功能更丰富的中间件(含负载均衡、读写分离)。
  • Supavisor:Supabase 的云原生池器。

但所有这些工具都引入了一个核心问题:泄漏的抽象(Leaky Abstraction)。

泄漏的抽象:连接池器的“原罪”

传统池器遵循 Unix 哲学——“只做一件事,并做好”。PgBouncer 正是因此成功:它简单、稳定、高效。但它的“一件事”是连接复用,而代价是屏蔽了 Postgres 的会话级状态。

当你部署 PgBouncer 或 RDS Proxy 时,你会很快发现它改变了使用数据库的方式:

  • 你必须修改应用代码来绕过某些特性。
  • 对于已有大量生产代码的团队,这意味着要修改数千行代码,且通常缺乏测试覆盖。

PgDog 的目标是让连接池器变得透明——像直接连接 Postgres 一样使用它,无需妥协。

核心问题 1:连接状态泄漏(SET 语句)

问题描述

SET 语句用于临时覆盖数据库会话参数。例如:

sql
SET statement_timeout TO '5m';
SELECT * FROM users WHERE banned IS true;

在直接连接中,SET 只影响当前会话。但在连接池中,一个客户端执行 SET 后,连接被归还池中;下一个客户端复用该连接时,会继承上一个客户端的 SET 状态。这导致:

  • 最佳情况:慢查询意外获得长超时,引发数据库事故。
  • 最坏情况:依赖会话变量的行级安全(RLS)策略失效,数据行静默消失。

传统解决方案:“不要使用 SET”。但 SET 是 Postgres 的核心功能,放弃它意味着:

  • 必须用其他方式实现超时控制(如应用层)。
  • 如果使用 RLS(常见于多租户应用),则完全无法使用连接池。

PgDog 的解法:内置 SQL 解析器

PgDog 内置了一个轻量级 SQL 解析器,可以:

  1. 检测 SET 语句:解析出变量名和值。
  2. 按客户端存储状态:在代理层为每个客户端连接维护一个状态副本。
  3. 自动同步:当客户端发送查询时,PgDog 检查其状态是否与后端连接匹配。如果不匹配,自动执行一系列 SET 语句来恢复状态。

性能优化:

  • 使用查询流水线(query pipelining):如果多个变量不同,一次性批量发送 SET 语句,只需一次网络往返。
  • 解析算法极快,几乎不增加延迟。

效果:开发者可以继续使用 SET 语句,就像直接连接 Postgres 一样。

核心问题 2:LISTEN/NOTIFY 支持

问题描述

LISTEN/NOTIFY 是 Postgres 内置的发布/订阅机制:

  • 客户端通过 LISTEN channel 订阅频道。
  • 任何客户端通过 NOTIFY channel, 'payload' 发送消息。
  • 订阅的客户端会收到通知。

这是一个轻量级的消息队列,常用于:

  • 缓存失效通知。
  • 实时更新推送。
  • 跨进程协调。

但在事务模式(transaction mode) 的池器中,连接在事务结束后被归还,LISTEN 状态丢失。因此,开发者不得不迁移到 SQS、Redis Pub/Sub 等外部系统。

PgDog 的解法:代理作为 pub/sub 中间人

PgDog 在内部实现了完整的 LISTEN/NOTIFY 协议:

  1. 进程内通信:使用 Tokio 的 broadcast channel 在同一个 PgDog 进程内的客户端之间传递消息。
  2. 跨进程支持:生产环境通常运行多个 PgDog 实例(容器),PgDog 会通过一个专用连接将 LISTEN/NOTIFY 命令转发到 Postgres,同时监听 Postgres 的通知。

架构效果:

  • 对客户端来说,PgDog 本身看起来就是消息代理。
  • 实际上,消息仍然存储在 Postgres 中(通过 NOTIFY 的语义)。
  • 保留了事务语义:即使 NOTIFY 在某些情况下导致数据库崩溃(PgDog 团队修复了该问题),事务完整性依然保持。

这种“创造性的工程”让开发者可以继续使用 Postgres 原生的 pub/sub,无需引入额外组件。

核心问题 3:多线程 vs 多进程

现有方案的局限

  • PgBouncer:单进程事件循环。为了利用多核,必须启动多个 PgBouncer 进程,并依赖 SO_REUSEPORT 实现端口共享。但每个进程拥有独立的连接池,客户端一旦连接某个进程,就无法切换。如果某个进程过载,其客户端全部卡住。
  • RDS Proxy:支持“无服务器”自动缩放,但缩放需要时间,且控制平面复杂。

本质上,两者都要求你分片连接池——这增加了运维复杂度。

PgDog 的多线程模型

PgDog 基于 Tokio(Rust 异步运行时),使用多线程工作线程:

  • 每个客户端由一个独立的异步任务处理。
  • 任务数量随连接数线性扩展。
  • 利用多核 CPU,单个 PgDog 进程可以处理更多客户端和更高 QPS。

优势:

  1. 更高的连接利用率:一个进程可以服务更多客户端,减少对后端连接的需求。
  2. 突发流量处理:无需等待自动缩放,多线程进程可以立即吸收查询突发。
  3. 简化的运维手册:只需监控一个进程的指标和健康检查,无需处理 Linux 内核级别的 SO_REUSEPORT 或 AWS 控制平面。

总结与展望

PgDog 已经生产运行超过一年,峰值达到 200 万 QPS。它开源(AGPL 许可证),可部署在任何环境中。

核心哲学:不要强迫用户放弃 Postgres 的特性来使用连接池。SET、LISTEN/NOTIFY 是 Postgres 的标配,连接池器应该透明地支持它们,而不是成为“漏油抽象”。

对于正在考虑连接池的团队:

  • 如果应用大量使用 SET 或 RLS,PgDog 是唯一能保留这些特性的选择。
  • 如果使用 LISTEN/NOTIFY 作为轻量级消息队列,PgDog 让你无需迁移到外部系统。
  • 如果追求高吞吐和低延迟,多线程模型比多进程分片更高效。

原文链接:https://pgdog.dev/blog/why-yet-another-connection-pooler

相似推荐
在 GitHub Pages 上托管 SQLite 数据库:让静态网站拥有真正的查询能力Apple 开源 FoundationDB:分布式数据库的基石与未来手机号查询没加引号,2000 万行全表扫binlog 把数据盘写满,MySQL 写不进去了怎么救从库延迟 16 个小时追不上:大事务和并行复制40G 的 mysqldump 导回去跑了一整夜:关 binlog 快三倍
编写使用方法
Markdown 格式 · Ctrl+Enter 确定
0 字新建笔记
欢迎回来
登录你的墨穗笔记账户
忘记密码?
还没有账户?立即注册
创建账户
注册你的专属墨穗笔记
已有账户?去登录
找回密码
输入注册邮箱获取验证码
返回登录
请输入图片中的验证码以继续注册
加载中...
取消
新建收藏
手动添加你喜欢的内容
取消
编辑头像与昵称
上传新头像或修改你的显示昵称
支持 JPG/PNG,最大 2MB
取消

问题反馈

隐私提醒

取消
编辑工具
受控分享
为这篇笔记生成限时 / 带密码的临时链接
关闭