Провели большой практический стрим про разделение на модули и микросервисы

Разделение на модули и микросервисы

Мы дошли до программирования доменной модели аукциона. У нас уже есть подробное задание, которое теперь нужно реализовать в коде. Нужно будет разобраться с доменными контекстами и пройтись по пользовательским сценариям. Это мы рассмотрим в следующих скринкастах.

Но помимо аукциона нам будет крайне полезно более ёмко рассмотреть примеры из других предметных областей. Для этого мы проведём отдельный большой обобщающий практический стрим про декомпозицию кода на модули и микросервисы:

Для участников также будет полезен мой доклад на смежную тему:

Вертикальное разделение кода, тестов и конфигов

На стриме как раз дополним этот подход расcмотрением внутренностей этих модулей и способами взаимодействия между ними.

UPD: Нарисовали на стриме:

Для скидки можете сначала оформить подписку на скринкасты. А посмотреть в записи можете здесь:

Комментарии (35)
Ruslan

Запись и может какие-то материалы остануться? (код..., может еще что-то)

Ответить
Дмитрий Елисеев

Да, всё останется для участников

Ответить
Руслан

Добрый вечер, а сколько по времени будет стрим? Спасибо

Ответить
Дмитрий Елисеев

Ориентируюсь на 4..5 часов с небольшими перерывами и ответами на вопросы

Ответить
Никита

Значит, минимум на 8ч :)

Ответить
Franc Kafka

Никита бывалый))

Ответить
Дмитрий Елисеев

Получилось всего 6ч :)

Ответить
Кирилл

Дмитрий, а можно будет чуть позже приобрести записи и материалы стрима? В текущий момент для меня изучение темы микросервисов рано, но попозже планирую погрузиться в эту тему.

Ответить
Дмитрий Елисеев

Да, можно потом, но по возросшей цене.

Ответить
Дмитрий

Очень нужна информация про kubernetes. Будет ли в планах?

Ответить
Дмитрий Елисеев

Будет в скринкастах.

Ответить
Владимир

Дмитрий, а подскажите в 22:00 по мск? или это по моему времени уже отображается?

Ответить
Дмитрий Елисеев

В 18:00 по московскому. Это уже отображается по местному.

Ответить
Владимир

супер, значит тогда получится поприсутствовать. А может как нибудь помечать время, а то вдруг может кто еще не понял) если что вот так у меня отображается https://i.imgur.com/Y9FUICq.png

Ответить
Дмитрий Елисеев

Пометил

Ответить
Ruslan

я думаю, что будут еще косяки :) К примеру, у меня на компьютере региональные установки страны в которой я постояннно проживаю, или просто удобнее чтоб всё было на английском (все форматы), я на несколько месяцев уехал в другую страну, что ж мне установки в компе менять? Если б я случайно не заметил пост Владимира, то пришел бы в 17-00, а не в 16-00.

Ответить
Егор

Урвал за 1700

Ответить
Константин

Здравствуйте! вебинар рассчитан на тех кто уже работал с микро-сервисами? Или подойдет для тех, кто только начинает изучать эту тему?

Ответить
Дмитрий Елисеев

Для всех будет интересен.

Ответить
Ruslan

Дмитрий. Хотелось бы услышать для каких проектов уже стоит задумываться об использовании такой архитектуры. Только не ограничиваясь словами "большой и маленький", если большой то сколько и чего . Спасибо.

Ответить
Aziz

Если я куплю, то я автоматом куплю и подписку ?

Ответить
Дмитрий Елисеев

Нет, подписка приобретается отдельно в кабинете.

Ответить
Богдан

Как обычно с задержкой) но ради такого стоит подождать))

Ответить
Aёct'ann

Произошли технические шоколадки) Все будет ок

Ответить
Дмитрий Елисеев

Стрим удался, хоть и понервничали в начале. Спасибо зрителям за интересную компанию и вопросы!

Ответить
все еще нет ссылки)

у меня ссылка так и не появилась. как можно получиь ссылку на запись?

Ответить
Дмитрий Елисеев

Попробуйте обновить страницу

Ответить
kjyra

Спасибо за стрим! Всё прошло хорошо, было интересно и полезно)

Ответить
Стариков Андрей

