logo Фёдор Самородов

Как ускорить работу конвейера потока данных в пакете служб интеграции

В ‎конвейере‏ ‎потока ‎данных ‎(data ‎flow ‎task)‏ ‎зачастую ‎участвует‏ ‎большое‏ ‎количество ‎преобразований. ‎Но‏ ‎не ‎все‏ ‎они ‎встраиваются ‎в ‎конвейер‏ ‎одинаково.

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

Посмотрите ‎внимательно‏ ‎на‏ ‎пример:

Заметили ‎неприятный ‎эффект‏ ‎блокировки? ‎Операция‏ ‎сортировки ‎втянула ‎в ‎себя‏ ‎уже‏ ‎более ‎пяти‏ ‎миллионов ‎строк,‏ ‎но ‎так ‎и ‎не ‎выпустила‏ ‎из‏ ‎себя ‎ни‏ ‎одной ‎строки.‏ ‎Остальная ‎часть ‎конвейера ‎простаивает.

И ‎только‏ ‎после‏ ‎того,‏ ‎как ‎все‏ ‎строки ‎поступили‏ ‎на ‎сортировку,‏ ‎эта‏ ‎операция ‎начинает‏ ‎отдавать ‎их ‎на ‎дальнейшую ‎обработку:

Давайте‏ ‎просто ‎поменяем‏ ‎местами‏ ‎сортировку ‎и ‎аудит‏ ‎и ‎запустим‏ ‎пакет ‎ещё ‎раз. ‎Извлечение‏ ‎строк‏ ‎только-только ‎началось,‏ ‎а ‎у‏ ‎нас ‎уже ‎одновременно ‎работают ‎четыре‏ ‎операции,‏ ‎а ‎не‏ ‎три, ‎как‏ ‎раньше:

Первый ‎вариант ‎работает ‎16 ‎минут,‏ ‎второй‏ ‎—‏ ‎11.

А ‎сам‏ ‎совет ‎звучит‏ ‎очень ‎просто.‏ ‎Старайтесь‏ ‎ставить ‎неблокирующие‏ ‎операции ‎рядом. По ‎возможности, ‎не ‎разбивайте‏ ‎параллельно ‎работающую‏ ‎цепочку‏ ‎блокирующими ‎операциями.

Предыдущий Следующий
Все посты проекта
0 комментариев

Подарить подписку

Будет создан код, который позволит адресату получить бесплатный для него доступ на определённый уровень подписки.

Оплата за этого пользователя будет списываться с вашей карты вплоть до отмены подписки. Код может быть показан на экране или отправлен по почте вместе с инструкцией.

Будет создан код, который позволит адресату получить сумму на баланс.

Разово будет списана указанная сумма и зачислена на баланс пользователя, воспользовавшегося данным промокодом.

Добавить карту
0/2048