Технологии

Статья

«Трубы и фильтры»: как разделить обработку данных на понятные шаги

Один этап проверяет сообщение, другой преобразует его, третий готовит к отправке. Разбираем, как устроен паттерн Pipes and Filters и когда он полезен.

Иллюстрация паттерна «Трубы и фильтры» - 1

Когда обработка сообщения собрана в одном большом модуле, небольшое изменение может затронуть весь процесс. Паттерн «Трубы и фильтры» (Pipes and Filters) предлагает разделить его на самостоятельные этапы.

Каждый фильтр выполняет определённую операцию, а канал передаёт результат следующему этапу. Название не означает, что фильтр только отсеивает данные: он может проверять, преобразовывать или дополнять сообщение.

Пример: подготовка заказа к передаче в учётную систему

Сначала сообщение нужно разобрать, затем проверить обязательные поля и привести данные к формату получателя. Вместо одной большой обработки создаём последовательность:

  • Разбор сообщения. Преобразуем входной JSON в структуру, с которой удобно работать.

  • Проверка. Убеждаемся, что указаны номер заказа, товары и количество. Сообщения с ошибками направляем на разбор.

  • Преобразование. Сопоставляем поля и коды товаров с моделью учётной системы.

  • Подготовка к отправке. Формируем сообщение в согласованном формате.

У каждого этапа есть вход, выход и понятная ответственность. Если меняется формат получателя, прежде всего пересматриваем преобразование и подготовку сообщения.

Иллюстрация паттерна «Трубы и фильтры» - 2

Что даёт разделение на этапы

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

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

Почему порядок имеет значение

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

Для рабочего процесса также определяют правила повторной обработки, хранения сообщений и реакции на ошибки. Сам паттерн не задаёт гарантий доставки.

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

Иллюстрация паттерна «Трубы и фильтры» - 3