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, две ссылки на дубли и журнал запусков. Доступ к аккаунтам соцсетей на первом этапе не нужен.

Итог

Автопостинг должен быть идемпотентным: одна запись источника дает один управляемый пост. Я могу исправить ключи уникальности, очередь публикации и безопасное восстановление после ошибок.