Технологии
Статья
«Трубы и фильтры»: как разделить обработку данных на понятные шаги
Один этап проверяет сообщение, другой преобразует его, третий готовит к отправке. Разбираем, как устроен паттерн Pipes and Filters и когда он полезен.
Когда обработка сообщения собрана в одном большом модуле, небольшое изменение может затронуть весь процесс. Паттерн «Трубы и фильтры» (Pipes and Filters) предлагает разделить его на самостоятельные этапы.
Каждый фильтр выполняет определённую операцию, а канал передаёт результат следующему этапу. Название не означает, что фильтр только отсеивает данные: он может проверять, преобразовывать или дополнять сообщение.
Пример: подготовка заказа к передаче в учётную систему
Сначала сообщение нужно разобрать, затем проверить обязательные поля и привести данные к формату получателя. Вместо одной большой обработки создаём последовательность:
Разбор сообщения. Преобразуем входной JSON в структуру, с которой удобно работать.
Проверка. Убеждаемся, что указаны номер заказа, товары и количество. Сообщения с ошибками направляем на разбор.
Преобразование. Сопоставляем поля и коды товаров с моделью учётной системы.
Подготовка к отправке. Формируем сообщение в согласованном формате.
У каждого этапа есть вход, выход и понятная ответственность. Если меняется формат получателя, прежде всего пересматриваем преобразование и подготовку сообщения.
Что даёт разделение на этапы
Фильтры проще проверять по отдельности и использовать повторно в разных процессах. На границах этапов удобно фиксировать время обработки и ошибки: это помогает найти участок, на котором задерживаются данные.
При подходящей реализации этапы можно выполнять на отдельных обработчиках. Однако ускорение зависит от характера операций, пропускной способности каналов и самого медленного участка цепочки.
Почему порядок имеет значение
Фильтры нельзя произвольно переставлять. Проверка структуры требует уже разобранного сообщения, а преобразование - согласованных исходных данных. Перед изменением последовательности нужно проверить форматы входа и выхода, зависимости и побочные действия каждого этапа.
Для рабочего процесса также определяют правила повторной обработки, хранения сообщений и реакции на ошибки. Сам паттерн не задаёт гарантий доставки.
Подход полезен, когда обработка состоит из нескольких самостоятельных шагов и будет развиваться. Для одного простого преобразования отдельная цепочка может оказаться избыточной.