我有一项服务,希望在Google Cloud Platform上的可抢占实例上运行。这些实例将位于负载均衡器后面。大多数请求需要不到10秒的时间。
我无法修改服务本身,但是同一图像上有一个nginx实例,位于我可以配置的服务前。
据我所见,在关闭实例前30秒钟,ACPI软关闭信号已发送到实例,这时我希望它停止接收请求。
我可以创建一个shutdown script来重新配置nginx以停止将运行状况检查转发给该服务,而是以拒绝自己的态度进行响应,但这似乎有点不客气,我觉得应该有更好的方法。 (说服务不健康也觉得有点不对劲,它只是想从游泳池中取出来。)
告诉负载均衡器停止向该实例发送请求的合适方法是什么,以便它可以(希望)完成当前请求,然后在不接收任何新请求的情况下关闭该请求?
┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │
┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │
Preemptible instance │ │
│ │
│ │
│ │
│ │
┌─────────┐ │ ┌─────────┐ ┌─────────┐ │
│ Load │ │ │ /health │ some │ │ │
────▶│balancer │──────┼──▶│ nginx │──────────▶│ service │ │
│ │ │ │ /api/… │ │ │ │
└─────────┘ │ └─────────┘ └─────────┘ │
│ │
│ │
│ │
│ │─
│─
└ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
答案 0 :(得分:0)
这个答案比“它是更好的解决方案”更多地是“我会做的”,但是,如果健康检查确实可以很快地回答,那么它就可以工作。
我知道在削减请求之前它来自哪里,这样您就不会在中间削减正在进行的请求并超时了。这已经通过正常停止服务来实现。
如果服务处于正常停止状态,它将停止接收请求,但在停止之前等待当前请求完成,然后再对其他服务创建一个对nginx服务的依赖关系,以便其他服务在此之后停止。
这样,如果您的负载均衡器每秒检查一次服务器是否启动并直接应答,则当从Google发送信号以停止实例时,lb几乎立即将其从可能的目标中删除,正在进行的请求将正常完成,然后服务器应干净地停止。这样,您应该几乎不会丢失任何请求。