Giter Site home page Giter Site logo

async-api-for-cinema's Introduction

Проектные задания для спринта 4 и 5

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

Важное сообщение для тимлида: для ускорения проверки проекта укажите ссылку на приватный репозиторий с командной работой в файле readme и отправьте свежее приглашение на аккаунт BlueDeep.

В папке tasks_sprint_4 ваша команда найдёт задачи, которые необходимо выполнить в первом спринте второго модуля. Обратите внимание на задачи 00_create_repo и 01_create_basis. Они расцениваются как блокирующие для командной работы, поэтому их необходимо выполнить как можно раньше.

Мы оценили задачи в стори поинтах, значения которых брались из последовательности Фибоначчи (1,2,3,5,8,…).

Вы можете разбить имеющиеся задачи на более маленькие, например, распределять между участниками команды не большие куски задания, а маленькие подзадачи. В таком случае не забудьте зафиксировать изменения в issues в репозитории.

От каждого разработчика ожидается выполнение минимум 40% от общего числа стори поинтов в спринте.

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

В папке tasks_sprint_5 ваша команда найдёт задачи, которые необходимо выполнить во втором спринте модуля "Сервис Async API".

Как и в прошлом спринте, мы оценили задачи в стори поинтах.

Вы можете разбить эти задачи на более маленькие, например, распределять между участниками команды не большие куски задания, а маленькие подзадачи. В таком случае не забудьте зафиксировать изменения в issues в репозитории.

От каждого разработчика ожидается выполнение минимум 40% от общего числа стори поинтов в спринте.

Добавление индекса movies и данных о фильмах в elasticsearch

  1. В файле docker-compose.override.yml дожен быть проброшен порт 9200 до elasticsearch services: elastic: ports: - "9200:9200"

  2. В таком случае elasticsearch будет доступен по адресу http://127.0.0.1:9200

  3. Перейти в папку init_es

  4. Запустить скрипт init_es_movies.py

Запуск процесса etl

для запуска процесса на локальном хосте необходимо создать пустую папку state_storage в директории etl до поднятия контейнеров

async-api-for-cinema's People

Contributors

no80dy avatar si32 avatar

Forkers

si32 ruslan964

async-api-for-cinema's Issues

Ревью кода

Проведите ревью кода своих коллег по команде на SOLID.

Создать репозиторий, дать в него доступы

Создать репозиторий для проекта на основе шаблона, расшарить доступы для тиммейтов и кодревьюеров

Каждый микросервис реализуется и работает как полностью независимая система, предоставляющая доступ к своей внутренней логике и данным с помощью определенного интерфейса. Это способствует повышению гибкости ПО, поскольку каждый микросервис является независимой единицей в плане разработки и масштабирования.

Будучи независимыми сервисами с четкими границами, не копируйте admin и etl в новый репозиторий.

Оценка: 1

SOLID для бизнес-логики

Проверить класс по работе с бизнес-логикой на SOLID. Изменить структуру программы, если это необходимо.

Оценка: 8

Доработать ETL для записи в ES данных жанров

Добавить новый ETL пайплайн, в котором создается и заполняется индекс genres из всех жанров, которые есть в фильмах. Плоский индекс без денормализованных данных. Хранить ссылки на фильмы не нужно.

Оценка: 5

SOLID для Elastic Search

Проверить класс по работе с хранилищем на SOLID. Изменить структуру программы, если это необходимо.

Оценка: 5

SOLID для Redis

Проверить класс по работе с кэшом на SOLID. Изменить структуру программы, если это необходимо.

Оценка: 5

Code review

