bot
- основной сервис с телеграм ботомreport-service
- сервис получения отчетов по тратам за период времениmigrate
- cli для обновления файлов atlas миграции для базы данных
api
- proto файлы для grpc взаимодействия с сервисом ботаapp
- пакет для запуска приложенияbot
- бизнес-логика бота, обработка сообщенийclients
- клиенты для внешних сервисовexchange
- клиент внешнего http сервиса с данными о курсе валютgrpc
- клиент для общенияreport-service
с сервисомbot
telegram
- клиент для взаимодействия с telegram
ent
- сгенерированные файлы для работы с PostgreSQLgrpc
- компонент grpc-сервераhttp
- компонент http-роутераmetrics
- декораторы для подстчета метрик и трейсингаmigrations
- сгенированные файлы atlas миграции для базы данныхmodels
- модели базы данныхrepository
- репозитории для взаимодействия с базой данныхservice
- внутренние сервисыcache
- сервис кешированияexchange
- сервис получения курса валютkafka
- взаимодействиеbot
иreport-service
через очередь сообщенийusercontext
- контекст общения с пользователями, хранящийся в rediswastereport
- сервис генерации отчета по тратам
log
- интерфейс и реализация для логгера для всего проекта
Pdf файл с архитектурой сервиса и расчетами нагрузки на 1000, 100000 и 1000000 пользователей (ДЗ 4)
- Метрики сервиса: http://localhost:8080/metrics
- Graylog: http://localhost:7555
- Prometheus: http://localhost:9090
- Grafana: http://localhost:3000
- Jaeger: http://localhost:16686
Продолжить работу над ботом, каркас которого создали на воркшопе.
Нужно добавить функционал:
- Команда добавления новой финансовой "траты". В трате должна присутствовать сумма, категория и дата. Но можете добавить еще поля, если считаете нужным. Придумайте, как оформить команду так, чтобы пользователю было удобно ее использовать.
- Хранение трат в памяти, базы данных пока не используем.
- Команда запроса отчета за последнюю неделю/месяц/год. В отчете должны быть суммы трат по категориям.
Нужно в нашем боте добавить новый функционал:
- Команда переключения бота на конкретную валюту - "выбрать валюту"
- После ввода команды бот предлагает выбрать интересующую валюту из четырех: USD, CNY, EUR, RUB
- При нажатии на нужную валюту переключаем бота на нее - результат получение трат конвертируется в выбранную валюту.
- Храним траты всегда в рублях, конвертацию используем только для отображения, ввода и отчетов
Особенности
- При запуске сервиса мы в отдельном потоке запрашиваем курсы валют.
- Запрос курса валют происходит из любого из открытых источников.
- Сервис должен завершаться gracefully.
- Завести PostgreSQL в Docker, резметить таблички и схемы, любые действия с БД проводить только через миграции
- Перенести хранение данных из памяти приложения в базу данных
- Добавить бюджеты/лимиты на траты в месяц, при проведении транзакций проверять согласованность данных (превышен ли бюджет и тд)
- Сгенерировать тестовые данные для таблицы расходов
- Создать индексы на таблицу расходов, в комментариях к миграции пояснить выбор индексируемых колонок и типа индекса
Что будет оцениваться:
- низкая связность кода, зависимости через интерфейсы
- нормализованная структура данных в БД
- правильность обработки транзакций и ошибок
Дополнительные задания:
- покрыть бизнес логику тестами, взаимодействие с базой замокать
- интеграционные тесты на sql код
Задание
Нарисовать три схемы на (1000, 100 000, 1 000 000 пользователей). Сделать это можно в любом подходящем для этого редакторе (app.diagrams.net, miro.com, etc...). При проектировании на схеме необходимо создать табличку где будем указывать следующие вводные, разберем на примере сервиса почтовых рассылок.
Функциональные требования (зачем нужен сервис, какую проблему он решает):
- отправляет почтовые рассылки
- позволяет тестировать а/б
- предоставляет статистику
Не функциональные требования:
- высокая скорость работы
- высокая отказоустойчивость
Дополнительные требования:
- возможность push нотификаций
- отслеживания доставки в реальном времени на grafana
Нагрузка:
- n RPS (средняя, максимальная)
Оценка хранилища:
- за год мы отправим n сообщений
- в год мы ожидаем прирост на n петабайт для хранения данных
- через n времени необходимо будет реплицировать базу, перевести запросы на чтение с асинхронной реплики для аналитики
- бекапы (x3 к размеру данных)
Оценка размера оперативной памяти:
- Базе данных требуется n ГБ на инстанс
- Кеш хранит 20% запросов за 24 часа, в среднем сообщение занимает n byte, необходимо n гигабайт памяти.
Вам необходимо сделать оценку по данному шаблону, с вашими цифрами и формулировками по сервису учета расходов. Табличку можно сделать общую на три схемы.
- Перевести бота на ведение структурированных логов в STDOUT.
- Инструментировать код трейсингом. Создавать спан на каждое пришедшее сообщение. Корректно прокидывать контекст внутрь дерева функций и покрыть спанами важные части.
- Добавить метрики количества сообщений и времени обработки одного сообщения от пользователя. Разбить эти метрики по разным типам команд.
Задания на бонусы:
- Придумать и реализовать еще несколько полезных метрик для своего бота
- Добавить в свой композ-файл и настроить инфраструктуру сбора метрик и создать рабочий дашборд с несколькими панелями в Графане
- Добавить в композ-файл и настроить инфраструктуру сбора трейсов. Трейсы должны успешно искаться через веб-интерфейс Jaeger
Задание
Нужно в нашем боте добавить функционал кэширования расходов из отчета:
- Если пользователь уже запрашивал отчет за конкретный период, то возвращать расходы по нему из кэша
- Для кэширования использовать либо LRU с воркшопа, либо любое другое решение, например, Redis или Memcache
Добавить сервис по построению произвольных отчетов вашего бота. Сервис должен быть реализован как отдельный микросервис, который запускается вместе с остальными в вашем компоуз файле.
Взаимодействие с сервисом построения отчетов осуществляется следующим образом:
- пользователь выбирает в телеграм боте построить n отчет
- сервис телеграм бота отправляет (продюсит) запрос на построение отчета в кафку
- сервис построения отчетов потребляет (консюмит) сообщение из кафки, формирует нужный отчет
- вызывает сервис телеграм бота по gRPC с результатами отчета
- результаты возвращаются пользователю в телеграм
Задания на бонусы:
- добавить в интерцепторы gRPC метрики на вызываемые методы
- добавить метрики в продюсере и консюмере
- создать на стороне сервера grpc-gateway с возможностью вызова по gRPC и с помощью RESTful API
- добавить валидацию запросов путем добавления плагина в proto файле