Недавно у нас было приложение Google App Engine, которое не смогло должным образом переключиться при отказе во время планового обслуживания нашего сервера базы данных (размещенного в Aiven).
Во время планового обслуживания сервер БД переключится на заменяющий сервер путем обновления записи DNS. Предполагается, что это произойдет мгновенно, но мы обнаружили, что наше приложение узла, работающее в GAE, вылетало из-за сбоев подключения в течение нескольких минут.
Ошибка подключения воспринимается как серьезная ошибка, поэтому приложение узла закрывается, а затем немедленно заменяется новым процессом путем повторного запуска npm start. Однако этот процесс также не удался, так как он также не мог подключиться и так далее, пока GAE не решила, что сервер является неполноценным, и не заменила его.
К тому времени, когда экземпляры были заменены, похоже, проблема с подключением была решена, но я не понимаю, почему она так долго решалась.
Я подозреваю, что старое имя хоста базы данных могло быть кэшировано и поэтому зависло при попытке подключиться к старому IP.
В качестве работы мне интересно, можно ли очистить кеш DNS в экземпляре движка приложения Google (из экземпляра)?
Я искал документацию о том, как App Engine разрешает DNS, но в итоге попал на страницы о настройке пользовательского или внутреннего DNS.
Подводя итог: наше приложение узла, работающее на GAE, подключается к внешней базе данных и идентифицирует узел с помощью поиска DNS.
Итак, кеш, который мне нужно очистить, - это тот, который кэширует поиск публичной записи DNS. не размещен в Google, но запрашивается приложением GAE.
то есть:
Node GAE App -> { Public Internet } -> Database
Думаю, решением должно быть небольшое изменение архитектуры.
Как PaaS, у вас не слишком много доступа к GAE для выполнения некоторых административных операций.
Зная это, я предлагаю следующие изменения архитектуры:
ИЛИ
ИЛИ