Сообщения MSMQ, привязанные к кластерному экземпляру MSMQ, застревают в исходящих очередях. - PullRequest
7 голосов
/ 06 октября 2010

Мы создали кластеризованный MSMQ для набора сервисов NServiceBus, и все работает отлично, пока не работает.Исходящие очереди на одном сервере начинают заполняться, и довольно скоро вся система зависает.

Подробнее:

У нас есть кластерный MSMQ между серверами N1 и N2.Другими кластерными ресурсами являются только сервисы, которые работают непосредственно в кластеризованных очередях как локальные, то есть дистрибьюторы NServiceBus.

Все рабочие процессы живут на отдельных серверах, Services3 и Services4.

Для тех, кто не знакомNServiceBus, работа переходит в кластерную очередь работ, управляемую дистрибьютором.Рабочие приложения в Service3 и Services4 отправляют сообщения «Я готов к работе» в кластеризованную очередь управления, управляемую одним и тем же распространителем, и распространитель отвечает отправкой единицы работы во входную очередь рабочего процесса.

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

Clustered MSMQ Outgoing Queues in Hung State

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

Clustered MSMQ Outgoing Queues After Failover

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

Ответы [ 3 ]

2 голосов
/ 08 ноября 2010

Возможно, ваши серверы были клонированы и, таким образом, имеют один и тот же идентификатор администратора очередей (QMId).

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

Ознакомьтесь с объяснением и решением в этом блоге: http://blogs.msdn.com/b/johnbreakwell/archive/2007/02/06/msmq-prefers-to-be-unique.aspx

2 голосов
/ 22 декабря 2011

Спустя год кажется, что наша проблема решена.Основные выводы выглядят следующим образом:

  • Убедитесь, что у вас есть надежная система DNS, поэтому, когда MSMQ необходимо разрешить хост, он может.
  • Создать только один кластеризованный экземпляр MSMQ вотказоустойчивый кластер Windows.

Когда мы настраивали отказоустойчивый кластер Windows, мы предполагали, что было бы плохо «тратить» ресурсы на неактивном узле, и, таким образом, имея два квази-связанныхКластеры NServiceBus в то время, мы создали кластеризованный экземпляр MSMQ для Project1 и еще один кластеризованный экземпляр MSMQ для Project2.Мы полагали, что большую часть времени мы будем запускать их на отдельных узлах, а во время обслуживания окна будут располагаться на одном узле.В конце концов, это была установка, которую мы создали для наших первичных и разработанных экземпляров SQL Server 2008, и это работало довольно хорошо.

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

Я спросил Уди Дахана (автор NServiceBus) об этой стратегии кластерного хостинга, и он дал мне озадаченное выражение и спросил"Почему вы хотите сделать что-то подобное?"На самом деле, Дистрибьютор очень легкий, поэтому нет особой причины равномерно распределять их среди доступных узлов.

После этого мы решили взять все, что узнали, и воссоздать новыйОтказоустойчивый кластер только с одним экземпляром MSMQ .Мы не видели проблему с тех пор.Конечно, убедиться, что эта проблема решена, было бы отрицательно и, следовательно, невозможно.Это не было проблемой в течение по крайней мере 6 месяцев, но кто знает, я полагаю, что это может закончиться завтра!Будем надеяться, что нет.

1 голос
/ 13 октября 2010

Как ваши конечные точки настроены на сохранение своих подписок?

Что если одна (или более) из вашей службы обнаружит ошибку и будет перезапущена Failoverclustermanager? В этом случае эта служба никогда не получит одно сообщение «Я готов к работе» от других служб.

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

Чтобы проверить это поведение, выполните следующие действия.

  1. Остановите и перезапустите все ваши службы.
  2. Остановите только одну из служб.
  3. Перезапустите остановленную службу.
  4. Если ваша система не зависает, повторяйте это для каждой отдельной службы.

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

...