Этому вопросу уже более года, но я просто хочу добавить ответ на случай, если у кого-то возникнет такая же проблема.
Я попытался поиграть с дросселирующей конфигурацией хоста BizTalk. Это не помогло. На самом деле я не пытался использовать шаблон синглтона, потому что это то, чего я не хочу: мы создали мощную сервис-ориентированную архитектуру, которая может легко обрабатывать несколько сообщений параллельно, и я не хочу полностью отменять это, вводя шаблон синглтона .
Так что же я тогда делал? Сначала я снова подумал, что на самом деле требуется: нам нужно обработать кучу файлов, каждый из которых содержит 1000 сообщений. Порядок, в котором обрабатывается сообщение внутри файла, не имеет значения. Порядок, в котором обрабатываются файлы, важен. Обычно мы должны обработать сначала файл 1, затем 2, затем 3 и так далее. Тем не менее, он не настолько строг, порядок только для диапазонов файлов, например, сначала должен быть обработан диапазон 1-5, затем диапазон 6-8, но в пределах диапазона порядок файлов не важен. Таковы были требования.
Первое, что я изменил, вместо того, чтобы обрабатывать 1 сообщение за раз, я изменяю службу, чтобы принимать набор сообщений, чтобы я мог обрабатывать 1 файл за раз. Обрабатывая по 1 файлу за раз, происходит только 1 вызов службы WCF, что дает преимущество в том, что между BizTalk и службой WCF намного меньше болтовни. Однако обратите внимание, что это делает код на стороне службы WCF более сложным, поскольку каждое сообщение по-прежнему должно обрабатываться независимо от других (делает обработку ошибок более сложной). Если нам удастся обработать ограниченное количество файлов одновременно, мы также сможем избежать слишком занятой ошибки.
Наряду с фактической обработкой сообщений служба WCF также предоставляет вызовы для «регистрации» обработки файла. Это код на стороне сервера, который проверяет, может ли файл быть обработан в это время: он учитывает порядок файлов и гарантирует, что файл (диапазон) может быть зарегистрирован только тогда, когда предыдущий файл (диапазон) уже обработанный. Эти регистрационные вызовы пытаются зарегистрировать файл (диапазон) в цикле с ожиданием внутри. Вызов пытается зарегистрировать файл, если он не принят, он ждет, а затем пытается снова. Мне не очень нравится это решение, но оно работает.
Итак, в конце концов, у меня есть решение, которое учитывает порядок диапазонов файлов, и рядом с ним есть конфигурация того, сколько файлов можно обрабатывать параллельно. Это означает, что я больше не получаю слишком занятых ошибок. Не совсем доволен моим решением, но оно работает и очень стабильно. Прошлый год он работал без проблем.