Ответ: Обновление
#2 - посредника, также делаю.
И описал ты в #3, именно его, посредника.
Если это клиентское ПО, то нужен отдельный Updater, который будет делать всю работу, он может также работать как отдельный процесс - подготавливаться к обновлению, но осуществлять его должен вынуждая перезапустить приложение.
Это как в Firefox'е, обновления делать, и других ПО.
Если это серверное ПО, то тут уже сложнее, т.к. серверные системы можно разбить на модули, которые по сути отвечают за разную логику, и работают весьма независимо. Например модули по обработке сетевых пакетов - это могут быть подключаемая динамично библиотека, и используя рефлекцию и спользуемая.
Тут можно замутить динамичную замену длл, но также нужен механизм очереди запросов и т.п. в сам модуль. Это не просто реализовать, т.к. если к примеру это модуль обработки пакетов, то если именно заменять - будет большая очередь образовываться.
Можно подключать новую, перенаправлять все запросы на неё, затем когда старый модуль перестаёт использоваться - отключать.
Но подобные фичи очень не просты в использовании, т.к. требуют весьма мощной архитектуры, и стабильной.
Серверное ПО, также может состоять из отдельных приложений, и использовать внутренние методы коммуникации, например используя отличную библиотеку ZeroMQ, которая для кластерных систем вообще шик.
Таким образом продумать систему коммуникации приложений, и далее дело уже в шляпе, запуск и остановка приложений - и будет их обновлением, при этом при корректной реализации, не мешающим работе сервера.
|