Решение также частично зависит от того, как обрабатываются сообщения.
Я использовал WorkflowService, размещенный в Windows Server AppFabric с привязкой Net.Msmq и транзакционной очередью.Привязка транзакции net.msmq была необходима для обработки не по порядку обработки сообщений.Рабочий процесс - конечный автомат .Net 4.0.1, и сообщения поступают в одну и ту же очередь из разных систем.Например, возможно, чтобы одна система отправила обновление экземпляру конечного автомата до того, как другая система отправит сообщение для его создания.Чтобы включить обработку сообщений не по порядку, узел службы рабочего процесса использует BufferedReceive для блокировки сообщений и многократно повторяет попытку получения их из под блокировки очереди.В BufferedReceive максимальное число ожидающих сообщений установлено равным максимально вероятной длине пакета, поскольку сообщения в заблокированной очереди возвращаются в очередь повторов в передней части .
WF также имеет ряд настроек регулирования.Максимально допустимая длина пакета составляет около 20000. Я установил MaxConcurrentCalls на 64, а MaxConcurrentInstances на 20000. В результате IIS / WAS обрабатывает 64 одновременных вызова.
Однако, и это именно так, потому чтоПолучения в рабочем процессе являются односторонними, это не означает, что порожденные процессы WF завершаются, как только завершается получение.Далее в моем сценарии происходит следующее: после удаления сообщения и вызова экземпляра WF, который является одним из 64 вызовов, механизм рабочих процессов планирует ряд следующих шагов, один из которых - операция базы данных.
Гвоздь в том, что 64 вызова могут быть максимальными, но если скорость утечки сообщений выше, чем скорость завершения асинхронного процесса, так как при обработке входящей партии сообщений будет большее число исполняющих потоков (вмой случай WF экземпляры).Это может привести к непредвиденным ситуациям, например, для пула соединений ADO.NET значение по умолчанию равно 100 как максимальное количество соединений.Это приведет к истечению времени ожидания процессов для соединений из исчерпанного пула.Для этой конкретной проблемы вы можете либо повысить значение MaxPoolSize, либо использовать компонент Service Broker для асинхронной обработки операций с БД (что означает большую сложность в рабочем процессе).
Надеюсь, это кому-нибудь поможет.