Что такое пайплайн (конвейер) в архитектуре ПО?

«Что такое пайплайн (конвейер) в архитектуре ПО?» — вопрос из категории Архитектура, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Пайплайн (Pipeline) — это архитектурный паттерн, где обработка данных или запроса проходит через цепочку последовательных, изолированных этапов (стадий). Каждый этап получает входные данные, выполняет одну чёткую операцию и передаёт результат следующему этапу.

Аналогия из UNIX: cat log.txt | grep "ERROR" | sort | uniq -c

Преимущества:

  • Принцип единой ответственности: Каждый этап делает одно дело.
  • Гибкость и повторное использование: Этапы можно легко переставлять, добавлять или отключать.
  • Тестируемость: Каждый этап тестируется изолированно.
  • Потоковая обработка: Можно обрабатывать данные по частям (например, используя генераторы), не загружая всё в память.

Пример пайплаина для обработки CSV-файла на PHP:

// Этап 1: Чтение файла построчно (генератор экономит память)
function readCsvLines(string $filePath): Generator {
    $handle = fopen($filePath, 'r');
    while (($line = fgetcsv($handle)) !== false) {
        yield $line;
    }
    fclose($handle);
}

// Этап 2: Фильтрация строк
function filterValidRows(Generator $lines): Generator {
    foreach ($lines as $row) {
        if (count($row) === 3 && !empty($row[1])) { // Простая валидация
            yield $row;
        }
    }
}

// Этап 3: Преобразование данных
function normalizeRows(Generator $rows): Generator {
    foreach ($rows as $row) {
        [$id, $name, $email] = $row;
        yield ['id' => (int)$id, 'name' => ucfirst(strtolower($name)), 'email' => trim($email)];
    }
}

// Сборка и выполнение пайплаина
$pipeline = normalizeRows(filterValidRows(readCsvLines('data.csv')));
foreach ($pipeline as $processedItem) {
    // Отправка $processedItem в базу данных или в следующий сервис
    saveToDatabase($processedItem);
}

Использование: Конвейеры часто применяются в ETL-процессах, middleware-цепочках веб-фреймворков (например, в Laravel или Express.js) и конвейерах CI/CD.