Национальная платформа агрегации и мониторинга новостей: собирает статьи с зарегистрированных новостных сайтов на туркменском, русском и английском, фильтрует их по ключевым словам и формирует отчёты.
Моя роль
Backend-разработчик. Реализовал сбор новостей, поиск источников, API и отчёты.
Стек
Go
Echo
GORM
PostgreSQL
RSS
Serper API
Задача
Аналитикам нужны были все публикации по заданным темам на множестве сайтов на трёх языках, а новые источники появляются постоянно, поэтому фиксированный список сайтов упускает часть публикаций.
Архитектура
Фоновый цикл с настраиваемым интервалом опрашивает RSS-ленты, декодирует записи, сверяет их с ключевыми словами, определяет язык и сохраняет новости в базу корпуса через upsert. Задача поиска опрашивает Google News, извлекает домены, отбрасывает известные и ставит остальные в очередь модерации. Админский и публичный API (Echo) отдают новости, отчёты и выгрузки в Excel.
Ключевые решения
01Upsert делает опрос идемпотентным
Почему
Ленты повторяют записи между опросами. Вставка с ON CONFLICT позволяет запускать цикл сколько угодно часто без дубликатов.
02Найденные источники проходят модерацию
Почему
В результатах поиска много шума. Новые домены сохраняются со статусом new, valid или invalid, и только одобренные попадают в список опроса — охват растёт, а корпус не засоряется.
03Отдельные базы для данных платформы и корпуса
Почему
Корпус новостей быстро растёт и используется для отчётов. Отделение его от пользователей и API-ключей позволяет делать бэкапы и миграции каждой базы независимо.
Компромисс
Нет join-ов между базами; сервис держит два подключения.
Что я сделал
Сбор RSS с зарегистрированных сайтов по расписанию с фильтрацией по ключевым словам
Определение языка для туркменского, русского и английского контента
Поиск новых источников через Google News (Serper API) с очередью модерации
Две базы PostgreSQL: пользователи и ключи платформы и корпус новостей
Идемпотентные upsert, SQL-отчёты по сайтам и языкам, выгрузка в Excel