oruchkin / Async_API_sprint_3

AsyncAPI Спринт 3
1 stars 1 forks source link

Проектная работа 11 и 12 спринтов

В этом спринте мы создали сервис нотификаций, который позволяет:

Взаимодействие построено на RabbitMQ, в качестве базы используется MongoDB.

Допущения

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

Работа с сокетами на самом деле должна выглядить иначе, т.к. пользователь подключается к определенному инстансу и нотификация необходимо отправлять с него.

Проектная работа 10 спринта

В этом спринте наша команда:

Доска на которой мы вели задачи:

Канбан доска

- Подключение отправки ошибок в Sentry

Отправка в Sentry реализована в сервисе API, т.к. только в нем на данный момент ведется активная разработка и чтобы не копировать одно и то же много раз.

- Добавиление CRUD для закладок, лайков и рецензий

В качестве варианта разработки был выбран подход добавления функционала в существующий сервис api. Этот подход был выбран, т.к. социальная составляющая в описании фильма достаточно важна и не хотелось бы нагружать клиента дополнительным походом в API за этими данными (плюс у нас тут же есть кэш для этого).

Для простоты демонстрации user_id передается явным образом. В GET api/films сделана примерная реализация получения пользовательских данных из авторизационного заголовка (включая валидацию токена и introspect при необходимости).

Лайки реализованы, как было рекомендовано в задаче, через рейтинг от 0 до 10. Для рецензий добавлена сортировка по количеству пололжительных пользовательских реакций. Для рецензий реакции представляют из себя булевый флаг - согласен, не согласен.

Лайки и закладки добавлены в API поиска по фильмам, т.е. для найденных фильмов отображается пользовательский рейтинг, количество голосов и добвлен ли этот фильм в закладки для текущего пользователя (если он авторизован).

- Подключение ELK stack к UGC:

запустить сервисы UGC + ELK стэк можно этой командой из папки UGC:

docker-compose --profile ugc --profile elk up --build -d

в файле api/src/api/ugc_logs.json уже есть шаблонные логи которые заполнятся автоматически

Чтобы завести паттерн, нужно загнать данные в logastash: 1) запустить все сервисы и отправить сюда http://127.0.0.1:5000/event

{
    "type": "movie_progress",
    "user_id": "4518e644-1ff3-4003-a14e-99dfe3fdd7ab",
    "movie_id": "e9897504-9b73-40bb-a22e-815daf7a190d",
    "progress": 1232
}

перейдите в Management → Stack Management → Index Patterns и нажмите Create index patter имя app-2024.08.


Проектная работа 9 спринта

Мы cделали User Generated Content Service

README.md спринта 9 находится здесь:

ссылка на README.md 9 спринта


Проектная работа 8 спринта

В этом спринте наша команда:

Доска на которой мы вели задачи:

Канбан доска

Как запустить проект:

из папки infra запускаем:

docker-compose --profile idp --profile admin up

запустятся postgres, redis, idp, keycloak, jaeger, django-admin

Детальнее про задачи

- подключение внешних провайдеров:

Keycloak external IDP

Мыможем использовать только Direct Naked Impersonation, т.к. external to internal token exchange требуют валидации токена, который VK ID не предоставляет Чтобы настроить Keycloak внимательно следуем инструкции: https://www.keycloak.org/docs/latest/securing_apps/#direct-naked-impersonation

VK ID

Просто делаем все, как тут сказано https://id.vk.com/about/business/go/docs/ru/vkid/latest/vk-id/connection/create-application

Google

Настройка Google с использованием этого руководства:

https://keycloakthemes.com/blog/how-to-setup-sign-in-with-google-using-keycloak

- партицирование:

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

в скритпе есть две переменных POSTGRES_HOST и POSTGRES_DB которые отличаются от базового .env там прописаны примеры которые перезаписывают значение для локального применения (их можно менять)

скрипт создаст партиции в таблице user_entity

партиции


ВНИМАНИЕ!

Ниже данные с предыдущих спринтов

то что ниже не относится к спринту 8


Спринт 7

ридми спринта 7 находится здесь:

ссылка на README.md 7 спринта


Проектная работа 6 спринта

В этом спринте наша команда:

Доска на которой мы вели:

Канбан доска

Docker compose

Profiles

Чтобы не поднимать всю вселенную разом, можно использовать профили, например:

docker compose --profile admin up

Доступные профили:

External volumes

В docker-compose используются внешние статические зависимости, чтобы сделать управление данными более надежным. Чтобы инициализировать такую зависимость в docker, нужно выполнить команду:

docker volume create <volume name> --opt type=none --opt device=<path to volume> --opt o=bind

screenshot вот так можно удобно создавать админа make admin в терминале

screenshot чтобы перезапустить etl сервис и чтобы он снова прогнал все данные из постгри в эластик, нужно внутри контейнера удалить etl_state.json (на случай если тестами все почистишь)

screenshot Тесты в моменте фэйлятся, но подключаются и к redis + elastic, и чистят эластик полностью (что плохо) пофикшу позже

docker-compose --env-file .env up --build запуск если env слетают

IDP

Check later: https://www.reddit.com/r/Python/comments/16pin4l/a_maintained_library_for_oidc_in_python/

JWT libraries: https://jwt.io/libraries?language=Python

Keycloak

Development

Setup all the environment variables and run

docker compose --profile idp-dev up --attach keycloak

Setup client

From https://medium.com/@imsanthiyag/introduction-to-keycloak-admin-api-44beb9011f7d Go to Clients, on the Clients list tab select admin-cli and in Capability config set Client authentication to On. Also check Service accounts roles. After hitting Save you must see new Credentials tab on the top. Switch to that tab and copy Client secret value. Important step. To perform specific operations like create users client must have roles assigned. Click on the admin-cli client, then open Service accounts roles tab and assign manage-users role from the master-realm. screenshot

Also we need manage-clients role to add roles for current client. And view-clients to get id of the current client.

Tips

Open Dev tab in browser to see what requests Keycloak UI is sending to the API

PlantUML

Run with

docker run -d -p 8080:8080 plantuml/plantuml-server:jetty

update vscode settings (https://marketplace.visualstudio.com/items?itemName=jebbs.plantuml#use-plantuml-server-as-render)

"plantuml.server": "http://host.docker.internal:8080",
"plantuml.render": "PlantUMLServer",
"plantuml.exportOutDir": "docs/diagrams/out",

Alt+D to preview

Online editor https://www.plantuml.com/plantuml or https://www.planttext.com/

diagram