RSS-импорт создает дубли, когда одна запись выглядит для системы новой после изменения даты, ссылки или текста. Повторный запуск задачи и параллельные worker усиливают проблему, если публикация не имеет стабильного ключа уникальности.
Выберите постоянный идентификатор записи: надежный GUID источника или нормализованный canonical URL. Сохраняйте связь feed item с публикацией до отправки и обновляйте ее состояние после ответа площадки.
Что сделать в первую очередь
- Найдите пару дублей и сравните GUID, link, pubDate и исходный XML.
- Проверьте число запусков импортера в момент повторной публикации.
- Уточните, изменял ли источник URL или содержимое старой записи.
- Остановите только отправку новых постов, сохранив чтение ленты для диагностики.
Почему возникает проблема
Симптом обычно появляется не из-за одной настройки. Сначала разделите путь данных на этапы и найдите место, где фактическое поведение расходится с ожидаемым.
- Импортер считает уникальной комбинацию заголовка и даты.
- Источник меняет tracking-параметры в link или переиздает материал.
- Два worker одновременно не находят запись и оба публикуют ее.
- Ошибка после отправки не сохраняет внешний post id, и retry публикует повторно.
Пошаговая диагностика
- Постройте timeline чтения, резервирования, отправки и сохранения ответа.
- Нормализуйте URL тестово: host, trailing slash и маркетинговые параметры.
- Проверьте уникальный индекс таблицы импортированных элементов.
- Сравните HTTP-ответ площадки при первой и повторной попытке.
- Проверьте, не обрабатывается ли одна лента несколькими расписаниями.
Как исправить
Исправляйте подтвержденную первопричину и сохраняйте возможность отката. После каждого изменения повторяйте один и тот же контрольный сценарий, чтобы не спутать результат нескольких правок.
- Создайте уникальный ключ source_id плюс stable_item_id.
- Резервируйте элемент атомарно до сетевого запроса.
- Сохраняйте внешний post id и отдельные статусы pending, sent и failed.
- Для неясного результата сначала ищите существующий пост, затем повторяйте отправку.
- Обновляйте опубликованный материал только по явному правилу, а не создавайте новый.
Как проверить результат
- Несколько параллельных запусков создают одну публикацию.
- Изменение tracking-параметров ссылки не создает новый элемент.
- Повтор после сетевого таймаута не удваивает пост.
Как не допустить повторения
- Мониторьте число записей RSS и число созданных публикаций.
- Храните исходный GUID, нормализованный URL и внешний post id.
- Покройте тестами переиздание записи и параллельный запуск.
Частые вопросы
Всегда ли GUID надежен?
Нет. Некоторые ленты меняют или повторяют GUID, поэтому полезен резервный ключ из нормализованного URL и источника.
Можно ли удалить дубли автоматически?
Можно после сверки внешних id и статистики, но сначала лучше остановить причину, чтобы не удалить нужный пост.
Когда стоит обратиться за помощью
Для разбора подготовьте небольшой фрагмент RSS, две ссылки на дубли и журнал запусков. Доступ к аккаунтам соцсетей на первом этапе не нужен.
Итог
Автопостинг должен быть идемпотентным: одна запись источника дает один управляемый пост. Я могу исправить ключи уникальности, очередь публикации и безопасное восстановление после ошибок.