
Трубы и фильтры (интеграционный паттерн)
Во многих сценариях интеграции в корпоративной среде одно событие запускает цепочку обработок, каждая из которых выполняет конкретную функцию.
Например, допустим, что в нашей компании поступает новый заказ в виде сообщения.
Первое требование: сообщение должно быть зашифровано, чтобы посторонние не могли подслушать заказ клиента.
Второе требование: сообщение должно содержать аутентификационную информацию в виде цифрового сертификата, чтобы гарантировать, что заказы делают только доверенные клиенты.
Дополнительно: внешние системы могут случайно присылать дублированные сообщения (помните предупреждения на популярных сайтах «Нажимайте кнопку “Заказать” только один раз»?). Чтобы избежать повторных отправок и недовольных клиентов, дубликаты нужно отфильтровать до начала последующих шагов обработки заказа.
Итого, чтобы выполнить все требования, нужно преобразовать поток сообщений, которые могут быть дублированными и зашифрованными и содержать дополнительную аутентификационную информацию, в поток уникальных, простых сообщений с заказами в открытом виде, без лишних полей данных.
Используем архитектурный стиль Pipes and Filters (Трубы и Фильтры), чтобы разделить крупную задачу обработки на последовательность небольших, независимых шагов (Фильтров), соединённых каналами передачи данных (Трубами).
Фильтр имеет очень простой интерфейс: получает сообщения на входной трубе, обрабатывает их и отправляет результат на выходную трубу.
Труба соединяет один фильтр с другим, передавая сообщения дальше.
Все фильтры используют одинаковый внешний интерфейс, поэтому их можно собирать в разные цепочки, соединяя через разные трубы.
Можно добавлять новые фильтры, пропускать существующие или менять порядок, не меняя внутреннюю логику фильтров.
Соединение фильтра с трубой иногда называют портом.
В базовой версии каждый фильтр имеет один входной порт и один выходной порт.
Иными словами, Трубы и Фильтры превращают любую сложную обработку в модульный конвейер, где каждый шаг независим и легко переставляется.