MSMQ: Сообщения иногда не отправляются или получаются без ошибок

StackOverflow https://stackoverflow.com//questions/25012144

  •  20-12-2019
  •  | 
  •  

Вопрос

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

Настройка

У меня есть 3 сбалансированных нагрузки веб-серверов (позволяет называть их серверами W1 , w3 и w3 ) и 1 сервер, который обрабатывает определенные события / Данные вдали от веб-запросов (которые я позвоню P ). Все 3 веб-сервера, как только конкретное событие происходит в веб-приложении, отправит сообщение на удаленную личную очередь на сервере P , что затем обработает каждое сообщение из очереди и выполняет некоторые задача.

Проблема

По большей части - при угадке 95% времени - все работает нормально, но иногда сервер P не принимает сообщения с веб-серверов. Это либо потому, что w1 , w2 или w3 не отправляет их, либо они не принимаются p , Я просто не могу сказать. Это означает, что мне не хватает жизненно важных событий, происходящих от пользователей в веб-приложении, но я не могу найти какие-либо ошибки, перечисленные в моих собственных журналах.

Детали

Вот все детали, которые я могу подумать, что может помочь объяснить мою настройку и то, что я понял до сих пор:

    .
  • Частная очередь на сервере P не транзакционная.
  • Частная очередь имеет настройки разрешений для каждого для отправки, так и приема сообщений.
  • Это код, который я использую (C #), чтобы отправить сообщение на удаленную личную очередь:

    var queue = new MessageQueue(@"FormatName:DIRECT=OS:ServerP\PRIVATE$\MyMessageQueue");
    
    var defaultProperties = queue.DefaultPropertiesToSend;
    defaultProperties.AcknowledgeType = AcknowledgeTypes.FullReachQueue | AcknowledgeTypes.FullReceive;
    defaultProperties.Recoverable = true;
    defaultProperties.UseDeadLetterQueue = true;
    defaultProperties.UseJournalQueue = true;
    
    queue.Send(requestData);
    
  • Отправка сообщения, используя код выше, не отображается исключение - если это сделал мой обработчик ошибок в веб-приложении, поймал бы и записал его, поэтому я предполагаю, что он отправляется.

  • Есть исходящие очереди на w1 , w2 и w3 все, указывая на частную очередь на p - Все это пусто.
  • на w1 , w2 и w3 Я не могу видеть никаких «мертвых» сообщений.
  • на p Частный очередь пуста, поэтому сообщения обрабатываются (что я могу проверить из моей базы данных).
  • на p нет «мертвых» сообщений. Есть журнальные сообщения, но они, кажется, не соответствуют никакой недавней дате / раз.
  • Все серверы работают Windows Server 2012.

Большая часть временных сообщений отправляется, получена и обработана просто хорошо, но, без какого-либо шаблона, не видимого мне, иногда они нет. Кто-нибудь может увидеть, что идет не так? Или объясните мне, как я могу попытаться выяснить, что происходит?

Это было полезно?

Решение

Вы уверены, что приемник на P не сбивается / не проигрывает сообщение как-то?Потому что ваша очередь не является транзакционной, если какая-то обработка не удается, это одно потерянное сообщение.

Во всяком случае, есть много возможных причин, почему это может потерпеть неудачу. Какое у вас журнал (отладка / информационные уровни)?

Я думаю, что следующее поможет отслеживать проблему:

  1. Когда событие генерируется в веб-приложении.
  2. прямо перед отправкой события из веб-приложения через msmq.
  3. в ресивере, когда вы получите сообщение из очереди.
  4. Таким образом, вы могли бы, по крайней мере, соответствовать отправленным сообщениям к полученным сообщениям и обработанию сообщений.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top