Пакетная обработка миллиона записей в BizTalk

Я рассматриваю предложения о том, как решить эту проблему и использую ли я подходящий инструмент для работы. Я работаю в основном над BizTalk, и в настоящее время мы используем BizTalk 2013 R2 с SQL 2014.

Проблема:

Мы будем получать позиционные плоские файлы каждый день (около 50) от различных партнеров, и теоретическое общее количество полученных записей будет более миллиона записей. Каждая запись содержит некоторую идентифицирующую информацию, которую нужно будет отправить в веб-службу, которая вернется, по существу, с ДА или НЕТ, в зависимости от того, что входящий файл будет разделен на два файла.

Первоначально объем ежедневных ожидаемых записей составлял 10 тыс., Который позже увеличился до 100 тыс. И теперь составляет миллион записей.

Попытка 1: паттерн Scatter-Gather

Я дебатирую записи в настраиваемом конвейере с помощью дизассемблера файлов, добавляя пару настраиваемых свойств порта для части разброса (следуя предложению Ричарда Серотера о реализации циклического присваивания), где я контролирую количество запускаемых мной оркестровок разброса / рабочих вверх, чтобы вызвать веб-службу и пометить записи для отправки в «Агентство A» или «Агентство B» и, наконец, отправить управляющее сообщение, которое запускает оркестровку Gather / Aggregator, которая собирает все сообщения, которые обрабатываются от рабочих, в messagebox через корреляцию и создает два файла, которые направляются в агентство A и агентство B.

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

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

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

Подход 2:

Предполагая, что узким местом является оркестровка агрегатора, вместо того, чтобы накапливать их в оркестровке, я отправил обработанные записи в базу данных SQL и `` разделил '' записи на два файла XML (в основном конкатенация сообщений, идущих в агентство A / B и это в объявлении XML и с использованием правильного типа сообщения, основанного на записи некоторых свойств контекста в таблицу SQL вместе с записью). Эти агрегированные XML-записи опрашиваются и направляются в нужные агентства.

Кажется, это нормально работает с 100 тыс. Записей и выполняется за приемлемое время. Теперь, когда цель / требование снова изменились в отношении ожидаемого объема, я пытаюсь понять, является ли BizTalk еще более целесообразным выбором.

Я указал, что BT не является подходящим инструментом для выполнения такой задачи, но клиент предлагает нам добавить больше серверов, чтобы заставить его работать. Я смотрю на SSIS.

Между тем, пока мы проводим некоторое тестирование, некоторые наблюдения:

  1. Увеличение количества воркеров улучшило обработку (да): похоже, если каждый воркер обработал меньшее количество записей в своей очереди / подписке, они быстро завершили свою очередь. При тестировании этого файла с записью 100 КБ с использованием 100 рабочих процессов, завершенных менее чем за 3 часа. Это при минимальной активности на сервере со стороны других приложений. Я пытаюсь заставить команду хостинга веб-сервисов дать мне теоретический максимум одновременного подключения, которое они могут обработать. Я склоняюсь к тому, чтобы попросить их посмотреть, смогут ли они обработать 1000 вызовов, и, возможно, существующее решение будет масштабироваться с моими наблюдениями.

Я скорректировал несколько настроек хоста в отношении количества сообщений и порога физической памяти, чтобы он не отказывался от объема, но я все еще не уверен. Раньше мне не приходилось возиться с этими настройками, и я могу воспользоваться советами для отслеживания каких-либо конкретных счетчиков.

Сообщение немного длинное, но я надеюсь, что он дает представление о том, что я делал до сих пор. Любая помощь / понимание приветствуются в решении этой проблемы. Если вы предлагаете альтернативы, я ограничен инструментами / фреймворками на основе .NET или MS, но хотел бы услышать и о других вариантах.

Я постараюсь ответить или дать более подробную информацию, если вы хотите уточнить или понять то, что я не разъяснил.


person Seige    schedule 28.06.2017    source источник
comment
Упомянутый паттерн дросселирования Серотера - один из тех, что мы использовали. См. connected- pawns.com/2016/05/21/ И это сработало, но да, одно из ограничений - количество одновременных подключений. Еще одна вещь, на которую следует обратить внимание, это то, может ли веб-служба, которую вы вызываете, изменять, чтобы принимать более одной записи за раз. Поскольку это довольно ограничивающий фактор. Вы также посмотрели на настройки максимального количества подключений, которые по умолчанию составляют 2 сложных слов. wordpress.com/2009/02/16/   -  person Dijkgraaf    schedule 28.06.2017
comment
Спасибо, я слышал об этом, но не думаю, что у меня это ограничение. Моя машина разработчика, на которой я тестирую это, находится на Windows 2012, и когда я в качестве примера раскручиваю 10 рабочих, я вижу 10 подключений к веб-службе в Fiddler, а не только 2. Я не видел тайм-аутов. Я также прошу команду веб-сервисов увеличить их лимиты одновременных подключений, поэтому я буду тестировать это и посмотреть, повысится ли производительность. Для ясности, сталкивались ли вы с подобным сценарием на своем рабочем месте?   -  person Seige    schedule 28.06.2017
comment
Да, мы столкнулись с необходимостью дебатировать большой файл, а затем обрабатывать его через веб-службу с ограниченным количеством подключений. На обработку требуется время, поскольку мы больше не получаем дросселирования и тайм-аутов, что было раньше из-за того, что слишком много оркестровок вращались и одновременно пытались подключиться к веб-сервису. Ваш вариант выглядит немного сложнее, поскольку вам нужно объединить все ответы в один ответ, чего нам не нужно было делать.   -  person Dijkgraaf    schedule 28.06.2017
comment
Вы определили, какой счетчик дросселирования сработал в BizTalk. Поскольку это узкое место, которое вам необходимо устранить. Вы видели много сообщений в очереди для порта отправки? Тогда, возможно, ваше максимальное количество подключений слишком низкое, и вам нужно это изменить.   -  person Dijkgraaf    schedule 29.06.2017
comment
Публикует ли ваш конвейер дебатированные сообщения непосредственно в Msgbox? Если это так, то при обработке файла записи размером 10 КБ вы увидите, что 10 КБ сообщений опубликованы в окне сообщений почти одновременно. Это может быть причиной дроссельной заслонки.   -  person Zee    schedule 29.06.2017


