Как я могу обновить сервер DataSnap, пока клиенты еще подключены? - PullRequest
5 голосов
/ 03 июня 2009

Мы используем серверы DataSnap с сохранением состояния для некоторых задач бизнес-логики, а также для предоставления данных набора данных клиента.

Если нам нужно обновить сервер для изменения бизнес-правила, мы копируем новую версию в новую пустую папку и регистрируем ее (в зависимости от версии Delphi, просто запустив или запустив утилиту TRegSvr).

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

Есть ли способ направлять все новые клиентские подключения на новый сервер сразу после регистрации?

(я знаю, что подписи нового или измененного метода также потребуют изменения и перезапуска клиентов, но этот вопрос касается внутренних изменений, которые не влияют на интерфейс)

Мы используем соединения Socket, и все клиенты используют одно и то же серверное приложение (открыто только одно окно приложения). В первые дни мы использовали другую конфигурацию удаленного модуля данных, что привело к одному окну приложения для каждого клиента. Может быть, это может быть решением? (потому что каждый новый клиент запускает зарегистрированный на данный момент исполняемый файл)

Обновление: предлагает ли Delphi XE некоторую поддержку для «горячего развертывания» (обновленных серверов)? В настоящее время мы используем Delphi 2009, но обновимся до XE, если он предложит более простую реализацию «горячего развертывания».

Ответы [ 6 ]

6 голосов
/ 09 июня 2009

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

1 голос
/ 11 июня 2009

Вероятно, нет простого ответа на этот вопрос, и я подозреваю, что вам придется изменить клиента. Самое простое решение, о котором я могу подумать, - это иметь на сервере флаг (свойство или выходной параметр какого-либо обычно называемого метода), который клиент периодически проверяет, который сообщает клиенту о необходимости разъединения и повторного соединения (что-то вроде ImBeingRetired).

Также возможно написать обратные вызовы при определенных обстоятельствах для datasnap (хотя я никогда не делал этого). Это позволит серверу информировать клиента о том, что он должен перезагрузить или повторно подключиться.

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

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

1 голос
/ 04 июня 2009

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

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

0 голосов
/ 06 августа 2012

Для более новых версий (Delphi 2010 и выше) есть интересное решение

  • для систем, использующих транспорт HTTP:

Реализация аварийного переключения и балансировки нагрузки в DataSnap 2010. Автор Andreano Lanusse

  • и соответствующий вопрос для транспорта TCP / IP:

Как направить клиентские подключения DataSnap к различным серверам DS?

0 голосов
/ 25 октября 2010

Я сделал нечто подобное, имея конкретную таблицу, в которой была моя «версия данных». Каждый раз, когда я обновляю сервер или изменяю глобальные настройки всей системы, я увеличиваю это поле. Когда клиент запускается, он всегда проверяет это значение и проверяет снова перед любыми транзакциями / запросами. Если значение когда-либо отличалось от того, с которого я начинал, мне нужно было пройти через мою логику повторной инициализации, которая могла легко включать повторный вход в систему на обновленном сервере.

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

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

0 голосов
/ 07 июня 2009
  1. (необязательно), настройте vmware vSphere, ESX или найдите службу хостинга, на которой она уже есть.
  2. Сохранить переменные сеанса в дБ.
  3. Подготовьте 2 веб-бокса с двумя разными IP-адресами и разверните ваши вещи.
  4. Настройте DNS, брандмауэр, балансировщик нагрузки или BSD vm, чтобы имя «example.com» преобразовывалось в веб-окно 1.
  5. Развертывание новой версии в веб-окне 2.
  6. Переключитесь на веб-окно 2, используя любой метод маршрутизации, который вы выбрали.
  7. Разверните новую версию в веб-окне 1, если все выглядит хорошо.

Использование DNS, вероятно, проще всего, но для распространения сопоставления на клиент (если клиент находится за пределами вашей локальной сети) требуется время, а также два клиента могут увидеть разные результаты. Некоторые брандмауэры имеют функцию сопоставления IP-адресов, которая позволяет сопоставлять общедоступный IP-адрес и внутренний IP-адрес. Идеальный способ - использовать балансировщик нагрузки и настроить его на 50:50 и изменить его на 100: 0, если вы хотите выполнить обновление, но это стоит денег. Более дешевой альтернативой является запуск программного балансировщика нагрузки на BSD vm, но, вероятно, это потребует некоторой работы.

Редактировать : Я хотел сказать, что это переменные сеанса, а не сеанс. Вы сказали, что сервер с состоянием. Если он содержит некоторую бизнес-логику, использующую переменную сеанса, его необходимо сохранить во внешнем хранилище, чтобы сохранить его при переподключении во время переключения. Фактический сеанс DataSnap будет потерян, поэтому, когда вы выключаете веб-блок 1 во время обновления, клиент получит ошибку «Session {some-uuid} не найден» веб-блоком 1 и подключится к веб-блоку 2. Также вы можете использовать 3 IP-адреса (1 публичный и 2 приватных), чтобы клиент всегда видел 1 адрес, что является лучшим способом.

...