Повторное подключение при отказе TIBCO EMS для C # (TIBCO.EMS.dll)

У нас есть решение TIBCO EMS, которое использует встроенное аварийное переключение серверов в среде с 2–4 серверами. Если TIBCO управляет услугами переключения при отказе с одного сервера EMS на другой, предполагается, что соединения будут автоматически передаваться на новый сервер на уровне обслуживания EMS. Для наших приложений C #, использующих службу EMS, этого не происходит - наши пользовательские подключения не передаются на новый сервер после отработки отказа, и мы не знаем, почему.

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

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

Любые идеи? Мы используем TIBCO.EMS.dll версии 4.4.2 и .Net 2.x (приложение SmartClient)

Любая помощь будет оценена.


person ScottCher    schedule 09.10.2008    source источник
comment
Как вы сейчас реализуете отказоустойчивость? На сервере в файле «factoryies.conf»? Содержит ли ваше свойство 'url' список URL-адресов, разделенных запятыми, указанных в 'tib_ems_dotnet_ref.pdf' на стр. 134?   -  person Anthony Mastrean    schedule 17.10.2008
comment
Да, и в этом, хотите верьте, хотите нет, и есть проблема. Соединения должны передаваться с одного сервера на другой при отказе сервера EMS. Это должно работать, если у вас есть список серверов EMS с разделителями в строке подключения, но я считаю, что в EMS.lib есть ошибка, из-за которой он не работает   -  person ScottCher    schedule 17.10.2008
comment
Выдается ли прослушивателем ошибка после отработки отказа? Выдается ли ошибка производителями после отработки отказа (при отправке сообщения)? Скорее всего, библиотека ожидает повторного подключения. Наличие нескольких серверов в строке подключения позволяет выполнять циклический перебор во время подключения - не позже ...   -  person TheSoftwareJedi    schedule 17.10.2008
comment
Я не решаюсь погрузиться в решение клиентского программирования, если мы не уверены, что именно делает сервер. Можете ли вы предоставить дополнительную информацию о том, как и когда вы знаете, что аварийное переключение не работает? (примечание: уведомление об отказе клиента - руководство пользователя tib ems, стр. 292, ссылка на tib dotnet, стр. 220).   -  person Anthony Mastrean    schedule 17.10.2008
comment
ConnectionAttempts устанавливает количество повторных попыток подключения клиента к серверу. ReconnectAttempts устанавливает, сколько раз клиент будет пытаться повторно подключиться после отключения сети. Похоже, что никто из них не делает того, что говорит. Да, у нас есть исключения при публикации.   -  person ScottCher    schedule 17.10.2008
comment
ajmastrean наши клиенты, вероятно, не получают уведомления. Они в основном подписываются на сообщения и нечасто публикуют их (фактически, только когда мы говорим им об этом удаленно через EMS). Сервер - это то, что вызывает проблему - когда они переключаются на другой сервер, клиенты отключаются   -  person ScottCher    schedule 17.10.2008
comment
Скотт, (давайте получим четкое представление о env) 1. Если это не сделано, настройте ваш клиент на получение уведомления о переключении с сервера (см. Страницы, отмеченные в моем предыдущем комментарии) 2. Настройте ваше соединение, чтобы иметь ExceptionListener 3. Убедитесь, что EMSException содержит URL-адрес резервного сервера.   -  person Anthony Mastrean    schedule 17.10.2008
comment
ajmastrean Я провожу тест, чтобы убедиться, что он циклически переключается между серверами.   -  person ScottCher    schedule 17.10.2008


Ответы (3)


Этот пост должен суммировать мои текущие комментарии и более подробно объяснить мой подход ...

Типы TIBCO «ConnectionFactory» и «Connection» - это тяжелые, ориентированные на потоки типы. TIBCO рекомендует использовать одну фабрику соединений (для каждого сервера, настроенную на заводе) и одно соединение для каждой фабрики.

Сервер также кажется ответственным за аварийное переключение и повторное подключение на месте, поэтому давайте подтвердим, что он выполняет свою работу, а затем положимся на эту функцию.

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

Вам придется управлять поиском объектов соединения / сеанса и сходить с ума, повторно инициализируя всех! или реализовать какой-то обработчик событий сбоя сеанса, который может получить новое соединение и переподключить их.

Итак, пока давайте углубимся и посмотрим, настроен ли клиент для получения уведомлений о переключении при отказе (руководство пользователя tib ems, стр. 292). И убедитесь, что возникшее исключение перехвачено, содержит URL-адрес отработки отказа и правильно обрабатывается.

