An open API service indexing awesome lists of open source software.

https://github.com/sirazetdinova/linktracker

Link Tracker
https://github.com/sirazetdinova/linktracker

java java-spring lombok mapper maven modelmapper postgresql rest-api spring spring-boot spring-framework spring-mvc swagger

Last synced: about 2 months ago
JSON representation

Link Tracker

Awesome Lists containing this project

README

          

# Т-Банк, Академия бэкенда. Проект 5: Link Tracker

### Описание
Приложение для отслеживания обновлений контента по ссылкам. При появлении новых событий пользователь получает уведомление в Telegram.
Приложение обнаруживает изменения на платформах StackOverflow и GitHub, и оповещает о новых событиях (комментарии, ответы, pull request или issues).

![video](путь/к/видео.mp4)

- Проект написан на `Java 21` с использованием `Spring Boot 3`
- Проект состоит из 2 частей:
- **Bot** взаимодействие с пользователем через Telegram
- **Scrapper** отслеживание обновлений, работа с БД и отправка уведомлений
- Сервисы общаются через REST API. Асинхронный обмен сообщениями через Apache Kafka. Кэширование реализовано с использованием Redis для часто запрашиваемых данных.
- База данных PostgreSQL с поддержкой двух режимов доступа raw SQL и ORM (JPA/Hibernate)
- Есть ограничение скорости (rate limiting), таймауты, повторные попытки (retries), размыкатели цепи (circuit breakers) и механизмы fallback для коммуникаций HTTP и Kafka.
- Интегрированные метрики с Prometheus и Grafana для наблюдаемости, включая бизнес-специфические метрики.
- Настроена контейнеризация с помощью Docker, с интеграцией CI/CD для сборки и публикации образов.

### Возможности
### Взаимодействие с пользователем через Telegram-бот

- Бот поддерживает следующие команды:
- /start регистрация пользователя
- /help вывод списка доступных команд
- /track начать отслеживание ссылки
- /untrack прекратить отслеживание ссылки
- /list показать список отслеживаемых ссылок (cписок ссылок, полученных при /track).

- Команды вроде /track используют разговорный поток (например, запрос тегов и фильтров после ссылки).
- Игнорирование неизвестных команд с уведомлением; предотвращение добавления дубликатов с сообщением.
- Запросы /list кэшируются в Redis для производительности, с инвалидацией при изменениях в списке пользователя.

### Отслеживание ссылок и уведомления

- Поддерживаемые платформы StackOverflow (вопросы, ответы, комментарии) и GitHub (репозитории, pull request, issues).
- Запланированные проверки через API платформ, а не парсинг HTML. Обнаружение по временным меткам последнего изменения.
- Детали уведомлений:
- StackOverflow включает заголовок вопроса, имя пользователя, время создания и превью (первые 200 символов) нового ответа или комментария.
- GitHub включает заголовок PR/Issue, имя пользователя, время создания и превью (первые 200 символов) описания.
- Уведомления отправляются через Telegram. Изначально синхронно по HTTP, расширено до асинхронного Kafka с очередью мертвых писем для некорректных сообщений.
- Использует Spring @Scheduled для периодических проверок, обработка ссылок батчами для избежания перегрузки памяти.

### API и интеграция

- Все endpoint'ы соответствуют предоставленной спецификации. LinkUpdate в Bot API может быть расширен для лучшего форматирования.
- Кастомные declarative клиенты для API GitHub и StackOverflow, без SDK. Внутреннее общение между Bot и Scrapper через REST.
- Настраиваемый транспорт HTTP или Kafka для уведомлений. Формат JSON для сообщений Kafka.

### База данных и персистентность

- Схема определена в SQL-миграциях с Liquibase. Включает таблицы для пользователей, ссылок, тегов, фильтров и обновлений.
- Режимы доступа: Два провайдера:
- Raw SQL с использованием JDBC.
- ORM с использованием JPA/Hibernate.
- Переключение режимов через access-type=SQL или access-type=ORM.
- Миграции запускаются вручную через кастомную функцию; хранятся в директории migrations/.

### Устойчивость и отказоустойчивость

- Таймаут: Настраиваемый для всех HTTP-запросов.
- Повторные попытки: Применяются к HTTP-вызовам с настраиваемыми попытками, backoff (constant) и кодами, на которые применяется retry.
= Ограничение скорости: На основе IP для публичных endpoint'ов, настраиваемо.
- Размыкатель цепи: Конфигурация sliding window для разрыва соединений при длительных сбоях (например, slidingWindowSize=1, failureRateThreshold=100%).
- Fallback: Переключение на альтернативный транспорт (HTTP на Kafka или наоборот) при сбоях.
- Обработка ошибок: Кастомная обработка ошибок API, перенаправление некорректных сообщений в DLQ Kafka.

### Мониторинг и метрики

- Endpoint: /metrics на отдельном порте.
- Инструменты: Prometheus для сбора, Grafana для дашбордов.
- Дашборды:
- Параметризованный (по имени приложения) с RED-метриками (Rate, Errors, Duration), использованием памяти по времени.
- Бизнес-метрики: Сообщения в секунду, график активных ссылок по типу (GitHub/StackOverflow), p50/p95/p99 времени scrape по типу.
- Интеграция: Использует Micrometer для сбора метрик в Spring Boot.