Skip to content

Arkosh744/route256

Repository files navigation

Домашнее задание №8

Предыстория

На воркшопе создавали свой LRU, а чуть раньше говорили о кэшировании и об инструментах для него.

Задание

Нужно в сервис нотификаций добавить возможность получения истории уведомлений пользователя за конкретный период и закэшировать её:

  1. Если пользователь уже запрашивал историю за конкретный период, то возвращать её из кэша
  2. Для кэширования использовать либо LRU с воркшопа, либо любое другое решение, например, Redis
  3. Функционал покрыть unit тестами
  4. Требуется обеспечить простоту замены конкретной реализации кэша
  5. 💎 На алмазик реализовать кэширование (с практической пользой) в другом сервисе/участке системы на свое усмотрение

Сроки

Дедлайн: 15 июля 23:59 (сдача) / 18 июля, 23:59 (проверка)

Описание предыдущих дз

Перед запуском проекта убедитесь, что у вас есть config.yaml. Для справки приведен стандартный вид конфига в файле config.yaml.example, который можно использовать как default

Домашнее задание

  • Создать скелеты трёх сервисов по описанию АПИ из файла contracts.md
  • Структуру проекта сделать с учетом разбиения на слои, бизнес-логику писать отвязанной от реализаций клиентов и хендлеров
  • Все хендлеры отвечают просто заглушками
  • Сделать удобный враппер для сервера по тому принципу, по которому делали на воркшопе
  • Придумать самостоятельно удобный враппер для клиента
  • Все межсервисные вызовы выполняются. Если хендлер по описанию из contracts.md должен ходить в другой сервис, он должен у вас это успешно делать в коде.
  • Общение сервисов по http-json-rpc
  • должны успешно проходить make precommit и make run-all в корневой папке
  • Наладить общение с product-service (в хендлере Checkout.listCart). Токен для общения с product-service получить, написав в личку @badger_za

Дедлайн: 27 мая, 23:59 (сдача) / 30 мая, 23:59 (проверка)

Домашнее задание 2

Перевести всё взаимодействие c сервисами на протокол gRPC.

Для этого:

  • Использовать разделение на слои, созданное ранее, заменив слой HTTP на GRPC.
  • Взаимодействие по HTTP полностью удалить и оставить только gRPC.
  • В каждом проекте нужно добавить в Makefile команды для генерации кода из proto файла и установки нужных зависимостей.

Дополнительное задание на алмазик: добавить HTTP-gateway и proto-валидацию.

Дедлайн: 3 июня, 23:59 (сдача) / 6 июня, 23:59 (проверка)

Домашнее задание №3

  1. Для каждого сервиса(где необходимо что-то сохранять/брать) поднять отдельную БД в docker-compose.
  2. Сделать миграции в каждом сервисе (достаточно папки миграций и скрипта).
  3. Создать необходимые таблицы.
  4. Реализовать логику репозитория в каждом сервисе.
  5. В качестве query builder-а можно использовать любую библиотеку (согласовать индивидуально с тьютором). Рекомендуется https://github.com/Masterminds/squirrel.
  6. Драйвер для работы с postgresql: только pgx (pool).
  7. В одном из сервисов сделать транзакционность запросов (как на воркшопе).

Задание на алмазик:

  1. Для каждой БД полнять свой балансировщик (pgbouncer или odyssey, можно и то и то). Сервисы ходят не на прямую в БД, а через балансировщик

Дедлайн: 10 июня, 23:59 (сдача) / 13 июня, 23:59 (проверка)

Домашнее задание №4

  1. Уменьшить время ответа Checkout.listCart при помощи worker pool. Запрашивать не более 5 SKU одновременно.

Worker pool нужно написать самостоятельно. Обязательное требование - читаемость кода и покрытие комментариями.

  1. При общении с Product Service необходимо использовать лимит 10 RPS на клиентской стороне.

Допускается использование библиотечных рейт-лимитеров. В случае собственного читаемый код и комментарии обязательны.

  1. Во всех слоях сервиса необходимо использовать контекст для возможности отмены вызова.

Задания на алмазик:

  1. Синхронизировать рейт-лимитер при помощи БД.
  2. Аннулировать заказы старше 10 минут в фоне. Позаботиться о том, чтобы реплики сервиса не штурмовали БД все вместе.

Дедлайн: 17 июня, 23:59 (сдача) / 20 июня, 23:59 (проверка)

Домашнее задание №5

Необходимо обеспечить полное покрытие бизнес-логики ручек ListCart или Purchase модульными тестами (go test -coverprofile).
Если вдруг ваши слои до сих пор не изолированны друг от друга через интерфейсы, необходимо это сделать.
В качестве генератора моков можете использовать, что душе угодно: mockery, minimoc, gomock, ...

Задание на алмазик: добавить интеграционные тесты для проверки слоя взаимодействия с базой данных.

Дедлайн: 24 июня 23:59 (сдача) / 27 июня, 23:59 (проверка)

Домашнее задание №6

  1. LOMS пишет в Кафку изменения статусов заказов
  2. Сервис нотификаций должен их вычитывать и отправлять нотификации об изменениях статуса заказа (писать в телегу)
  3. Нотификация должна быть доставлена гарантированно и ровно один раз
  4. Нотификации должны доставляться в правильном порядке

Алмазик: Весь новый функционал покрыт юнит тестами плюс сам код написан таким образом, что конфигурацию для нотификаций можно задавать в конфиге и прокидывать в основную логику

Нотификации отправляют в группу по ссылке https://t.me/route255kafka

Дедлайн: 01.07.2023 (сдача) / 04.07.2023 (проверка)

Домашнее задание №7

  1. Перевести логи всех сервисов на структурные. Советую zap, но можете использовать любой другой удобный пакет. Должна быть поддержка уровней логирования.
  2. Покрыть все операции трейсами, настроить сбор трейсов в Jaeger, который должен подниматься в композе вместе со всеми сервисами. Должен быть доступ к веб-интерфейсу Jaeger-а.
  3. Настроить отдачу сервисами метрик и их сбор Прометеем, запущенным в отдельном контейнере. Обязательно иметь счетчик запросов с детализацией по хендлерам и гистограмму времени обработки запросов с детализацией по кодам ответа и хендлерам для серверов, для клиентов только гистограмму. Сделать это лучше всего через интерсепторы. Плюсом можно добавить еще метрик от себя по вкусу, например для баз данных и запросам в апи продакт-сервиса.
  4. 💎 На алмазик добавить в композ контейнер алерт-менеджера и настроить себе в телеграм алерты на падение сервисов и на высокое количество ошибок от запросов в сервисы.
  5. 💎 На алмазик сделать универсальную платформенную библиотеку, через которую удобно было бы создавать grpc-клиенты, уже обернутые метриками и базовыми трейсами, плюс удобно было бы оборачивать метриками и трейсами grpc-сервер.
  6. 💎 На алмазик сделать универсальную платформенную библиотеку, которой удобно было бы создават клиента к базе данных, уже обернутого метриками и трейсами. Трейс должен быть правильно наполнен данными о запросе автоматически. Метрики должны давать детализацию по разным запросам автоматически.

Дедлайн: 8 июля 23:59 (сдача) / 11 июля, 23:59 (проверка)

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published