person Anthony Mastrean    schedule 16.10.2008
comment
Я настроил Tibems.SetExceptionOnFTSwitch (true), поэтому теперь я вижу, когда наше соединение не работает. Мы еще не смогли протестировать настройку аварийного переключения, но я получаю исключения, когда соединение разрывается. Однако встроенное переподключение не работает, когда сервер возвращается. - person ScottCher; 24.10.2008
comment
Мы проверили тактовые импульсы сервер-клиент и клиент-сервер. Они были отключены в тестовой среде, и я подумал, что это может быть причиной того, что повторное подключение не работает. Включено, установлено 10 с, и мы по-прежнему не получаем попыток переподключения. - person ScottCher; 24.10.2008
comment
Тот факт, что я могу перехватить сбой подключения к серверу, является хорошим признаком, но я бы предпочел, чтобы логика переподключения из библиотеки EMS выполняла свою работу, чем приходилось повторять попытки переподключения вручную. - person ScottCher; 24.10.2008
comment
Я в похожей ситуации. Я реорганизую старую систему обмена сообщениями, которая выполняла бесконечные циклы, пытаясь повторно инициализировать экземпляр Connection ... Я надеюсь уйти от этого. Однако у меня не так много практических знаний, я в основном работал с документами TIBCO. - person Anthony Mastrean; 24.10.2008
comment
ajmastream означает, конечно, что у вас есть доступ к документам. Мне в основном приходилось просить, чтобы получить доступ. Они были заблокированы на сетевом диске, поэтому я даже не мог их прочитать - я летал вслепую в EMS с тех пор, как мы начали внедрять их. - person ScottCher; 24.10.2008
comment
Я опубликую здесь, если у TIBCO есть что сказать по этому поводу - наш администратор TIB помещает сообщение о проблеме, включая часть моего кода - или если мы решим проблему каким-либо другим способом. Спасибо за вашу помощь. - person ScottCher; 24.10.2008

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

ОДИН: ConnectionFactory.SetReconnAttemptCount, SetReconnAttemptDelay, SetReconnAttemptTimeout должны быть установлены соответствующим образом. Я думаю, что значения по умолчанию повторяются слишком быстро (порядка 1/2 секунды между повторными попытками). Нашим серверам EMS может потребоваться много времени для переключения при отказе из-за сетевого хранилища и т. Д., Поэтому 5 попыток с интервалом в 1/2 секунды - это далеко не достаточно.

ВТОРОЙ: Я считаю важным включить тактовые импульсы клиент-сервер и сервер-клиент. Не удалось проверить, но без них клиент может не получить уведомление о том, что сервер отключен или переключается в режим аварийного переключения. Это, конечно, настройка EMS на стороне сервера.

ТРИ: вы можете отслеживать событие аварийного переключения, установив Tibems.SetExceptionOnFTSwitch (true); а затем подключите обработчик событий исключения. В среде с одним сервером вы увидите сообщение «Соединение было прервано». Однако, если вы находитесь в отказоустойчивой многосерверной среде, вы увидите следующее: «Соединение выполнило отказоустойчивое переключение на». Это уведомление не обязательно, но оно может быть полезно (особенно при тестировании).

ЧЕТВЕРТАЯ: В документации EMS явно неясно, повторное подключение НЕ будет работать в среде с одним сервером. Вам необходимо работать в многосерверной отказоустойчивой среде. Однако есть одна хитрость. Вы можете добавить один и тот же сервер в список подключений дважды - странно, я знаю, но он работает и позволяет встроенной логике повторного подключения.

какой-то код:

private void initEMS()
{
    Tibems.SetExceptionOnFTSwitch(true);
    _ConnectionFactory = new TIBCO.EMS.TopicConnectionFactory(<server>);
    _ConnectionFactory.SetReconnAttemptCount(30);       // 30retries
    _ConnectionFactory.SetReconnAttemptDelay(120000);   // 2minutes
    _ConnectionFactory.SetReconnAttemptTimeout(2000);   // 2seconds
_Connection = _ConnectionFactory.CreateTopicConnectionM(<username>, <password>);
    _Connection.ExceptionHandler += new EMSExceptionHandler(_Connection_ExceptionHandler);
}
private void _Connection_ExceptionHandler(object sender, EMSExceptionEventArgs args)
{
    EMSException e = args.Exception;
    // args.Exception = "Connection has been terminated" -- single server failure
    // args.Exception = "Connection has performed fault-tolerant switch to <server url>" -- fault-tolerant multi-server
    MessageBox.Show(e.ToString());
}
person ScottCher    schedule 24.10.2008

Клиентские приложения могут получать уведомление об отказе, задав системное свойство tibco.tibjms.ft.switch.exception

Возможно, это нужно библиотеке для работы?

person TheSoftwareJedi    schedule 16.10.2008