Я отлаживаю сайт, где наше приложение работает в отказоустойчивом кластере с 3 узлами с кластерной группой MSMQ для организации очереди сообщений. Мы видим, что система работает на некоторых комбинациях узлов, но не на всех, поэтому защита от сбоев не так хороша, как предполагалось.
Проблема заключается в получении сообщений из кластерной очереди.
Когда наше приложение выполняется на узле кластера B или C, оно работает независимо от того, на каком узле работает MSMQ (работает = наше приложение получает сообщения). Когда наше приложение работает на узле A, оно дает сбой из-за недоступности службы очереди сообщений, независимо от того, где запущен MSMQ.
Чтобы еще больше запутать ситуацию, я создал небольшую службу WCF-MQ-прокси с клиентом с графическим интерфейсом, которая позволяет мне отправлять команду службе, которая затем будет отправлять или получать из очереди сообщений, как указано клиентом, и давать как можно больше отзывов в процессе. Шаблон аналогичен этому приложению, за исключением того, что отказавший узел - это узел C - независимо от того, где запущен MSMQ.
Вот что я проверил:
Я всего лишь разработчик, а не специалист по инфраструктуре Microsoft, поэтому я хотел бы спросить: какие шаги рекомендуется предпринять при отладке такой кластерной установки MSMQ?
Итак, после нескольких недель самостоятельной отладки и вместе с командой поддержки Microsoft Message Queue решение было найдено.
TL; DR; решение - удалить или переименовать раздел реестра
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\<SERVICENAME>\Environment
Причина ошибки в том, что клиент MQ не может найти службу MQ в локальной системе - а это необходимо для связи с удаленным MQ - вроде как локальная служба SMTP, пересылающая ваши электронные письма в удаленные системы. Однако в данном случае локальная система является не узлом кластера, а «группой кластера», и в этой группе кластера не работает служба MQ (поскольку это не настоящая система, а просто псевдоним). Причина, по которой клиент MQ ищет службу в группе кластеров, заключается в том, что в настройках службы кластера установлен флажок «Использовать сетевое имя для имени компьютера». Это добавляет новое значение в реестр узлов кластера, устанавливая среду для службы. И настоящая проблема заключается в том, что когда этот флажок снят, он не удаляет значение из реестра, что фактически делает невозможным правильную очистку параметра (из графического интерфейса) после его установки. Таким образом, исправление состоит в том, чтобы удалить значение вручную с помощью regedit или regedt.