Ответы (3)


Во-первых, 1 миллион записей / сообщений не является проблемой, но вы можете сделать это проблемой, если будете плохо с ней обращаться.

Вот образец, который я бы выложил в первую очередь.

  1. Загрузите записи в SQL Server с помощью SSIS. Это будет очень быстро.
  2. Обработайте / слейте записи в ваше приложение BizTalk для ... ну, все, что нужно сделать. Вызов службы и т. Д.
  3. Обновите запись SQL с результатом.
  4. Когда этот процесс будет завершен, запросите пакеты «Да» и «Нет» в виде одного (большого) сообщения каждый, преобразуйте и отправьте.

Я предполагаю, что веб-служба будет узким местом, если она специально не предназначена для такой нагрузки. Вам, вероятно, придется настраивать BizTalk на дросселирование только при необходимости, но пока не беспокойтесь об этом. Хороший шаблон приложения важнее.

person Johns-305    schedule 29.06.2017
comment
Мое решение было модификацией вашего дизайна, но мы удалили BT из поля зрения, так как SSIS, похоже, намного лучше подходит для этой задачи, и клиент согласился на основе показателей производительности. - person Seige; 25.04.2018

В таких случаях вам следует рассмотреть следующий подход:

  • Распакуйте файл и сохраните отдельные записи в MSMQ. Вы можете легко добиться этого без каких-либо дополнительных усилий по кодированию. Все, что вам нужно, это создать порт отправки с помощью адаптера MSMQ или настраиваемого WCF с привязкой netmsmq. При необходимости вы также можете создавать отдельные очереди в зависимости от различных критериев, которые могут быть у ваших сообщений.
  • Получать сообщения от MSMQ, используя место приема на отдельном хосте.
  • Отправьте их в веб-службу на другом узле BizTalk.
  • Попробуйте использовать только сценарии обмена сообщениями, при необходимости вы можете обработать ответ службы с помощью компонента конвейера. Вы можете использовать карту для самого порта отправки. В худшем случае, если вам нужна оркестровка, она должна обрабатывать только одно сообщение без какого-либо сложного шаблона.
  • Вы можете снова отправить сообщения обратно в два MSMQ для двух разных агентств на основе ответа веб-службы.
  • Затем вы можете снова получить эти сообщения и записать их в файл, вы можете просто использовать порт отправки с опцией FileAppend или использовать настраиваемый компонент конвейера для записи полученных сообщений в файл без их объединения в оркестровке. Вы можете собрать их в оркестровке, если на файл у вас не более нескольких тысяч сообщений.
  • При таком подходе у вас не будет узких мест в BizTalk, и вам не нужно будет использовать сложный шаблон оркестрации, который обычно имеет много постоянных точек.
  • Если веб-служба становится узким местом, вы можете контролировать скорость получения сообщения от MSMQ, используя 1) упорядоченную доставку в месте получения MSMQ и, если требуется, 2) используя регулирование узла BizTalk, изменив два свойства Message Count в Db на очень низкое число, например 1000 с 50 КБ по умолчанию и соответственно увеличивая множитель спула и данных отслеживания, например 500 из 10 по умолчанию, чтобы убедиться, что умножения обоих чисел достаточно, чтобы не вызывать дросселирование из-за сообщений в BizTalk. Вы также можете уменьшить количество рабочих потоков на хосте BizTalk, чтобы сделать его немного медленным.
  • Обратите внимание: MSMQ является частью ОС Windows и не требует дополнительной настройки. Обычно устанавливается по умолчанию, в противном случае вы можете добавить с помощью функций добавления и удаления. Вы также можете использовать IBM MQ, если у вашей организации есть инфраструктура. Но для миллиона сообщений MSMQ подойдет.
person Vikas Bhardwaj    schedule 30.06.2017

Приносим извинения за позднее обновление * Мы решили использовать SSIS для массового импорта файла в таблицу, и, поскольку веб-служба поиска является частью той же организации и сети, хотя и использует другой стек, они согласились разрешить нам называть их таблица поиска, на которой основана их веб-служба, и мы используем «слияние» между этими таблицами, чтобы идентифицировать «Y» или «N», а также экспортировать их через SSIS.

Короче говоря, мы отказались от использования BT. Теперь время, необходимое для обработки 1,5 миллиона файлов записей и отправки разделенных файлов, составляет пару минут.

Оцените все предоставленные здесь советы.

person Seige    schedule 25.04.2018