В прошлом я решал нечто похожее, теперь эти советы зависят от того, сколько данных вам нужно синхронизировать (у меня было около 8 источников, каждый из которых около 10 000 элементов синхронизировался не позднее, чем через 15 минут).
Архитектурарешения выглядит следующим образом:
- Для каждого источника у вас есть Tranformer, который загружает исходный файл и анализирует его в одном общем TransformedDTO, в вашем случае это может быть либо один Продукт, содержащий категорию, либо два преобразованных объекта.для 2 разных процессоров
- Далее у вас есть процессор - этот получает TransformedDTO, теперь для оптимизации я вычислил контрольную сумму данных и сравнил ее с контрольной суммой последнего запуска на основе продукта.Сейчас занимаюсь обновлением только при необходимости.Если вы вставляете только продукты, этот шаг не требуется.
- Здесь вы можете сделать, чтобы этот процессор просто проверял, изменился ли продукт, если это так, вы добавляете обновление в очередь и обрабатываете другой процессор.Но это только следующий возможный шаг.
Преимущества этого решения:
- Добавление нового импорта состоит из простой записи одного Transformer
- Вы можете иметь некоторое кэширование/ оптимизация логики в вашем процессоре (это обычно узкое место, так как для этого нужно выполнить довольно много операций), но поскольку он используется совместно, для этого есть место, и одна оптимизация влияет на все.
Для планирования, зависит от ваших потребностей - я бы придерживался возможности запускать разные расписания в разное время и проверять, с каким интервалом обновляются источники, и синхронизировать с вами время обновления.
Пример TransformedDTO.Это не что иное, как заполнитель для ваших данных, он работает как вход для процессоров и как выходной преобразователь.
class Product {
public $sku;
public $category;
public $name;
// Everything else which your processor know how to process
}