Позвольте мне поделиться с вами своим опытом в этой области, вы можете найти его полезным.
Моя команда впервые использовала транзакционные очереди MSMQ, которые будут обслуживать наши асинхронные службы (будь то хостинг IIS или WAS).Самой большой проблемой, с которой мы столкнулись, были проблемы MS DTC при большой нагрузке, например, 100+ сообщений в секунду;все, что потребовалось, - это одна медленная операция с базой данных где-то, чтобы начать вызывать исключения тайм-аута, и MS DTC, если можно так выразиться, разрушил бы дом (транзакции фактически потерялись бы, если бы все стало достаточно плохо), и хотя мы не на 100% уверены в корнеПо сей день мы подозреваем, что MS DTC в кластерной среде имеет некоторые серьезные проблемы.
Из-за этого мы начали искать другие решения.Служебная шина для Windows Server (локальная версия Azure Service Bus) выглядела многообещающе, но не транзакционной, поэтому не отвечала нашим требованиям.
Мы наконец-то выбрали подход «по-вашему».подход, предложенный нам ребятами, которые создали сервисную шину Azure из-за наших требований к транзакциям.По сути, мы следовали модели рабочей роли Azure для рабочей роли, которая будет передаваться через некоторую очередь;модель блокировки опросов.
Честно говоря, для нас это было намного лучше, чем все остальное, что мы использовали.Псевдокод для такой службы:
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 в транзакции таким образом, чтобыобратно в случае сбоя службы.в этом случае вы захотите использовать в качестве таблиц очереди повторов / отравлений в дополнение к обычным очередям.