MSMQ — быстрый производитель/медленный потребитель

У меня проблема с обменом сообщениями (с MSMQ), который является разновидностью быстрого производителя/медленного потребителя. Есть ли способ получить количество невыполненных неизрасходованных сообщений в частной очереди MSMQ? Я хотел бы использовать это, чтобы задушить продюсера.

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

По сути, я хотел бы сделать что-то вроде следующего

///Producer pseudo-code 
    public void SendMessage(Message message, int totalMessagesSentCounter)
    {
       if (totalMessagesSentCounter % 1000 == 0)
       {
         while (outgoingQueue.GetMessageCount() > X)  ///Is this possible?
         {
             Sleep(Y milliseconds);
         }
        }
       outgoingQueue.Send(Message);
       totalMessagesSentCounter++;
    }

Моя конфигурация: Win XP/2003 с MSMQ 3.0


person user35559    schedule 04.02.2010    source источник


Ответы (2)


Я не использовал сам MSMQ, но у меня есть рецепт, который я нашел полезным.

Вместо одной очереди у вас есть две очереди - по одной в каждом направлении.

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

Таким образом, «токен» обеспечивает обратную связь от потребителя к производителю, которая ограничивает производительность до скорости потребителя.

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

person Will    schedule 04.02.2010
comment
Это определенно возможно. Однако я использую парадигму одностороннего обмена сообщениями и надеялся, что мне не придется использовать токены acks/response. - person user35559; 04.02.2010

Мне пришлось использовать библиотеку COM для MSMQ. Я нашел следующую ссылку, которая помогла.

http://blog.codebeside.org/archive/2008/08/27/подсчет-количества-сообщений-в-очереди-сообщений-in.aspx

person user35559    schedule 04.02.2010