Поведение балансировщика нагрузки GCP с завершающими вытесняющими экземплярами - PullRequest
0 голосов
/ 03 декабря 2018

Фон

У нас есть группа экземпляров диспетчера, которая получает около 700 запросов в секунду на активную виртуальную машину.Этот диспетчер находится за балансировщиком нагрузки, который автоматически масштабируется.Пока что все наши виртуальные машины являются обычными виртуальными машинами, однако мы изучали возможность сделать их упреждающими.

Проблема с упреждающими экземплярами

В соответствии с документацией GCP может завершить приоритетный экземпляр в в любое время .

Предположим, что у каждой диспетчерской виртуальной машины нет состояния.Он получает запрос, обрабатывает его и отправляет HTTP-запрос на другой компьютер.

В любой момент времени каждая виртуальная машина будет обрабатывать около 700 запросов одновременно, получая данные от балансировщика нагрузки.

Вопрос

Что произойдет, если моя приоритетная виртуальная машина обрабатывает700 запросов, получает сигнал на прекращение?

Ну, теоретически у нас должен быть скрипт завершения работы , который гарантирует, что обработка этих запросов завершается, а затем убивает приложение (чистый выход).Это приводит нас к большому вопросу:

  • Но знает ли балансировщик нагрузки, что моя виртуальная машина выключается?Будет ли он продолжать отправлять запросы на завершающую ВМ?

Соображения

Если да, то это означает, что некоторые запросы завершатся с ошибкой , поскольку после закрытия приложениямашина все еще работает, а балансировщик нагрузки продолжает отправлять запросы на машину, не зная, что приложение уже выключено.

В идеале эти запросы должны возвращаться как сбойные запросы к балансировщику нагрузки и отправлять запросы на другой компьютер.Однако балансировщики нагрузки GCP недостаточно умны, чтобы делать это, и поэтому не делают этого.

Если каким-то образом балансировщик нагрузки знает, что эта виртуальная машина была выбрана для преждевременного завершения, то ничего особенного делать не нужно.

Какой это?

Ответы [ 2 ]

0 голосов
/ 15 марта 2019

У нас была похожая проблема.Мы почти решили эту проблему с помощью проверок работоспособности балансировщика нагрузки (с некоторыми проблемами в состоянии очень высокой нагрузки).Трюк теперь находится в пределах 10-15 секунд после сигнала упреждения, балансировщик нагрузки помечает экземпляр как нездоровый, поскольку прекращает отправку новых запросов к этому экземпляру.

Решение:

  1. Балансировщик нагрузки проверяет работоспособность экземпляра каждые 3 секунды и помечает экземпляр как неисправный после третьей проверки работоспособности. Таким образом, балансировщик нагрузки помечает экземпляр примерно через 10 секунд и прекращает отправку нового запроса.
  2. Сигнал предупреждения прерывания в Java с использованием ContextCloseEvent (Spring boot) или Runtime.getRuntime().addShutdownHook() (в моем случае потребовалось несколько секунд, чтобы сигнал был получен JVM)
  3. Установить проверки работоспособности как неудачные, т.е. конечную точку проверки работоспособностиначнет возвращать 404.
  4. Сон в блоке выключения на 15-25 секунд, чтобы позволить текущему процессу и новым запросам завершить
  5. Освободить ресурсы и выполнить ведение журнала выключения.

    
    @EventListener
    public void onShutdown(ContextClosedEvent event) {
    
    <pre><code>log.warn("shutdown event received {}", event.getSource().toString());
    log.warn("/ping will respond 404, Main thread will sleep for 20 seconds to allow pending tasks to complete");
    
    isShuttingDown = true;
    try {
        Thread.sleep(SLEEP_BEFORE_SHUTDOWN_MILLIS);
    } catch (InterruptedException e) {
        log.error("sleep before shutdown interrupted", e);
    }
    
    log.warn("Shutting down now, daemon threads will continue work");
    releaseResources(); 
    
    log.info("{} {} on {} stopped.", NAME, VERSION, HOSTNAME);
    
    } // конечная точка работоспособности @RequestMapping (value = "ping", производит = MediaType.TEXT_PLAIN_VALUE) public ResponseEntity ping () {if (isShuttingDown ()) {log.warn ("сбой работоспособности - завершение работы скоро");вернуть новый ResponseEntity (HttpStatus.NOT_FOUND);} return ResponseEntity.ok ("pong");}
0 голосов
/ 03 декабря 2018

Но знает ли балансировщик нагрузки, что моя виртуальная машина выключается?Будет ли он продолжать посылать запросы на завершающую ВМ?

Да, балансировщик нагрузки будет продолжать отправлять запросы к экземпляру.

Вам потребуется создать сценарий завершения работы и удалитьЭкземпляр из балансировщика нагрузки.

Дело не в том, что балансировщик нагрузки недостаточно умен.Балансировщик нагрузки не знает, можно ли повторить ваши запросы.Это решение должно приниматься логикой клиент / бэкэнд.

Ваш вариант использования не является хорошим примером для вытесняющих экземпляров.Упреждающие экземпляры будут прекращаться каждые 24 часа.Если ваша цель - экономия средств, сравните стоимость долгосрочного ценообразования с упреждающим ценообразованием.Экономия недостаточна для оправдания затрат на проектирование, тестирование и контроль качества.

Архитектуры должны быть рассчитаны на отказ, но я бы не стал специально выбирать архитектуру, которая будет постоянно выходить из строя.В вашем случае каждые 24 часа.Существует также риск того, что вы не сможете запустить другой экземпляр, чтобы компенсировать возросшую нагрузку.И есть риск, что все ваши экземпляры будут прекращены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...