Мы работаем с сайтом Rails 5.1, который использует конвейер активов для создания хэшированных (отпечатанных) активов при развертывании. Для оптимизации производительности наши активы генерируются с серверов и затем кэшируются в AWS Cloudfront при первом запросе.
Когда мы разворачиваемся, мы делаем последовательное развертывание. Мы запускаем новые серверы с новым кодом и завершаем работу со старым кодом, когда новые приходят в онлайн. В любой момент во время развертывания, если поступает запрос на актив, любой из серверов (новых или старых) может ответить на запрос, поскольку все они находятся на одном и том же балансировщике нагрузки приложений AWS.
Например, у нас есть два файла активов:
- admin-2d1d6c00a49c.js (генерируется из старого коммита)
- admin-aac83de85860.js (создается при развертывании из нового коммита)
Если поступит запрос для admin-aac83de85860.js, и более старый сервер примет запрос, он не найдет ресурс, вернет 400, а затем этот кэш ответа. Это означает, что все будущие запросы для admin-aac83de85860.js возвращают 400, даже если файл есть на новых серверах.
Как мы можем либо кэшировать оба набора ресурсов в AWS Cloudfront, либо направлять трафик только для новых активов на новые серверы, добавляемые в пул?