MSMQ выбрасывает сообщения, если очередь назначения не существует? - PullRequest
4 голосов
/ 20 ноября 2008

Я столкнулся со странной ситуацией:

Сообщения отправляются с СервераA на СерверB. Он отправляется в исходящую очередь ServerA, а затем отправляется в очередь ServerB.

СерверB потерпел крах. Нам пришлось переформатировать. Когда мы подняли его, мы забыли установить службу MSMQ.

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

Мы заметили ошибку и установили MSMQ Service на ServerB. Сервер A начинает немедленно освобождать свою исходящую очередь.

Когда мы запустили программу для обработки сообщений на сервере B, она не смогла подключиться. Мы узнали, что забыли создать очередь на ServerB. Однако к этому времени было уже слишком поздно. Все 900K сообщений, которые находились в очереди ServerA, были отправлены на ServerB. Из того, что я могу сказать, ServerB выбросил их, потому что он не был настроен с очередью назначения. Я уже знаю, что правильное решение - ОСТАНОВИТЬ очередь на Сервере A до тех пор, пока мы полностью не настроим Сервер B.

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

Ответы [ 3 ]

2 голосов
/ 13 февраля 2009

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

Из документов MSMQ:

http://msdn2.microsoft.com/en-us/library/ms699817.aspx

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

Тема Usenet, обсуждающая это.

1 голос
/ 21 ноября 2008

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

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

Вы можете попросить MSMQ сделать намного больше, если вы хотите лучше справиться со сценарием. Например, вы можете попросить его сохранить копию отправленных сообщений в очереди журнала (а затем при необходимости удалить ее). Или вы можете запросить положительные или отрицательные ACK при доставке сообщений или даже о прочитанных сообщениях. В этих случаях ACK / NACK отправляются в административную очередь по вашему выбору, которую ваше собственное приложение может отслеживать и отвечать.

0 голосов
/ 17 сентября 2013

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

Пример:

var message = new System.Messaging.Message();
message.UseDeadLetterQueue = true;
...