Архитектура модульной платформы
Слои
| Слой | Путь | Роль |
|---|---|---|
| Ядро | app/Integrations/ |
Шина хуков, snapshot, outbound, REST, лицензии, Filament‑реестр |
| Пакеты | modules/Integrations/{Code}/ |
manifest, hooks.php, handlers, instance_form |
| Админка | Модули интеграций | Каталог, подключения, мониторинг |
| Очереди | Laravel Queue | integrations.*, при необходимости default |
Operational
Модуль operational, если:
- Есть в БД (Синхронизировать в каталоге);
- Включён;
- Лицензия valid (или
license.required: false); - Legacy: дополнительно
IntegrationModuleInterface::enabled().
php artisan integrations:package:inspect MyModule
Подключения и точки
Snapshot содержит pickup_point_id.
| Инстанс | События |
|---|---|
| На конкретную точку | Только эта точка |
| Все точки (bulk) | Отдельный инстанс на каждую активную точку с теми же настройками |
| Нет подключений | Handler из hooks.php может работать без привязки; outbound — нет |
Outbound привязан к активному инстансу.
Два канала исходящих событий
PlatformHookBus на каждый хук:
- Jobs outbound для endpoint инстанса;
- Jobs handler для пакетов из
hooks.php.
Каналы независимы.
Snapshot
Массив JSON, не Eloquent. Для статусов: status_code, status_semantic, previous_*.
Идемпотентность
integration_hook_deliveries: (package, hook, idempotency_key). Повтор completed не вызывает handler.
Backpressure
| Механизм | Env |
|---|---|
| max pending | INTEGRATION_HOOK_MAX_PENDING (500) |
| rate limit | INTEGRATION_HOOK_RATE_LIMIT (120/мин) |
| circuit breaker | INTEGRATION_CB_* |
Legacy
МойСклад и др. без manifest — is_legacy, старый sync, форма Интеграции. Новые модули — manifest + Подключения.
Очереди
INTEGRATION_DEDICATED_QUEUES (config по умолчанию true):
| Очередь | Содержимое |
|---|---|
integrations.{Code} |
Handlers платформы, inbound job |
integrations.outbound |
POST наружу |
Jobs внутри модуля могут использовать свою логику очереди. То есть сам пакет при необходимости может отправлять тяжёлые внутренние задачи либо в default, либо в свою отдельную очередь.
Не смешивайте тяжёлый синк каталога с integrations без необходимости.
После commit
Статусы, оплаты — только DB::afterCommit.