Экстремальные экземпляры Google Cloud: прекращать прием запросов после сигнала отключения ACPI
У меня есть сервис, который я хочу запускать на приоритетных экземплярах в Google Cloud Platform. Экземпляры будут жить за балансировщиком нагрузки. Для обработки большинства запросов требуется менее 10 секунд.
Я не могу изменить сам сервис, но на том же образе есть экземпляр nginx, который находится перед сервисом, который я могу настроить.
Насколько я вижу, сигнал мягкого выключения ACPI отправляется экземпляру за 30 секунд до его выключения, и в этот момент я бы хотел, чтобы он прекратил получать запросы.
Я мог бы создать скрипт завершения работы, который перенастраивает nginx, чтобы он прекратил пересылать проверки работоспособности в службу, и вместо этого отвечал бы большими пальцами вниз, но это кажется немного странным, и я чувствую, что должен быть лучший способ. (Также немного неправильно говорить, что служба не здорова - она просто хочет, чтобы ее вынули из пула.)
Как правильно настроить балансировщик нагрузки, чтобы он прекратил отправлять запросы этому экземпляру, чтобы он (надеюсь) выполнял свои текущие запросы, а затем завершал работу, не получая новых запросов за это время?
┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │
┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │
Preemptible instance │ │
│ │
│ │
│ │
│ │
┌─────────┐ │ ┌─────────┐ ┌─────────┐ │
│ Load │ │ │ /health │ some │ │ │
────▶│balancer │──────┼──▶│ nginx │──────────▶│ service │ │
│ │ │ │ /api/… │ │ │ │
└─────────┘ │ └─────────┘ └─────────┘ │
│ │
│ │
│ │
│ │─
│─
└ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
1 ответ
Этот ответ скорее "то, что я хотел бы", чем "это лучшее решение", но это работает, если проверка работоспособности действительно быстрая.
Я понимаю, откуда вы пришли с идеей обрезать запрос до того, как он остановится, таким образом, вы не будете обрезать текущий запрос посередине и отвечать с тайм-аутом. Это уже реализовано с изящной остановкой сервисов.
Если служба находится в грациозной остановке, она прекратит принимать запрос, но дождется завершения текущего запроса, прежде чем остановить, создаст зависимость для службы nginx от службы других, чтобы они могли ее остановить после нее.
Таким образом, если ваш балансировщик нагрузки проверяет каждую секунду, работает ли сервер и отвечает ли он напрямую, когда отправляется сигнал от google о прекращении работы экземпляра, lb удалит его из возможной цели почти сразу, текущие запросы закончатся нормально и тогда сервер должен остановиться чисто. Таким образом, вы должны иметь почти ни одного потерянного запроса.