Skip to content

Latest commit

 

History

History
66 lines (48 loc) · 6.2 KB

README.md

File metadata and controls

66 lines (48 loc) · 6.2 KB

feed-parser

Сервис позволяет периодически в заданный в файле конфигурации промежуток времени, например, 10-15 минут опрашивать список RSS лент сайтов. Сервис читает ленту, разбирает ее, создает из элементов ленты объект единого вида Entry, который сохраняет в индексе ManticoreSearch. Если в RSS ленте нет контента, то сервис идет по ссылке записи, скачивает страницу, разбирает ее и создает объект стандартного вида Entry. На данный момент реализованы парсеры сайтов mid.ru, kremlin.ru, mil.ru и их языковые версии.

Существенное отличие от прошлых реализация парсеров — универсальность, можно подключить rss ленту любого сайта или агентства новостей, например tass.ru. В инженерном плане применена концепция worker poll — пул воркеров, при старте службы, сервис читает ссылки лент и запускает для каждой ссылки парсер, парсеры работают в параллельном режиме.

urls := []Link{
    {Url: "http://kremlin.ru/events/all/feed/", Lang: "ru", ResourceID: 1},
    {Url: "http://en.kremlin.ru/events/all/feed", Lang: "en", ResourceID: 1},
    {Url: "https://mid.ru/ru/rss.php", Lang: "ru", ResourceID: 2},
    {Url: "https://mid.ru/en/rss.php", Lang: "en", ResourceID: 2},
    {Url: "https://mid.ru/de/rss.php", Lang: "de", ResourceID: 2},
    {Url: "https://mid.ru/fr/rss.php", Lang: "fr", ResourceID: 2},
    {Url: "https://mid.ru/es/rss.php", Lang: "es", ResourceID: 2},
    {Url: "https://mid.ru/pt/rss.php", Lang: "pt", ResourceID: 2},
    {Url: "https://function.mil.ru/rss_feeds/reference_to_general.htm?contenttype=xml", Lang: "ru", ResourceID: 3},
}

Парсеры с периодичностью опрашиват свои ссылки-ленты, читают их и создают из записей ленты задачи. Каждая запись-задача отправляется в очередь на обработку, которую осуществляют worker-ы обработчики, они так же работают параллельно. Количество воркеров по-умолчанию 5.

Каждый обработчик берет задачу из очереди, и обрабатывает её. Делает запрос в индекс ManticoreSearch, ищет эту запись, если не находит, то создает новую запись, и при необходимости запускает crawler, который идет за контентом (сайты mil.ru, mid.ru). Обычно в ленте содержится только заголовок и короткое описание, за статьей обработчик отправляется на сайт и парсит страницу.

Если при разборе ленты и запросе в базу ManticoreSearch, запись уже существует, то осуществляется проверка, по полям updated, если поля в ленте и в базе различаются, то обработчик сохраняет обновленную версию события. По наблюдениям такое довольно часто происходит, так как статьи дополняются со временем, такое точно замечено на сайтах kremlin.ru и mid.ru

Когда все задачи обработаны, обработчики ожидают задачи в очереди, работают в фоне в ожидании записей из лент.

Диаграмма процессов

diagram drawio

Реализовано

  • парсер rss ленты, для этого надо предать адрес ленты парсеру, поддерживаются языковые ленты kremlin.ru (ru,en), mid.ru (ru, en, de, fr, es, pt). mil.ru (ru)
  • разделение длинного контента на фрагменты по 1800 - 3600 символов, для сохранения каждого фрагмента, как отдельной записи в БД для удобства поиска.
  • добавление новых записей(фрагментов) из ленты событий в мантикору
  • обновление существующих записей(фрагментов) из ленты в мантикору по специальным условиям. Если при обновлении записи, контента стало больше (например, при сценарии «Продолжение следует»), то производится добавление новых фрагментов к существующим фрагментам.
  • фронтенд для поиска: feed-svodd-app

Используемые библиотеки

Полный список зависимостей в файле go.mod

Как сделать backup

docker exec -it container_id mysqldump -h0 -P9306 feed > feed_backup.sql