механизм онлайн-обновления СЕРВЕРНОГО приложения на c ++

StackOverflow https://stackoverflow.com/questions/3693279

  •  02-10-2019
  •  | 
  •  

Вопрос

Не удалось найти ничего по этой теме.

У меня есть серверное приложение Windows TCP C ++, которое я хочу время от времени обновлять.


Как вы, очевидно, понимаете, это создает проблему - сервер должен работать 24/7 с точки зрения пользователей.
При обновлении также желательно сохранить текущие TCP-соединения с пользователями.


Я думал об модуля как системы, так например гнездо модуля обработки будет находиться в "sockets.dll" логика сервера будут находиться в "logic.dll".
Использование такого подхода похоже на открытие ящика Пандоры;
- Как я буду производить фактическую "замену" модулей?Представьте, что рабочие потоки X продолжают отправлять данные из одного модуля в другой - при замене мне понадобится (легкий и быстрый) способ остановить / приостановить их;может быть, сигналы?
- Версия протокола или даже сигнатура функций могут измениться при обновлении.Как с этим справиться?
- Другие проблемы, такие как незамеченные логические ошибки.
- Кто знает, какие еще проблемы возникнут.


Помимо вышесказанного, у меня есть проблемы, например, как мне обновить, скажем, 10 серверов?Я имею в виду, что все они связаны друг с другом, общаются.
Если обновление внесет модификацию протокола, это может вызвать огромные проблемы, и в таком случае мне нужно будет обновить весь кластер (серверов) в целом;свернуть всю операцию?Это звучит совсем неправильно!Как мне это сделать?Какие концепции я здесь упускаю и как мне их изучить?


Могу ли я что-нибудь с этим сделать?
Что бы вы сделали?Вы делали что-нибудь подобное?
Знаете ли вы о каком-либо механизме / статье / проекте / исходном примере / etc', который решает проблему?

Любой ценный совет высоко ценится!!

Это было полезно?

Решение

Что касается изменений в протоколе, я рекомендую вам обновить свой протокол.В начале соединения между участвующими серверами попросите либо инициатора, либо получателя (я думаю, на самом деле не имеет значения, кого именно) объявить новейшую версию протокола, который он понимает, и затем другая сторона ответит тем же.Они возвращаются к самой новой версии, которую они и то , и другое пойми.

Да, это означает сохранение кода для обеих версий протокола на некоторое время, но вы можете удалить старый код, как только узнаете ВСЕ часть ваших серверов обновлена и работает по новому протоколу.

Предполагая, что у вас также есть контроль над всем возможным клиентским программным обеспечением, вы можете сделать то же самое со своими клиентами.Конечно, это может повлечь за собой более длительное поддержание старого кода протокола, если у вас нет контроля над обновлением пользователей.

Другие советы

Вот такая идея:

  • Старая версия загружает обновление и запускает его.
  • Старая версия перестает принимать новые подключения, перенаправляя их на обновленную версию (которая прослушивается на другом порту).
  • Старая версия завершает работу, когда она завершает свои подключения.
  • Новая версия обнаруживает, когда старая версия завершает работу, и переключает порты.

По сути, идея состоит в том, чтобы запустить обе версии одновременно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top