Изящное завершение работы на CF для приложения с отслеживанием состояния
У меня есть игровое приложение с отслеживанием состояния, развернутое в Cloud Foundry. Если я обновляю приложение, мне нужно корректно завершить работу, т. Е. Старую версию не следует останавливать, пока все запущенные игры не будут завершены. Согласно документам CF , при выдаче приложению дается только 10 секунд для завершения работы после отправки SIGTERM, прежде чем приложение будет убито с помощью SIGKILL. В моем случае это не работает.
Я думал о том, чтобы поместить состояние в sth, например DB или Redis, а затем выполнить горячую замену запущенных игр на новый экземпляр приложения, но, поскольку я активно использую веб-сокеты, это, похоже, создает больше проблем, чем решает, потому что это также разорвать существующие связи.
Другое решение - не отправлять
cf stop
, но вместо этого добавьте в мое приложение конечную точку операций, например
POST /api/admin/stop
, из-за чего приложение перестает принимать новые игры, а затем закрывается после завершения всех запущенных игр.
Третий вариант может заключаться в том, чтобы полностью изменить дизайн и использовать sth, например WebRTC, в качестве протокола, что означает, что приложение будет обслуживать только статические ресурсы, но больше не имеет активной роли в запущенных играх, потому что все клиенты затем подключаются друг к другу напрямую. через сервер. Однако у меня нет опыта работы с WebRTC, и мне интересно, работает ли решение надежно, например, если некоторые пользователи используют VPN.
Сейчас я за второй вариант. Но должно ли быть так, что CF-приложение может завершать свою работу? И если да, то как это сделать чисто?
Или есть еще варианты? Какое лучшее решение?
1 ответ
Согласно документам CF, при выдаче cf stop приложению дается только 10 секунд для завершения работы после отправки SIGTERM, прежде чем приложение будет убито с помощью SIGKILL. В моем случае это не работает.
Это ожидаемое поведение. Если вы этого не видите, вам стоит вникнуть в вещи более внимательно. Вы не упомянули язык / фреймворки, которые вы используете, и некоторые языки упрощают, а некоторые затрудняют обработку сигналов (некоторые даже обрабатывают их по умолчанию).
Я бы предложил следующее:
Вы хотели бы изучить специфику языка вашего приложения и посмотреть, как обрабатывать сигналы. Убедитесь, что вы правильно реализуете это в своем приложении. Даже в языках, которые обрабатывают сигналы автоматически, вам все равно потребуется привязка к какой-то ловушке выключения, чтобы вы могли выполнить свой собственный код выключения и сохранить свое состояние.
Вам нужно поймать сигнал и обработать его как можно быстрее. Вы получаете только 10 секунд до отправки SIGKILL, а затем ваше приложение завершается.
Я бы посоветовал написать тривиальное примерное приложение, которое обрабатывает сигналы, вы можете регистрировать, когда сигнал будет пойман, и поэкспериментировать с паузами на разную продолжительность, чтобы увидеть, как все обрабатывается платформой. Это также полезно, потому что 10 секунд - это просто значение по умолчанию для того, как долго платформа будет ждать. Оператор вашей платформы может изменить это значение, поэтому оно потенциально может быть короче или длиннее. Выполнение подобного теста позволит вам проверить и найти точное значение, установленное вашим оператором.
Я думал о том, чтобы поместить состояние в sth, например DB или Redis, а затем выполнить горячую замену запущенных игр на новый экземпляр приложения, но, поскольку я активно использую веб-сокеты, это, похоже, создает больше проблем, чем решает, потому что это также разорвать существующие связи.
У меня не так много комментариев по архитектуре вашего приложения, поскольку я недостаточно знаю о том, что вы делаете, чтобы делать обоснованные комментарии, кроме следующей заметки.
При работе на CF вы хотите попробовать и использовать сервисы для максимально возможного количества состояний. Не записывайте на локальный диск и старайтесь, чтобы у вас были такие вещи, как состояние сеанса, хранящееся в надежном кеше (например, Redis).
Экземпляры приложений могут быть отключены по ряду причин. Один из них - если вы бежите
cf stop
, но они также могут быть отключены, если ваша группа по эксплуатации платформы выполняет обновления или если Diego Cell (где находятся контейнеры вашего приложения) дает сбой. Вы не можете контролировать некоторые из причин, по которым ваше приложение будет закрыто, поэтому при проектировании необходимо учитывать это.
Ключевые моменты, о которых следует помнить: а.) Если у вас несколько экземпляров, платформа гарантирует, что у вас всегда будет хотя бы один запущенный, и б.) С учетом а.) Вам необходимо иметь возможность балансировать запросы между несколькими экземплярами приложения. Если вы можете управлять этими двумя элементами, ваше приложение должно хорошо работать на CF.