Хорошая работа 👍 Далее несколько рекомендаций по доработке:

  1. В docker-compose.yaml не нужно пробрасывать порты ES наружу. В части безопасности приложения это плохо.

  2. В продакшене не рекомендуется запускать код через uvicorn напрямую, вот тут про это написано несколько слов https://www.uvicorn.org/deployment/#gunicorn.

  3. А это тут точно нужно? Кажется в этом сервисе не используется postgres

    echo "Waiting for postgres..."
    while ! nc -z $DB_HOST $DB_PORT; do
    sleep 0.1
    done
    echo "PostgreSQL started"

  4. Конфиг src/core/config.py можно было оформить в виде класса:

    from pydantic import BaseSettings
    
    class Settings(BaseSettings):
        redis_host: str = Field(..., env='REDIS_HOST')
        class Config:
            env_file = '.env'
    
    settings = Settings()

    и затем использовать инстанс конфига setting в разных частях приложения. Плюс такого подхода в том, что происходит валидация типов переменных окружения при помощи pydantic. Также при создании инфраструктуры под тесты, можно будет наследоваться от этого класса и создать отдельный тестовый конфиг со своими переменными окружения. Подробнее https://pydantic-docs.helpmanual.io/usage/settings/

    Еще пример:

    class Settings(BaseSettings):
        project_name: str = 'Some project name'
        redis_host: str = ...
        redis_port: int = ...
        elastic_host: str = Field(..., env='ELASTIC_HOST_NAME')
        elastic_port: int = Field(9200, env='ELASTIC_PORT')

    BaseSettings регистронезависимый и работает вот так:
    - присвоит в поле project_name значение переменной PROJECT_NAME, а если ее нет, то даст значение по умолчанию 'Some project name'
    - redis_host мы сделали обязательным полем (... - служебный символ), если не будет переменной окружения REDIS_HOST, то проект не заведется
    - elastic_host мы сделали обязательным и явно указали имя переменной окружения, т.к. она отличается от имени поля
    - elastic_port так же как и с хостом, но указали и значение по умолчанию

  5. Начиная с python 3.10 можно не использовать Optional из модуля typing. В номов синтаксисе можно использовать вот такую конструкцию: redis: Redis | None = None

  6. С версии python 3.9 для стандартных коллекций больше не нужен модуль typing: https://docs.python.org/3.9/whatsnew/3.9.html#type-hinting-generics-in-standard-collections.

  7. Учитывая два пункты выше вот тут можно сделать вот так:

    class Film(FilmShort):
        title: str
        imdb_rating: float | None
        description: str | None
        genres: list[Genres]
        actors: list[IdName] | None
        writers: list[IdName] | None
        directors: list[IdName] | None
  8. Параметры пагинации в эндпоинтах необходимо дооформить в части описания для Swagger и их необходимо валидировать, например, так.

    page_size: Annotated[int, Query(description='Pagination page size', ge=1)] = 10,

    https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#import-query-and-annotated
    Про валидацию посмотрите тут https://fastapi.tiangolo.com/tutorial/path-params-numeric-validations/#number-validations-greater-than-or-equal это применимо и к Query

  9. Текстовые сообщения, отдаваемые пользователю, (film not found) у вас расположены в разных местах кода, если появится задача добавить информативности или изменить текст сообщения, или встанет вопрос про мультиязычность, то придется по всему проекту выискивать и менять. Будет проще справиться с этой задачей, если такие сообщения будут вынесены в отдельное место в виде констант (например).

Настроить докерфайл и докеркомпоуз

Нужен Dockerfile для билда бекенда для API. Также нужно создать (или адаптировать созданные ранее) docker-compose, чтобы поднимались все сервисы разом.

Оценка: 5

Доработать ETL для записи в ES данных персоналий

Добавить новый ETL пайплайн, в котором создается и заполняется индекс persons из всех людей, которые есть в фильмах. Плоский индекс без денормализованных данных. Хранить роли и ссылки на фильмы не нужно.

Оценка: 5

Code review

Отличная работа! Вы молодцы! Предложения по доработке:

  1. С развитием проекта в тестах фикстур будет все больше и больше, и их нужно систематизировать. Можно вынести в отдельный файл (затем добавлять другие файлы, логически разделяя их) и тем самым облегчим conftest.py. Для этого есть pytest_plugins
  2. В скриптах ожидания ES и Redis в тестах вместо вечного цикла, в который можно попасть при возникновении сложностей, лучше использовать backoff из прошлых спринтов. Он более функционален в сравнении с вечным циклом, теоретически он может сигнализировать команде поддержки после определенного количества попыток.
  3. Давай заменим print по всему коду на logging
    https://realpython.com/python-logging/
  4. Этот маркер можно указать один раз на уровне файла: https://github.com/pytest-dev/pytest-asyncio/releases/tag/v0.20.2/
  5. По SOLID молодцы, что вынесли логику работы с хранилищами. Для классов работы с elastic, например, ElasticGenreHandler было бы неплохо также сделать абстрактные классы. Чтобы потом было проще перейти на другое хранилище отнаследовавшись от абстрактного класса.

Кеширование данных в Redis

Кэшировать ответы ручек, запрошенных с одинаковыми параметрами, чтобы не ходить лишний раз в Elasticsearch.

Оценка: 8

Документация OpenAPI

Подготовить документацию для клиентов сервиса, используя OpenAPI

Оценка: 5

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.