Добрый день, спасибо за стрим! А можете подсказать как такое разделение на модульный монолит произвести для модуля Корзины. Так как ей все время нужны данные о пользователе, товаре, остатках, ценах, которые могут быстро менять. Плюс в ней могут быть какие-то системы скидок. То как в контроллере должен обрабатывать запрос содержимого корзины, добавление товара. Как внутри модуля корзины мы будем получать актуальные данные? Думал через подписчиков, но, например, цены в разных городах могут быть разные. И тут пользователь переключает город и соответственно все события изменения цен для нового города он ранее пропускал и уже нет возможности их актуализировать. В итоге у себя в реализацию пришёл к тому, что модуль Корзины сам ходит в кучи апи других модулей. Может есть более хитрые варианты?

Ответить
Максим

Хочу поделиться своим мнением, пока нет ответа Дмитрия.

  1. Внутри модуля Корзины добавляются только те данные, которые нужны именно ей. Id товара, цена, id покупателя, количество… Всё остальное запрашивается по Api/Query из других модулей.
  2. Система скидок не относится к корзине - отдельный модуль, например Продажи. Так же и с ценообразованием. Ценообразование никак не влияет на корзину. У него даже другая терминология, единый язык. Если видите другой язык, не присущий этому модулю, то с большей вероятностью это другой модуль/контекст.
  3. Делать денормализацию для Корзины из всех модулей не имеет никакого смысла. У вас появится куча событий, которые будут постоянно обновлять корзину из разных модулей. В этом тоже нет ничего хорошего.
  4. Модуль Корзина проектируется исходя из требований. Например, эта же цена в корзине может быть зафиксирована в самом модуле, чтобы при изменении цен пользователь мог приобрести товар, по которой добавил в корзину. Либо цена может браться всегда из другого модуля по запросу. Т.е. зависит от требований.

В целом по этой теме есть интересный доклад, как раз рассматривается пример с корзиной: https://youtu.be/MotE7e30jGM

Ответить
Дмитрий Елисеев

Как и ответили выше, в простой корзине достаточно хранить только id товара и добавленное количество. А всё цены для отображения на сайте подтягивать на лету в момент запроса.

Обычно цены товаров нужно фиксировать только при заказе. В корзину их копировать нет смысла.

Ответить
Владимир Перепеченко

Для меня стим полезный, спасибо.

Вы показали как храните конфиги модулей не в общем каталоге /config, а индивидуально в каждом модуле. Они при этом все равно парсятя ВСЕ при каждом запросе (тем же laminas-config-aggregator)? Или есть способ парсить их только тогда, когда используется данный модуль? Ну, чтобы снизить время запроса в большом проекте..

Ответить
Дмитрий Елисеев

В этом компоненте возможно включить кэширование готового массива в файл, передав файл:

$aggregator = new ConfigAggregator([
   // ...
], __DIR__ . '/../var/cache/config-cache.php');

и в продакшеновской конфигурации включив опцию:

return [
    ConfigAggregator::ENABLE_CACHE => true,
]

Это будет экспортировать весь общий массив в файл, сэкономив нам время на сборку и merge всех массивов.

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

'factories'  => [
    UserRepository::class => static function (ContainerInterface $container): UserRepository {
        $em = $container->get(EntityManagerInterface::class);
        $repo = $em->getRepository(User::class);
        return new UserRepository($em, $repo);
    },
],

Чтобы это работало нам нужно будет вынести эти фабрики в отдельные классы:

final class UserRepositoryDIFactory
{
    public function __invoke(ContainerInterface $container): UserRepository {
        $em = $container->get(EntityManagerInterface::class);
        $repo = $em->getRepository(User::class);
        return new UserRepository($em, $repo);
    }
}

и в конфигурации указать имена этих классов:

'factories'  => [
    PostRepository::class => PostRepositoryDIFactory::class,
],

Тогда у нас будет конфигурация в виде массива из строковых имён классов без анонимок.

Ответить
Владимир Перепеченко

Вот это развёрнутый ответ, каким он должен быть! Спасибо!

Я его понял так: Загружать конфиги по отдельности on-demand нельзя, но зато можно все кешировать в случае laminos-aggregator.

Ответить
Сергей

Очень крутой стрим, много полезной и новой для меня информации. Хотелось бы еще только больше практической части посмотреть как организовать всю эту свистопляску с джобами и очередями. Там где синхронные подписки — все понятно: есть событие, есть слушатель. А вот с асинхронностью и очередями как? Посмотреть бы как реализовывать это в коде, как все разложить. Спасибо!

Ответить
Зарегистрируйтесь или войдите чтобы оставить комментарий

Или войти через:

Google
GitHub
Yandex
MailRu