Biztalk - Как регулировать поток, разбирать трубопровод

Мне нужно ограничить количество экземпляров оркестрации, порождаемых при отправке большого сообщения в приемном конвейере дизассемблирования потока. Допустим, у меня есть большой xml, который содержит 100 000 отдельных сообщений "Заказ". Затем приемный конвейер должен выполнить его деблокирование и создать 100 000 оркестровок ProcessOrder. Это слишком много, и мне нужно это ограничить.

Требования

  1. Отладка должна выполняться потоковым способом, чтобы я загружал в память только одно сообщение "Порядок" за раз перед отправкой его в ящик сообщений;
  2. Отладка должна регулироваться в зависимости от количества текущих запущенных экземпляров оркестровки "ProcessOrder" (скажем, если у меня уже есть 100 запущенных экземпляров, отладка будет ждать до тех пор, пока один из них не закончится, чтобы отправить другое сообщение "Заказ" в окно сообщения).

Где я нахожусь

  1. У меня есть приемный конвейер, который выполняет отладку и функциональные изменения моих сообщений. Он делает то, что должен, в потоковом режиме и помещает отдельные сообщения в VirtualStreams;

  2. У меня есть оркестровка и вспомогательные методы, которые могут ограничить количество экземпляров оркестровки "ProcessOrder".

Эта проблема

Я знаю, что могу запустить приемный конвейер внутри оркестровки (и это решило бы мою проблему, поскольку при каждом вызове "getnext" в конвейер я мог бы просто подождать, если слишком много запущенных экземпляров оркестрации), но копался в diz biztalk Я заметил, что использование Microsoft.XLANGs.Pipeline.XLANGPipelineManager по-прежнему загружает все сообщения в памяти, а не перечисляет их, как это делает Microsoft.BizTalk.PipelineOM.PipelineManager. Я знаю, что они помещают все сообщения в VirtualStream, но это все еще недостаточно, с точки зрения памяти, для такого большого количества сообщений.

Вопрос

Следующим моим шагом было бы запустить приемный конвейер непосредственно в приемном порте (чтобы он использовал Microsoft.BizTalk.PipelineOM.PipelineManager) без использования оркестровки, которая ограничивает количество экземпляров ProcessOrder, но для удовлетворения требований я бы нужно добавить логику задержки в моем конвейере. Это жизнеспособный вариант? Если нет, то почему? и какая у меня альтернатива?

1 ответ

Решение

Вы должны удалить все сообщения один раз из конвейера и сохранить эти отдельные сообщения в MSMQ до того, как они будут обработаны оркестровкой. Используйте стандартный конвейер для отправки сообщений, поскольку они эффективны для обработки больших файлов. MSMQ доступен бесплатно через функции включения Windows. Использование MSMQ очень просто и не требует какой-либо разработки. Отправка в MSMQ будет очень быстрой, 100K сообщений не проблема вообще.

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

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

Другие вопросы по тегам