Multigres Supports Listen/Notify Across Pooled Connections
3 days ago
- #Pub/Sub
- #Connection Pooling
- #Postgres
- Multigres解决了Postgres LISTEN/NOTIFY的扩展性问题,通过维护一个共享监听连接来处理所有客户端的订阅,避免了每个客户端会话的依赖。
- 连接池使用一个单独预留的后端连接进行监听,通过通道引用计数机制,无论客户端数量如何,每个通道只执行一次LISTEN/UNLISTEN,确保资源高效利用。
- 通知通过两级扇出异步传递:从连接池经由gRPC流到网关,再通过有界队列传递到客户端连接,以防止阻塞并匹配Postgres尽力而为的投递特性。
- Multigres通过缓冲操作并在提交时仅应用净变更来确保LISTEN/UNLISTEN的事务行为,并通过就绪握手消除竞态条件,保证不丢失通知。
- 该系统通过重放活跃通道处理重连等边缘情况,匹配Postgres的特定行为(如通道名截断和引号处理),并计划未来改进,如跨分片NOTIFY和流合并。