Архитектура Bank Recommendation Service - Rzavsky-ev/StarBank GitHub Wiki

Диаграмма компонентов приложения, которая показывает внешние взаимодействия системы:

componentDiagram %% Внешние системы component "Telegram" as tg component "Клиентское приложение" as client component "Система мониторинга" as monitoring

%% Основные компоненты
component "API Gateway" {
    component "RecommendationController"
    component "RuleController"
    component "ManagementController"
}

component "Сервисный слой" {
    component "RecommendationService"
    component "RuleService"
    component "TelegramBotService"
}

component "Репозитории" {
    component "UserDataRepository"
    component "DynamicRuleRepository"
}

component "Базы данных" {
    database "H2 (транзакции)" as h2
    database "PostgreSQL (правила)" as pg
}

%% Взаимодействия
tg --> API Gateway : Запросы рекомендаций
client --> API Gateway : REST API
monitoring --> API Gateway : /management/health

API Gateway --> "Сервисный слой"

"Сервисный слой" --> "Репозитории" : Данные
"Репозитории" --> h2 : Read-only
"Репозитории" --> pg : Read/Write

note right of "Сервисный слой"
    Кеширование результатов:
    - Caffeine
    - 3 уровня (по типам запросов)
end note

Ключевые элементы архитектуры

Внешние вызовы (стрелки внутрь):

  • Telegram — запросы от пользователей через бота
  • Клиентские приложения — мобильные/веб-приложения банка
  • Система мониторинга — проверка здоровья сервиса
  • Админ-панель — управление правилами менеджерами

Внешние системы (стрелки наружу):

  • H2 Database — чтение транзакционных данных
  • PostgreSQL — хранение динамических правил
  • (Неявно) Telegram API — для отправки сообщений

Критические пути данных:

graph LR A[Клиент] --> B[API Gateway] B --> C[Сервис рекомендаций] C --> D[Кеш] C --> E[Репозиторий транзакций] E --> F[H2] C --> G[Репозиторий правил] G --> H[PostgreSQL]

Технологии подключения:

  • К H2: — JdbcTemplate (JDBC)
  • К PostgreSQL: — Spring Data JPA
  • Кеш: — Caffeine (in-memory)

Диаграмма деятельности (Activity Diagram) для алгоритма выдачи рекомендаций с учетом как статических, так и динамических правил:

activityDiagram title Алгоритм выдачи рекомендаций start :Получить запрос с user_id;

partition Инициализация {
    :Загрузить профиль пользователя из H2;
    :Загрузить статические правила (хардкод);
    :Загрузить динамические правила из PostgreSQL;
}

partition Проверка правил {
    fork
        :Проверить статические правила|
        note right: 3 фиксированных правила\nиз ТЗ (Invest 500, Top Saving, Простой кредит);
        
        :Проверить динамические правила|
        note left: Правила из БД\nс JSON-логикой;
    fork again
        :Проверить кеш рекомендаций|
        note: Кеширование результатов\nпо user_id;
    end fork
    
    :Объединить результаты;
}

partition Финализация {
    if (Есть подходящие продукты?) then (да)
        :Обновить статистику срабатываний;
        :Записать в кеш;
        :Сформировать ответ с рекомендациями;
    else (нет)
        :Вернуть пустой список;
    endif
}

stop

Входные данные:

  • user_id: — идентификатор пользователя
  • Статические правила — 3 бизнес-правила из ТЗ
  • Динамические правила — из таблицы dynamic_rules

Ключевые этапы:graph TD

A[Старт] --> B[Загрузка данных] B --> C[Параллельная проверка] C --> D{Есть совпадения?} D -->|Да| E[Сбор статистики] D -->|Нет| F[Пустой ответ] E --> G[Кеширование]