场景:服务器正在处理http请求,服务器关闭。直到执行代码为止有多个地方。通常如何处理此类案件?一个典型的示例可能是某些下游http调用必须作为传入的http请求的一部分进行。关闭时如何查找是否进行了此类调用。我假设不可能将所有动作持久化在代码流中。欢迎提出建议和意见。
答案 0 :(得分:1)
这里有两种关闭方式可供考虑。
有正常关闭:当执行环境礼貌地要求您的进程停止(例如systemd发送SIGTERM)并期望其自行退出时。如果您的进程在几秒钟内仍未退出,则环境会以更有力的方式继续终止该进程。
处理正常关机的典型方法是:
确切的操作方式取决于您的平台/框架。例如,Go的标准net/http
库提供了一种Server.Shutdown
方法。
在典型的系统中,大多数关机都是正常的。例如,当您需要重新启动进程以部署新版本的代码时,可以进行正常关闭。
也可能意外关闭:例如当您突然断电或失去网络连接时(断开连接的服务器通常和失效的服务器一样好)。这样的错误很难处理。有一整套研究致力于使分布式系统对任意故障具有鲁棒性。在简单的情况下,当服务器仅写入单个数据库时,可以在请求的开头打开transaction并提交它,然后返回响应。这样可以保证将所有更改都保存到数据库中,或者都不保存。但是,如果您将多个下游服务作为一个上游HTTP请求的一部分进行调用,则需要与它们进行协调,例如,使用saga。
对于某些应用程序,可以忽略意外关闭,并在出现/出现时简单地手动处理任何不一致情况。这取决于您的应用程序。