Протокол корректного завершения работы
Начиная с версии 2.10.0.
Протокол корректного завершения работы – это механизм, который
помогает предотвратить потерю данных в запросах при получении команды на
завершение работы. Согласно протоколу, при получении сервером команды
os.exit() или сигнала SIGTERM он не завершает работу немедленно.
Вместо этого сервер сначала прекращает принимать новые подключения.
Затем сервер отправляет пакеты завершения работы всем подключениям,
поддерживающим протокол корректного завершения работы. Получив
уведомление о предстоящем завершении работы сервера, клиент прекращает
обработку новых запросов и ожидает завершения активных запросов перед
закрытием подключений. После закрытия всех подключений сервер завершает
работу.
Протокол использует систему подписки на события. Эта возможность
доступна, если сервер поддерживает событие
box.shutdown и IPROTO_WATCH. Подробнее
см. в описании наблюдателей за событиями и
соответствующем разделе протокола Binary Protocol.
Протокол завершения работы действует следующим образом:
- Сначала сервер получает запрос на завершение работы. Это может быть
команда
os.exit()или сигнал SIGTERM. - Затем генерируется событие box.shutdown. Сервер рассылает его всем подписанным удалённым наблюдателям (см. IPROTO_WATCH). А именно, сервер вызывает box.broadcast('box.shutdown', true) из callback-функции триггера box.ctl.on_shutdown(). После этого сервер прекращает принимать новые подключения.
- С этого момента сервер ожидает завершения всех подписанных подключений.
- В это же время клиент получает событие
box.shutdownи корректно завершает подключение. - После закрытия всех подключений сервер останавливается. В противном случае истекает время ожидания, и Tarantool завершает работу немедленно. Необходимое время ожидания можно задать с помощью функции set_on_shutdown_timeout().