BizTalk: Как ограничить количество подключений к службе WCF?

StackOverflow https://stackoverflow.com/questions/3591283

Вопрос

Я разработал приложение BizTalk, которое получает в качестве ввода файла, который содержит кучу сообщений. Я использую компонент BizTalk XML DissaSsembler для «деформирования» файла в сообщениях SepeReate. Каждое из этих сообщений поднимается из почтового ящика с помощью оркестрации, которая преобразует сообщение и вызывает службу WCF.

Проблема, которую я испытываю сейчас, заключается в том, что каждая пакет содержит 1000 сообщений, и что все 1000 сообщений, кажется, вызывают службу WCF одновременно. Служба WCF «бомбана» этими сообщениями и сконфигурирована для обработки всего 10 сообщений параллельно (каждый вызов должен обрабатывать данные и поместить данные в базу данных) и возвращает кучу «слишком занятых» исключения назад к BizTalk. Я настроил адаптер WCF, чтобы снова повторить соединение через 1 минуту.

Конечный результат заключается в том, что BizTalk сначала деформирует сообщения, а затем бомбы службы WCF со всеми 1000 сообщений, получает кучу «слишком занятых» исключений, затем ждет, ничего не делая, до 1 минуты пропускается, то бомбы снова и так на.

Обработка будет гораздо более эффективной, если бы я мог настроить BizTalk, чтобы открыть максимальные 10 подключений к тому конкретному обслуживанию WCF, но, насколько я знаю, это невозможно. (Служба WCF настроен на использование net.tcp.)

Я уже пробовал дроссельные настройки хоста несколькими разными способами, но либо оно не помогает, либо делает приложение невыносимым медленно. Кроме того, дросселирование в Biztalk, похоже, реализуется таким образом, что он первый бомбы сервис, затем замечает, что это бомбардирует, то ждет некогда ничего не делая, а затем поднимает дроссель и снова начинает бомбардировать. Кажется, гораздо лучше исчерпывать запросы / сообщения, чтобы они намного более равномерно распространялись вовремя. Я хотел бы настроить адаптер WCF для получения максимальных 4 сообщений в секунду, например. Дросселирование, которое возможно, теперь говорит что-то вроде: над раздвижным окном в 5 секунд я хочу активировать дросселирование, если есть более 20 сообщений. Но это не то же самое, потому что это позволяет «взрыв» эффекта.

Любые идеи, как я могу улучшить пропускную способность?

Это было полезно?

Решение 3

Этот вопрос уже старше года, но я просто хочу добавить ответ на случай, если у кого-то такая же проблема.

Я пытался играть с дросселистой конфигурацией хоста BizTalk. Это не помогло. Я на самом деле не пытался использовать рисунок Singleton, потому что это то, что я не хочу: мы создали мощную ориентированную на обслуживание архитектуру, которая может легко обрабатывать несколько сообщений параллельно, и я не хочу полностью отменить, что, введя рисунок Singleton Отказ

Так что я в итоге делал тогда? Сначала я снова рассмотрел то, что на самом деле требуется: нам нужно обработать кучу файлов, которые каждый содержит 1000 сообщений. Порядок, в котором обрабатывается сообщение внутри файла, не важно. Порядок, в котором обработаны файлы, важно. Обычно мы должны обрабатывать первый файл 1, то 2, то 3, и так далее. Тем не менее, это не так строго, порядок только на диапазонах файлов, например, первый диапазон 1-5 должен быть обработан, а затем диапазон 6-8, но в пределах диапазона порядка файлов не важен. Так что это были требования.

Первое, что я изменил, вместо обработки 1 сообщение за раз, я изменяю службу для приема набора сообщений, чтобы я мог обрабатывать 1 файл одновременно. При обработке 1 файла за раз, есть только 1 вызов на службу WCF, у которого есть преимущество, что существует намного меньше chit-Chat между BizTalk и службой WCF. Обратите внимание, что это делает код на стороне службы WCF более сложным, поскольку каждое сообщение все еще должно быть обработано независимо от других (делает ошибку обработки более сложными). Если нам удастся обработать ограниченное количество файлов одновременно, мы также можем избежать слишком занятой ошибки.

Рядом с фактической обработкой сообщений служба WCF также предоставляет звонки «зарегистрировать» обработку файла. Это код на стороне сервера, которая проверяет, может ли файл можно обрабатывать в то время: он учитывает порядок файлов и обеспечивает, чтобы файл (диапазон) может быть зарегистрирован только тогда, когда предыдущий файл (диапазон) уже обработанный. Эти регистрационные вызовы пытаются зарегистрировать файл (диапазон) в петле с подожщем внутри. Вызов пытается зарегистрировать файл, если он не принимается, он ждет, а затем снова пытается. Мне не очень нравится это решение, но это работает.

Таким образом, в конце концов у меня есть решение, учитывающее порядок диапазонов файлов, а рядом с тем, что имеет конфигурацию на том, сколько файлов можно обрабатывать параллельно. Это означает, что я больше не получаю слишком занятых ошибок. Не полностью удовлетворен своим решением, но он работает и очень стабилен. Это бегало без проблем на прошлый год.

Другие советы

Использовать Biztalk Singleton Pattern. Отказ Это уродливо. Но Biztalk Элегантная архитектура создает безобразие, когда она встречает реальный мир.

Для приспособлений WCF SOAP, HTTP и HTTP вы можете использовать настройки ConnectionManagement и ограничивая количество там соединений. Вы можете точно указать, сколько одновременных соединений разрешено каждый экземпляр хоста BizTalk.Настройка мыло, HTTP и HTTP-адаптеров на основе WCF одновременные соединения

Примечания:

  1. Это ограничивает количество соединений на Экземпляр хоста. Отказ Поэтому, если у вас либо несколько портов отправки на разных хостах, либо у вас есть несколько экземпляров хоста на хосте, то общее количество выполненных подключений все еще может превышать этот номер.

  2. Это только для Мыло, HTTP и HTTP-адаптеры на основе WCF. Отказ Не для других адаптеров WCF, как отмечено RVDginste

Штаты хост-дросселирования в BizTalk - это самостоятельный механизм для наличия сама BizTalk - я бы не изменил их слегка.

Как и в Igal's Singleton Idea, вы можете сделать грязные вещи для BizTalk, чтобы предотвратить его перегрузку вашего приложения с помощью звонков WS, но IMHO в конечном итоге вы можете повредить масштабируемость вашего BizTalk Server, делая это. Казалось бы, что синхронные вызовы к вашей заявке могут быть проблема - возможно, посмотрим на изменение, чтобы сделать это асинхронно с помощью MSMQ?

Но если вы остаетесь синхронным WCF, вы также можете посмотреть на эти ручки Для адаптера WCF на вашем отправите хосте (я думаю, вам нужно будет перейти к адаптеру WCF-Custom, если еще не)

Я использовал Контроллер экземпляра Узор много раз, и кажется, хорошо работает. Идея заключается в том, что вы обертываете свое настоящее сообщение в полезной нагрузке оркестрации. Когда пришло время называть ваш сервис, вы вместо этого передаете его в оркестровку, что обезвоживает, если запущены слишком много оркестроинов. Это простая концепция, и это хорошо работает.

Я скажу, что блог очень датируется ... Но идея работает.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top