Модуль: Reputation / Polling Service
Версия: 2.1
Дата: Январь 2026
2.1 Назначение и принципы
Назначение
Polling Service — компонент модуля Reputation, отвечающий за периодический сбор отзывов и вопросов покупателей с маркетплейсов Wildberries, Ozon и Яндекс.Маркет.Принцип работы
Pull-модель: Система периодически опрашивает API маркетплейсов для получения новых данных.| Критерий | Pull (polling) | Push (webhook) |
|---|---|---|
| Единообразие | ✅ Одинаково для всех площадок | ❌ Не все поддерживают |
| Контроль нагрузки | ✅ Полный контроль | ❌ Зависит от источника |
| Надёжность | ✅ Retry при сбоях | ❌ Потеря при недоступности |
| Сложность | ✅ Проще реализация | ❌ Требует endpoint + верификация |
Ключевые принципы
| Принцип | Описание |
|---|---|
| Идемпотентность | Повторный polling не создаёт дубликатов |
| Rate Limit Compliance | Строгое соблюдение лимитов API |
| Graceful Degradation | Сбой одной площадки не влияет на другие |
| Incremental Sync | Запрос только новых данных (с last_poll_time) |
| Distributed Schedule | Смещение задач для равномерной нагрузки |
2.2 Архитектура Polling Service
Компоненты
Взаимодействие компонентов
| Компонент | Ответственность | Зависимости |
|---|---|---|
| Celery Beat | Запуск задач по расписанию | Redis |
| Task Dispatcher | Маршрутизация по платформам | Adapters |
| Adapters | Взаимодействие с API | Rate Limiter |
| Rate Limiter | Соблюдение лимитов | Redis |
| Deduplication | Проверка уникальности | PostgreSQL |
2.3 Celery Tasks
Реестр задач polling
| Задача | Тип | Очередь | Смещение | Описание |
|---|---|---|---|---|
reputation.poll_wb_reviews | periodic | default | :00 | Отзывы Wildberries |
reputation.poll_wb_questions | periodic | default | :50 | Вопросы Wildberries |
reputation.poll_ozon_reviews | periodic | default | 1:40 | Отзывы Ozon |
reputation.poll_ozon_questions | periodic | default | 2:30 | Вопросы Ozon |
reputation.poll_ym_reviews | periodic | default | 3:20 | Отзывы Яндекс.Маркет |
reputation.poll_ym_questions | periodic | default | 4:10 | Вопросы Яндекс.Маркет |
Конфигурация Celery Beat
Визуализация распределения
Алгоритм задачи polling
2.4 Credentials Management
Environment Variables
Credentials для API маркетплейсов хранятся в environment variables:Загрузка credentials
2.5 Wildberries Adapter
API Endpoints
| Endpoint | Метод | Назначение |
|---|---|---|
/api/v1/feedbacks | GET | Список отзывов |
/api/v1/questions | GET | Список вопросов |
https://feedbacks-api.wildberries.ru
Параметры запроса
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
isAnswered | boolean | Нет | Фильтр по наличию ответа |
take | int | Да | Количество (макс. 10000) |
skip | int | Да | Смещение для пагинации |
dateFrom | int | Нет | Unix timestamp начала |
dateTo | int | Нет | Unix timestamp конца |
Маппинг полей WB → reputation_items
| WB поле | reputation_items поле | Преобразование |
|---|---|---|
id | external_id | Прямое |
nmId | sku | str(nmId) |
userName | client_name | Прямое |
text | client_text | Прямое |
productValuation | rating | Прямое (1-5) |
createdDate | created_at | ISO → datetime |
answer | — | Если есть → status=‘published’ |
Rate Limits
| Endpoint | Лимит | Период |
|---|---|---|
/api/v1/feedbacks | 100 | 1 минута |
/api/v1/questions | 100 | 1 минута |
2.6 Ozon Adapter
API Endpoints
| Endpoint | Метод | Назначение |
|---|---|---|
/v1/review/list | POST | Список отзывов |
/v1/product/questions | POST | Список вопросов |
https://api-seller.ozon.ru
Заголовки авторизации
Параметры запроса
Rate Limits
| Endpoint | Лимит | Период |
|---|---|---|
/v1/review/list | 60 | 1 минута |
/v1/product/questions | 60 | 1 минута |
2.7 Яндекс.Маркет Adapter
API Endpoints
| Endpoint | Метод | Назначение |
|---|---|---|
/campaigns/{id}/feedback/updates | GET | Список отзывов |
/campaigns/{id}/offers/{id}/questions | GET | Список вопросов |
https://api.partner.market.yandex.ru
Заголовки авторизации
Rate Limits
| Endpoint | Лимит | Период |
|---|---|---|
| Все endpoints | 100 | 1 минута |
2.8 Rate Limiter
Реализация
Конфигурация лимитов
2.9 Circuit Breaker
Реализация
2.10 Обработка ошибок
Единая политика
| Параметр | Значение |
|---|---|
| Timeout запроса | 30 секунд |
| Retry стратегия | Exponential backoff: 1с → 2с → 4с |
| Максимум попыток | 3 |
| Circuit breaker открытие | После 5 последовательных ошибок |
| Circuit breaker reset | 60 секунд |
Типы ошибок и реакция
| Код | Тип | Действие |
|---|---|---|
| 200 | Success | Обработать данные |
| 400 | Bad Request | Логировать, пропустить |
| 401/403 | Auth Error | Алерт администратору |
| 404 | Not Found | Логировать, пропустить |
| 429 | Rate Limit | Exponential backoff |
| 500-599 | Server Error | Retry через 30 сек |
| Timeout | Network | Retry с backoff |
2.11 Мониторинг и метрики
Метрики polling
| Метрика | Тип | Описание |
|---|---|---|
reputation_polling_duration_seconds | histogram | Время выполнения polling |
reputation_polling_items_fetched | counter | Количество полученных items |
reputation_polling_errors_total | counter | Количество ошибок |
reputation_polling_duplicates_skipped | counter | Пропущенные дубликаты |
reputation_circuit_breaker_state | gauge | Состояние circuit breaker |
Логирование
Приложение А: Контрольные точки
| Критерий | Проверка |
|---|---|
| Celery Beat запущен | celery -A app inspect scheduled |
| Задачи выполняются | Логи показывают polling каждые 5 мин |
| Дедупликация работает | Повторный polling не создаёт дубликатов |
| Rate Limiter работает | Нет 429 ошибок |
| Circuit Breaker | Открывается при 5 ошибках подряд |
| polling_state обновляется | last_poll_time актуален |
Документ подготовлен: Январь 2026
Версия: 2.1
Статус: Согласовано