Dale Weiler 认为,程序员应默认使用无符号整数,因为大多数程序数值本质上是非负的。虽然诸如 Google C++ 风格指南等常见建议倾向于使用有符号整数以避免下溢错误,但 Weiler 认为这种方法是错误的,且往往会助长不安全的编码习惯。 作者指出,有符号整数运算常会导致未定义行为(特别是在 C/C++ 中)、复杂且易出错的溢出检查,以及隐蔽的内存安全漏洞。相比之下,无符号算术具有定义明确的溢出回绕(wrapping)行为,可用于编写更简洁、更稳健的代码,例如反向循环和增量计算。此外,使用无符号类型允许编译器和开发者将非负值视为严格的取值范围,从而消除了持续进行“是否为负数?”检查的必要性,也杜绝了将负数用作错误标记这一危险做法。 总之,Weiler 认为,对有符号整数的广泛依赖是一种遗留习惯,而非技术上的必然。通过默认采用无符号类型,开发者可以创建更具表现力、更易于维护且可预测的软件,前提是必须始终避免混合使用有符号和无符号类型,以防止出现需要危险转换或抑制警告的情况。
Postgres 的 `LISTEN/NOTIFY` 功能带来了严峻的扩展性挑战:随着监听者数量的增加,性能会随之下降。此外,该功能与单个数据库会话绑定,这使其无法与将客户端与特定后端连接解耦的标准连接池兼容。
Multigres 通过将订阅与客户端连接解耦解决了这一问题。连接池无需将客户端绑定到特定后端,而是为整个连接池维护一个单一的、预留的、长寿命的“监听连接”。它使用引用计数来跟踪通道订阅,确保仅在必要时才向 Postgres 发送 `LISTEN` 或 `UNLISTEN` 命令。
当此共享连接收到通知时,Multigres 会使用两级扇出系统,通过 gRPC 流将消息路由给正确的客户端。为了保持与 Postgres 的严格兼容,Multigres 还处理了复杂的边界情况:
* **事务:** 待处理的 `LISTEN/UNLISTEN` 请求会被缓冲,并仅在提交时应用。
* **竞态条件:** 就绪握手确保客户端仅在后端订阅激活后才会收到确认。
* **弹性:** 系统会在重新连接时自动恢复订阅。
这种方法在保留连接池优势的同时,确保了透明且高性能的发布/订阅分发。