Позвольте мне поделиться своим опытом с вами в этой области, вы можете найти полезным.
Моя команда впервые использовала транзакционные очереди MSMQ, которые будут поддерживать наши асинхронные службы (будь то IIS или WAS). Самая большая проблема, с которой мы столкнулись, - проблемы MS DTC при большой нагрузке, например, 100+ сообщений/вторая загрузка; все, что потребовалось, - это одна медленная операция с базой данных, где-то начинать вызывать исключения тайм-аута, а MS DTC приведет к тому, что дом будет так говорить (транзакции будут фактически потеряны, если все станет плохо), и хотя мы не на 100% уверены в корне причина по сей день, мы подозреваем, что MS DTC в кластерной среде имеет некоторые серьезные проблемы.
Из-за этого мы начали изучать различные решения. Служебная шина для Windows Server (локальная версия Azure Service Bus) выглядела многообещающей, но она была не транзакционной, поэтому она не соответствовала нашим требованиям.
Мы, наконец, решили использовать подход, основанный на вашем руле, который предложил нам ребята, которые построили Azure Service Bus из-за наших транзакционных требований. По существу, мы следовали за ролью роли «Лазурный рабочий» для рабочей роли, которая будет передаваться через некоторую очередь; модель блокировки опроса.
Честно говоря, это было намного лучше для нас, чем что-либо еще, что мы использовали. Псевдокод для такого сервиса:
hasMsg = true
while(true)
if(!hasMsg)
sleep
msg = GetNextMessage
if(msg == null)
hasMsg = false
else
hasMsg = true
Process(msg);
Мы обнаружили, что использование центрального процессора значительно снизить этот путь (ниже, чем традиционные услуги WCF).
Трудная часть, конечно, обработка транзакций. Если вы хотите, чтобы несколько экземпляров вашей службы читали из очереди, вам нужно использовать read-past/updlock в своем sql, а также иметь сервис .net, который зачисляет транзакции таким образом, назад, если служба завершится неудачей. в этом случае вы захотите пойти с повторными/ядовитыми очередями в виде таблиц в дополнение к вашим очередям.
Вопрос был задан много раз на SO; пожалуйста, найдите SO –
Хорошая ссылка на общую площадь. http://rusanu.com/2010/03/26/using-tables-as-queues/ Редактировать: Не уверен, что он отвечает на ваш конкретный вопрос о блокировке до тех пор, пока элементы не будут добавлены в очередь. Также я не уверен, что видел этот конкретный вопрос раньше на SO. –
Вы знаете, что SQL Server имеет * актуальные * очереди, не так ли? http://msdn.microsoft.com/en-us/library/ms345108(v=sql.90).aspx –