Sunday面试指南

什么是优雅停机?服务发布时,正在处理的请求怎么办?

下面是一段教学用的模拟面试。

🧑‍💻 面试官:准备替换一个服务实例,直接结束进程可以吗?

🙋‍♂️ 我:正在处理的请求可能被中断,应该先停止接收新请求,让旧请求完成。

🧑‍💻 面试官:你从负载均衡里移除了实例,怎么还有新请求进来?

🙋‍♂️ 我:配置传播和已有连接都需要考虑,摘流量不是瞬间完成的。

🧑‍💻 面试官:有个请求一直不结束,进程要永远等它吗?正在消费的消息又应该怎么办?

优雅停机要安排工作交接:新任务别再进入,旧任务有时间收尾,超时以后有明确处理。

面试速答(60 秒版)

优雅停机,是服务准备退出时,先停止接收新工作,再给正在执行的任务一段有限的完成时间,最后释放资源并退出。

发布时通常需要同时处理流量层和应用层。实例先进入不接收新流量的状态,应用也停止接纳新任务;已有请求继续执行,完成后再关闭数据库连接池和其他依赖。

等待必须有上限。超时任务要按协议取消、记录或交给恢复机制,不能让发布一直卡住。消息消费则要停止拉取新消息,正在处理的消息完成后再确认;没完成的任务要能按队列机制重投和幂等处理。

我会把应用的停机窗口放在平台允许的总退出时间内,并验证滚动发布时没有请求被无故切断、任务丢失或重复产生业务结果。

实例停止接纳新任务,有限等待在途请求,然后关闭依赖退出

知识点详解:进程退出之前,哪些工作还没有结束?

先看一个被直接切断的请求

假设接口正在生成报告,已经从数据库取完数据,准备把文件保存下来。这时发布脚本直接终止进程。

用户可能只收到连接断开,但服务端到底做到哪一步,并不清楚。如果任务已经产生了部分结果,重试还可能再次执行。

所以,停机不能只看“进程已经消失”。要看哪些任务还在执行,以及系统能不能判断它们的结果。

摘流量与停止接单,是两层控制

负载均衡不再给实例分配新流量,负责的是入口分发。应用拒绝接受新的任务,负责的是实例自己的工作边界。

流量配置需要传播,已有连接也可能继续存在。仅修改健康状态,不一定能让所有路径立即停止发请求。

应用可以进入 draining 状态,不再接收新的业务任务,同时让已接收任务完成。不同服务器对连接与新请求的处理方式不同,尤其是长连接和多路复用协议,不能只按“关一个端口”理解。

这个过程要和负载均衡、服务发现及探针规则配合。让实例不可接收新流量,不代表立刻把它当成需要强制重启的故障进程。

为什么资源要最后关闭?

正在执行的请求,可能还需要数据库、缓存和外部连接。如果先关连接池,再等请求结束,请求就失去了完成工作的条件。

合理顺序通常是停止接收新任务、等待在途任务、关闭资源、退出进程。后台线程、定时任务和消息消费者,也要进入同一套生命周期管理,不能 HTTP 已经停了,后台还不断创建新工作。

Spring Boot 的 优雅停机文档 说明了支持的服务器与生命周期行为,也提供了阶段等待时间配置。其他运行时需要按实际服务器核对,不能把某个框架的默认行为套到所有应用。

超时任务应该怎么处理?

平台通常只给进程一段退出时间,超过以后会强制结束。应用的收尾时间,需要给资源关闭和最后退出留出余量。

例如平台总窗口是三十秒,应用不能把整整三十秒都用于等待请求,再开始关资源。这个数字只是解释预算关系,实际设置要根据平台与任务时长确定。

对能取消的任务,传递取消信号并保存必要状态;对需要可靠恢复的长任务,可以拆成可重试步骤,或者交给持久化任务系统。生成报告这样耗时较长的工作,也未必适合一直占着同步 HTTP 请求。

“优雅”表示尽量有序,并不保证所有任务都能在任何情况下完成。

消费消息时,最怕哪两种顺序?

第一种是先确认消息,再执行业务。进程中途退出,消息已经被确认,工作却没做完。

第二种是业务完成,但还没来得及确认就退出。队列可能重投,业务会再执行一次。

因此停机时要停止接收新消息,让在途处理走完正常确认流程。处理未完成的消息按队列协议释放或等待重投,业务本身做幂等。不能承诺只靠一个停机钩子,就能获得所有系统的恰好一次执行。

消息确认早于提交可能丢效果提交早于确认可能重复

怎样验证,而不是只写一个信号监听?

准备慢请求、长连接和正在执行的消费任务,在它们运行时触发真实退出流程。

检查新工作是否继续进入、旧任务是否有机会完成、等待是否受限、资源是否正确关闭。再主动让某个任务超过窗口,验证中断后的重试或恢复。

测试还要经过真实入口。只在应用内部调用关闭函数,看不到负载均衡传播和平台强制结束带来的影响。

面试官继续追问

收到 SIGTERM 后睡十秒,可以吗?

固定等待可以配合入口传播,但不能代替跟踪在途任务。有的请求已经完成,有的十秒后仍未结束,单纯睡眠不知道区别。

WebSocket 要等连接自然断开吗?

如果连接可能长期存在,就需要应用协议告知迁移、关闭连接或恢复会话。不能无限等待,也不能假设所有长连接都能按短请求处理。

优雅停机能保证发布不丢数据吗?

不能单独保证。事务、消息确认、幂等和恢复机制决定业务可靠性,停机流程只是减少可控中断的一部分。

面试速记卡

  • 先停止新工作,再等待在途任务,最后释放资源。
  • 入口摘流量和应用拒绝新任务,需要配合。
  • 连接池别早于依赖它的任务关闭。
  • 应用收尾窗口要小于平台总退出预算。
  • 消费消息按完成情况确认,重投仍需要业务幂等。
  • 用真实入口与超时任务验证退出流程。

公司面试真题

这道题暂未收录可核验的公司真题来源。你可以先阅读本文解析,或浏览已收录的公司面试真题。

浏览公司面试真题 →
简历汪永久免费在线制作简历,模板直接套用、导出无水印,永久免费、下载免费,不需要付费解锁任何功能。去写简历