Недавно мой оригинальный вопрос был MSMQ Slow Queue Reading, однако я перешел от этого, и теперь думаю, что я знаю проблему немного понятнее.
Мой код (ну, собственно, часть библиотеки с открытым исходным кодом, которую я использую) выглядит следующим образом:
queue.Receive(TimeSpan.FromSeconds(10), MessageQueueTransactionType.Automatic);
Что использует функция Messaging.MessageQueue.Receive, а очередь - MessageQueue. Проблема заключается в следующем.
Вышеуказанная строка кода будет вызываться с указанным таймаутом (10 секунд). Функция Receive(...)
является блокирующей функцией и должна блокироваться до тех пор, пока сообщение не поступит в очередь, после чего оно вернется. Если сообщение не получено до истечения таймаута, оно вернется к таймауту. Если сообщение находится в очереди при вызове функции, оно немедленно вернет это сообщение.
Однако происходит то, что функция Receive(...)
вызывается, видя, что в очереди нет сообщения и, следовательно, ожидает появления нового сообщения. Когда приходит новое сообщение (до таймаута), он не обнаруживает это новое сообщение и продолжает ждать. Тайм-аут в конце концов попадает, после чего код продолжается и снова вызывает Receive(...)
, где он берет сообщение и обрабатывает его.
Теперь эта проблема возникает только после нескольких дней/недель. Я могу заставить его работать нормально снова, удаляя и воссоздавая очередь. Это происходит на разных компьютерах и в разных очередях. Таким образом, кажется, что что-то нарастает, до некоторого момента, когда он нарушает функцию запуска/уведомления, используемую функцией Receive(...)
.
Я проверил много разных вещей, и все кажется нормальным и не отличается от очереди, которая работает нормально. Существует много свободного места на диске (13gig free) и RAM (около 350 МБ освобождает 1GB от того, что я могу сказать). Я проверил записи в реестре, которые все выглядят так же, как и другие очереди, и монитор производительности не показывает ничего из нормального. Я также запускаю инструмент TMQ и не вижу ничего подобного.
Я использую Windows XP на всех компьютерах, и все они имеют установленный пакет обновления 3. Я не отправляю большое количество сообщений в очереди, самое большее это будет 1 раз в 2 секунды, но, как правило, намного реже. Сообщения также малы и нигде рядом с пределом 4 МБ.
Единственное, что я только что заметил, это файлы p0000001.mq и r0000067.mq в папке C:\WINDOWS\system32\msmq\storage, равны 4,096KB, однако они являются такими же размерами и на других компьютерах, которые в настоящее время не испытывают проблема. Проблема не возникает с каждой очередью на компьютере сразу, так как я могу воссоздать 1 очередь задач на компьютере, а остальные очереди все еще испытывают проблему.
Я не очень опытен с MSMQ, поэтому, если вы публикуете возможные вещи для проверки, можете ли вы объяснить, как их проверить или где я могу найти более подробную информацию о том, о чем вы говорите.
В настоящее время ситуация такова:
- ComputerA - 4 очереди в обычном режиме
- ComputerB - 2 очереди, испытывающие проблемы, 1 обычная очередь
- Проблемы с системой ComputerC - 2
- ComputerD - 1 очередь обычная
- ComputerE - 2 очереди в обычном режиме
Итак, у меня есть большое количество компьютеров/очередей для сравнения и тестирования.