1

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

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

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

我可以创建一个关闭脚本,重新配置 nginx 以停止将健康检查转发到服务,而是用自己的拇指向下响应,但这似乎有点 hacky,我觉得应该有更好的方法。(说服务不健康也有点不对劲——它只是想被从游泳池里拿出来。)

告诉负载均衡器停止向该实例发送请求的适当方法是什么,以便它可以(希望)满足其当前请求,然后在同时没有收到任何新请求的情况下关闭?

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

1 回答 1

0

这个答案更像是“我想要的”而不是“它是更好的解决方案”,但如果健康检查真的很快就能回答,这很有效。

我理解你从哪里来的想法在它停止之前切割请求,这样你就不会在中间切割持续的请求并超时回答。这已经通过服务的优雅停止来实现。

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

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

于 2019-03-05T15:44:24.467 回答