在处理HTTP请求时处理服务器关闭

时间:2019-04-01 08:36:31

标签: http error-handling

场景:服务器正在处理http请求,服务器关闭。直到执行代码为止有多个地方。通常如何处理此类案件?一个典型的示例可能是某些下游http调用必须作为传入的http请求的一部分进行。关闭时如何查找是否进行了此类调用。我假设不可能将所有动作持久化在代码流中。欢迎提出建议和意见。

1 个答案:

答案 0 :(得分:1)

这里有两种关闭方式可供考虑。

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

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

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

确切的操作方式取决于您的平台/框架。例如,Go的标准net/http库提供了一种Server.Shutdown方法。

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

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

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