Я разработал приложение BizTalk, которое получает в качестве входного файла файл, содержащий кучу сообщений. Я использую компонент дизассемблера BizTalk XML для «отладки» файла в отдельных сообщениях. Каждое из этих сообщений выбирается из MessageBox с помощью оркестровки, которая преобразует сообщение и вызывает службу wcf.BizTalk: как ограничить количество подключений к службе wcf?
Проблема, с которой я столкнулся сейчас, состоит в том, что каждая партия содержит 1000 сообщений, и что эти 1000 сообщений, похоже, сразу вызываются службой wcf. Служба wcf «бомбардируется» этими сообщениями и настроена для обработки только 10 сообщений параллельно (каждый вызов должен обрабатывать данные и помещать данные в базу данных) и возвращает кучу исключений «Слишком занят» обратно в BizTalk. Я настроил адаптер wcf для повторного подключения соединения через 1 минуту.
В результате BizTalk сначала сбрасывает сообщения, а затем бомбит wcf-службу со всеми 1000 сообщениями, получает кучу «слишком занятых» исключений, а затем ждет, ничего не делая, пока не пройдет 1 минута, а затем бомбит ее снова и так далее.
Обработка была бы намного более эффективной, если бы я мог настроить BizTalk на открытие max 10 соединений с этой конкретной службой wcf, но, насколько я знаю, это невозможно. (Служба wcf настроена на использование net.tcp.)
Я уже пробовал настройки дросселирования узла несколькими способами, но либо это не помогает, либо делает приложение невыносимым медленным. Кроме того, дросселирование в BizTalk, похоже, реализовано таким образом, что оно сначала бомбит сервис, а затем замечает, что оно бомбило, затем ждет какое-то время, ничего не делая, а затем поднимает дроссель и снова начинает бомбардировку. Кажется намного лучше просачивать запросы/сообщения, чтобы они были гораздо более равномерно распределены во времени. Я хотел бы настроить адаптер WCF для приема максимум 4 сообщений в секунду, например. Дросселирование, которое теперь возможно, говорит примерно так: через скользящее окно 5 секунд я хочу активировать дросселирование, если есть более 20 сообщений. Но это не то же самое, потому что это позволяет эффект «всплеска».
Любые идеи, как я могу улучшить пропускную способность?
Это нехорошее решение, но если вы попадаете в проблему с выпуском продукции, вы можете использовать следующее. В расширенных опциях send port установите «Ordered Delivery». Вы получите только одно сообщение через порт за раз. Это ОЧЕНЬ медленно, но это может заставить вас двигаться, пока вы переписываете. – Jay