механизм онлайн-обновления для приложения c ++ SERVER - PullRequest
1 голос
/ 12 сентября 2010

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

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


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


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


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


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

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

Ответы [ 2 ]

1 голос
/ 12 сентября 2010

Вот идея:

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

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

0 голосов
/ 15 сентября 2010

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

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

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

...