Skip to content

Commit d345df5

Browse files
committed
app+docs: wire brevo outbox worker and describe flow
1 parent e5d77ed commit d345df5

File tree

3 files changed

+50
-0
lines changed

3 files changed

+50
-0
lines changed

app/main.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from db.connection import database_connection_scope
1111
from logging_config.logger import configure_logging
1212
from brevo.api_client import BrevoApiClient
13+
from brevo.sync_worker import BrevoSyncWorker
1314
from funnels.sync_service import FunnelSyncService
1415
from funnels.purchase_sync_service import PurchaseSyncService
1516

@@ -103,6 +104,15 @@ def main() -> None:
103104

104105
purchase_sync_service.sync(max_rows=100)
105106

107+
if not settings.application.dry_run:
108+
brevo_sync_worker = BrevoSyncWorker(
109+
connection=connection,
110+
brevo_client=brevo_client,
111+
)
112+
brevo_sync_worker.run_once(limit=100)
113+
else:
114+
logger.info("Dry run mode: BrevoSyncWorker is not executed.")
115+
106116
logger.info("Job finished")
107117

108118
except KeyboardInterrupt:

docs/en/operations_guide.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,26 @@ This will:
8282
* record funnel entry in the `funnel_entries` table (or log dry-run message, depending on `APP_DRY_RUN`);
8383
* sync certificate purchases with MODX tables and update `funnel_entries` (or log dry-run message, depending on `APP_DRY_RUN`).
8484

85+
### 2.2.1. End-to-End Flow
86+
87+
The main task follows an outbox pattern for reliable Brevo synchronization:
88+
89+
1. **Funnel Sync and Purchase Sync** write state into:
90+
* `funnel_entries` (main analytics table)
91+
* `brevo_sync_outbox` (outbox table for Brevo operations)
92+
93+
2. **BrevoSyncWorker** reads pending jobs from `brevo_sync_outbox` and applies them to Brevo by calling the Brevo API.
94+
95+
This decouples database writes from external API calls, ensuring that:
96+
* Database operations and outbox job creation happen atomically within transactions
97+
* Brevo API calls can be retried independently if they fail
98+
* The system can recover from temporary Brevo API outages without losing work
99+
100+
**In dry-run mode:**
101+
* Only read queries are executed
102+
* `funnel_entries` and `brevo_sync_outbox` are not modified
103+
* The worker is not executed
104+
85105
### 2.3. Running Conversion Report
86106

87107
```powershell

docs/ru/operations_guide.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,26 @@ python -m app.main
8787
* записывает вход в воронку в таблицу `funnel_entries` (или логирует сообщение dry run, в зависимости от `APP_DRY_RUN`);
8888
* синхронизирует покупки сертификатов с таблицами MODX и обновляет `funnel_entries` (или логирует сообщение dry run, в зависимости от `APP_DRY_RUN`).
8989

90+
### 2.2.1. Сквозной поток выполнения
91+
92+
Основная задача использует паттерн outbox для надежной синхронизации с Brevo:
93+
94+
1. **Модуль синхронизации воронок и покупок** записывает состояние в:
95+
* `funnel_entries` (основная аналитическая таблица)
96+
* `brevo_sync_outbox` (таблица outbox для операций Brevo)
97+
98+
2. **BrevoSyncWorker** забирает задания из `brevo_sync_outbox` и применяет их к Brevo, вызывая API Brevo.
99+
100+
Это разделяет запись в базу данных и внешние вызовы API, обеспечивая:
101+
* Атомарность операций с базой данных и создания заданий в outbox в рамках транзакций
102+
* Возможность повторных попыток вызовов API Brevo при сбоях
103+
* Восстановление системы после временных сбоев API Brevo без потери работы
104+
105+
**В режиме dry-run:**
106+
* Выполняются только запросы на чтение
107+
* Таблицы `funnel_entries` и `brevo_sync_outbox` не изменяются
108+
* Воркер не запускается
109+
90110
### 2.3. Запуск отчета по конверсии
91111

92112
```powershell

0 commit comments

Comments
 (0)