Google Cloud可抢占实例:在ACPI关闭信号后停止接收请求

时间:2019-03-05 14:58:13

标签: google-cloud-platform google-cloud-load-balancer

我有一项服务,希望在Google Cloud Platform上的可抢占实例上运行。这些实例将位于负载均衡器后面。大多数请求需要不到10秒的时间。

我无法修改服务本身,但是同一图像上有一个nginx实例,位于我可以配置的服务前。

据我所见,在关闭实例前30秒钟,ACPI软关闭信号已发送到实例,这时我希望它停止接收请求。

我可以创建一个shutdown script来重新配置nginx以停止将运行状况检查转发给该服务,而是以拒绝自己的态度进行响应,但这似乎有点不客气,我觉得应该有更好的方法。 (说服务不健康也觉得有点不对劲,它只是想从游泳池中取出来。)

告诉负载均衡器停止向该实例发送请求的合适方法是什么,以便它可以(希望)完成当前请求,然后在不接收任何新请求的情况下关闭该请求?

                             ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
                           ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─  │
                         ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─  │
                          Preemptible instance                  │   │
                         │                                        │
                                                                │   │
                         │                                        │
                                                                │   │
        ┌─────────┐      │   ┌─────────┐           ┌─────────┐    │
        │  Load   │          │         │  /health  │  some   │  │   │
   ────▶│balancer │──────┼──▶│  nginx  │──────────▶│ service │    │
        │         │          │         │   /api/…  │         │  │   │
        └─────────┘      │   └─────────┘           └─────────┘    │
                                                                │   │
                         │                                        │
                                                                │   │
                         │                                        │─
                                                                │─
                         └ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─

1 个答案:

答案 0 :(得分:0)

这个答案比“它是更好的解决方案”更多地是“我会做的”,但是,如果健康检查确实可以很快地回答,那么它就可以工作。

我知道在削减请求之前它来自哪里,这样您就不会在中间削减正在进行的请求并超时了。这已经通过正常停止服务来实现。

如果服务处于正常停止状态,它将停止接收请求,但在停止之前等待当前请求完成,然后再对其他服务创建一个对nginx服务的依赖关系,以便其他服务在此之后停止。

这样,如果您的负载均衡器每秒检查一次服务器是否启动并直接应答,则当从Google发送信号以停止实例时,lb几乎立即将其从可能的目标中删除,正在进行的请求将正常完成,然后服务器应干净地停止。这样,您应该几乎不会丢失任何请求。