Как я могу обновить сервер DataSnap, в то время как клиенты все еще соединены?

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

Пример с переменной экземпляра (не attr_accessor)

class MyClass
  def initialize
    @greeting = "hello"
  end
end

m = MyClass.new
m.greeting #results in the following error:
  #NoMethodError: undefined method `greeting' for #<MyClass:0x007f9e5109c058 @greeting="hello">

Пример с использованием attr_accessor:

class MyClass
  attr_accessor :greeting

  def initialize
    @greeting = "hello"
  end
end

m2 = MyClass.new
m2.greeting = "bonjour" # <-- set the @greeting variable from outside the object
m2.greeting #=> "bonjour"   <-- didn't blow up as attr_accessor makes the variable accessible from outside the object

Надежда, которая проясняет ситуацию.

5
задан mjn 26 October 2010 в 06:31
поделиться

4 ответа

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

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

1
ответ дан 14 December 2019 в 04:46
поделиться

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

6
ответ дан 14 December 2019 в 04:46
поделиться
  1. (необязательно) настроить vmware vSphere, ESX или найти службу хостинга, в которой она уже есть.
  2. Сохраните переменные сеанса в базе данных.
  3. Подготовьте 2 веб-бокса с 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, но это, вероятно, потребует некоторой работы.

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

0
ответ дан 14 December 2019 в 04:46
поделиться

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

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

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

1
ответ дан 14 December 2019 в 04:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: