Ответ 1
Все это делается с внешним веб-сервером, который слушает мир (я рекомендую nginx или lighttpd).
Что касается ограничений скорости, nginx может ограничивать, то есть 50 req/minute на каждый IP, на всем протяжении получить страницу 503, которую вы можете настроить.
Что касается ожидаемого временного снижения, то в мире рельсов это делается с помощью специальной страницы maintainance.html. Существует какая-то автоматизация, которая создает или символизирует этот файл, когда серверы приложений rails снижаются. Я бы рекомендовал полагаться не на присутствие файлов, а на фактическую доступность сервера приложений.
Но вы действительно можете запускать/останавливать службы, не теряя при этом никаких соединений. То есть вы можете запускать отдельный экземпляр сервера приложений на другом сокете/IP-порту UNIX и иметь балансировщик (nginx/lighty/haproxy), который также использует этот новый экземпляр. Затем вы закрываете старый экземпляр, и все клиенты обслуживаются только с новым. Никакое соединение не потеряно. Конечно, этот сценарий не всегда возможен, зависит от типа изменения, внесенного вами в новую версию.
haproxy - это решение только для балансировки. Он может чрезвычайно эффективно балансировать запросы на серверы приложений в вашей ферме.
Для довольно большого сервиса вы получаете что-то вроде:
- api.domain, разрешающая циклические N балансировщики
- каждый балансир запрашивает запросы к веб-серверам M для статических и P-серверов приложений для динамического контента. О, ну, у вашего REST API нет статических файлов, не так ли?
Для довольно небольшого обслуживания (до 2 Кбит/с) вся балансировка выполняется внутри одного-двух веб-серверов.