首页 > 解决方案 > 在服务 http 请求时处理服务器关闭

问题描述

场景:服务器正在处理一个 http 请求并且服务器关闭。在代码执行之前有多个点。此类案件通常如何处理?一个典型的例子可能是一些下游 http 调用必须作为传入 http 请求的一部分进行。如何在关机发生时查找是否进行了此类调用。我认为不可能在代码流中保留每个操作。欢迎提出建议和意见。

标签: httperror-handling

解决方案


这里有两种停机需要考虑。

优雅的关闭:当执行环境礼貌地要求您的进程停止(例如systemd发送SIGTERM)并期望它自行退出时。如果您的进程在几秒钟内没有退出,则环境会继续以更有力的方式终止该进程。

处理正常关闭的典型方法是:

  1. 聆听来自环境的信号
  2. 当你收到信号时,停止接受新的请求......
  3. ...然后等待所有当前请求完成

具体如何执行取决于您的平台/框架。例如,Go 的标准net/http库提供了一个Server.Shutdown方法。

在典型的系统中,大多数关闭都是正常的。例如,当您需要重新启动进程以部署新版本的代码时,您可以正常关闭。

也可能出现意外关闭:例如,当您突然断电或网络连接中断时(断开连接的服务器通常与死机一样好)。此类故障更难处理。有一整套研究致力于使分布式系统对任意故障具有鲁棒性。在简单的情况下,当您的服务器仅写入单个数据库时,您可以在请求开始时打开 事务并在返回响应之前提交它。这将保证所有更改都保存到数据库中,或者都不保存。但是,如果您将多个下游服务作为一个上游 HTTP 请求的一部分调用,则需要协调它们,例如使用saga

对于某些应用程序,忽略意外关闭并在出现不一致时手动处理任何不一致可能是可以的。这取决于您的应用程序。


推荐阅读