Oxy:优雅重启之旅
💡
原文英文,约2000词,阅读约需8分钟。
📝
内容提要
本文讨论了软件升级的可靠性和方法,以及Cloudflare在升级过程中采用的策略,包括使用tableflip库实现优雅的重启,利用systemd的socket管理功能管理socket的生命周期,以及使用WaitGroups和Unix socket处理失败和协调重启。作者还提到了一些限制和挑战,并表示将在后续博客中讨论更多解决方案。
🎯
关键要点
- 软件在持续开发中最终需要部署新版本,升级过程的可靠性、可用性和正确性至关重要。
- Cloudflare的软件不能突然停止,HTTP请求丢失会导致网页加载错误,影响用户体验。
- 没有一种通用的可靠软件升级方法,通常的做法是逐步将新版本接管任务,最终停止旧版本。
- Cloudflare的代理在接收连接时,工作在客户端连接的生命周期内,重启的安全时机是没有人打扰的时候。
- 使用tableflip库实现优雅重启,新版本启动后通知旧版本停止接受新连接。
- systemd用于管理socket的生命周期,确保在Oxy应用停止时socket仍然开放,允许客户端连接。
- 在Rust中实现WaitGroups以协调异步任务的完成,利用MPSC通道来等待所有任务完成。
- 使用Unix信号触发程序重启的机制存在局限性,Oxy通过创建Unix socket来协调重启,确保配置文件有效。
- 重启后旧进程必须终止,以防止内存消耗过多,配置更改的应用受到systemd设计的限制。
- 在UDP协议中,旧进程如何处理现有会话而不干扰新进程是一个难题。
- 重启的正确性是实现可靠性的第一步,后续将讨论更多解决方案。
🏷️
标签
➡️