Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Монолит + микросервисы = любовь

Монолит + микросервисы = любовь

Максим Филипенко (Marilyn, разработчик) @ Moscow Python Meetup 57
"Рассказ о том, как мы внедряли сервисную архитектуру в монолитный B2B-проект. Чем это было хорошо, чем это было плохо, как поменялся наш workflow".

Видео: http://www.moscowpython.ru/meetup/57/monolith-microservices-love/

Moscow Python Meetup

June 26, 2018
Tweet

More Decks by Moscow Python Meetup

Other Decks in Programming

Transcript

  1. • Кодовая база растет, её становится сложнее тестировать и поддерживать

    • Связность между модулями может вызывать неожиданные баги Проблемы монолитов
  2. • Кодовая база растет, её становится сложнее тестировать и поддерживать

    • Связность между модулями может вызывать неожиданные баги • Новым разработчикам сложно разобраться с проектом Проблемы монолитов
  3. • Кодовая база растет, её становится сложнее тестировать и поддерживать

    • Связность между модулями может вызывать неожиданные баги • Новым разработчикам сложно разобраться с проектом • Выкатка занимает много времени (тесты!) Проблемы монолитов
  4. • Кодовая база растет, её становится сложнее тестировать и поддерживать

    • Связность между модулями может вызывать неожиданные баги • Новым разработчикам сложно разобраться с проектом • Выкатка занимает много времени (тесты!) • Сложно обновляться и использовать новые технологии Проблемы монолитов
  5. • Переиспользование общей логики между командами с разным стеком •

    Использование несовместимых технологий Неразрешимые проблемы
  6. • Где хранить • Как именовать • В каком случае

    нужно создавать Внутренние пакеты
  7. • Где хранить • Как именовать • В каком случае

    нужно создавать • Версионирование Внутренние пакеты
  8. • Где хранить • Как именовать • В каком случае

    нужно создавать • Версионирование • Changelog изменений Внутренние пакеты
  9. deploy_pypi: stage: deploy only: - master script: … - echo

    "repository="$PYPI_REPO_URL >> ~/.pypirc - echo "username="$PYPI_USER >> ~/.pypirc - echo "password="$PYPI_PASSWORD >> ~/.pypirc - python3 setup.py sdist bdist_wheel upload -r pypi-internal Внутренние пакеты Тестируются и загружаются в локальный PyPI через Gitlab CI
  10. services: app: image: development build: context: . dockerfile: ./docker/development/Dockerfile depends_on:

    - base links: - postgres - redis environment: - REDIS_URI=redis://redis:6379/0 ports: - "5000:80" command: flask run --host=0.0.0.0 --port=80 postgres: image: postgres:10.0 ports: - "55432:5432" redis: ...
  11. $ git clone path-to-git-repo $ cd path-to-git-repo $ docker-compose up

    ... app_1 | Running command: flask run --host=0.0.0.0 --port=80 app_1 | * Running on http://0.0.0.0:80/ (Press CTRL+C to quit) app_1 | * Restarting with stat app_1 | * Debugger is active! Начало работы над проектом
  12. stages: - build - test - cleanup - publish …

    test: stage: test script: - '$DOCKER_COMPOSE run app py.test -p no:cacheprovider’ publish master: stage: publish only: - master script: - 'docker build -f docker/base/Dockerfile -t $CI_REGISTRY_IMAGE/base-master .' ... - 'docker push $CI_REGISTRY_IMAGE/base-master' ...
  13. • Тестировать – сложно • Написать хороший тест – еще

    сложнее • 100% code coverage не гарантирует НИЧЕГО (особенно когда есть внешние API) Тестирование: проблемы
  14. • Тестировать – сложно • Написать хороший тест – еще

    сложнее • 100% code coverage не гарантирует НИЧЕГО (особенно когда есть внешние API) • Сложная логика между сущностями Тестирование: проблемы
  15. • Не пытаться протестировать все возможные ответы площадок • На

    каждый endpoint должны быть тесты Тестирование: решение
  16. • Не пытаться протестировать все возможные ответы площадок • На

    каждый endpoint должны быть тесты • Для имитации сетевого взаимодействия использовать mock и responses Тестирование: решение
  17. • Не пытаться протестировать все возможные ответы площадок • На

    каждый endpoint должны быть тесты • Для имитации сетевого взаимодействия использовать mock и responses • Декларативное создание сущностей (FactoryBoy) Тестирование: решение
  18. • Не пытаться протестировать все возможные ответы площадок • На

    каждый endpoint должны быть тесты • Для имитации сетевого взаимодействия использовать mock и responses • Декларативное создание сущностей (FactoryBoy) Тестирование: решение
  19. @pytest.fixture(scope="session") def session(db_fixture): db_fixture.session.begin() yield db_fixture.session db_fixture.session.remove() @pytest.fixture(scope="function") def transaction(session):

    session.begin(nested=True) try: yield session finally: session.rollback() @pytest.fixture(scope=“function") def mock_contextmanager(session): with patch('src.yourmodule.contextmanager') as mocked: mocked_context = MagicMock() mocked_context.__enter__.return_value = session mocked.return_value = mocked_context yield mocked
  20. • Нет понимания, что должен делать сервис • Вынесение должно

    быть обоснованным Когда НЕ НУЖНО заводить микросервис
  21. • Нет понимания, что должен делать сервис • Вынесение должно

    быть обоснованным • Если нужен простой CRUD Когда НЕ НУЖНО заводить микросервис
  22. • Связи между сервисами накладывают определенную сложность • Сложность и

    особенности предметной области никуда не делись Минусы
  23. • Связи между сервисами накладывают определенную сложность • Сложность и

    особенности предметной области никуда не делись • Тулинг пока отстает Минусы
  24. • Связи между сервисами накладывают определенную сложность • Сложность и

    особенности предметной области никуда не делись • Тулинг пока отстает • Администрирование стало сложнее Минусы
  25. • Удалось добиться переиспользования логики между командами • Можно работать

    над задачами не вникая в старый код • Можно быстро вносить и выкатывать изменения Плюсы
  26. • Удалось добиться переиспользования логики между командами • Можно работать

    над задачами не вникая в старый код • Можно быстро вносить и выкатывать изменения • Легко подбирать подходящий инструмент под конкретную задачу Плюсы