Текущая ситуация
Мы внедряем (и в настоящее время поддерживаем) веб-приложение для онлайн-покупок в микросервисной архитектуре.
Одним из требований является то, что компания должна иметь возможность применять правила к тому, что наши клиенты добавляют в свою корзину, чтобы настроить их опыт и возможный заказ. Совершенно очевидно, что нужно было создать механизм бизнес-правил, и мы внедрили для этого конкретный «микросервис» (если мы еще могли бы так его назвать).
В течение года этот механизм правил становился все более и более сложным, требующим все больше и больше данных (например, содержимое корзины, а также информация о пользователе, его роль, его существующие услуги, некоторая платежная информация и т. Д.), Чтобы иметь возможность вычислить эти правила.
На данный момент наш shopping-cart
микросервис собирает все эти данные из других микросервисов. Несмотря на то, что часть этих данных используется shopping-cart
, большую часть времени они в основном используются для подачи механизма правил.
Новые требования
Теперь возникает необходимость в других приложениях / микросервисах для повторного использования механизма правил для аналогичных требований. Таким образом, в текущей ситуации им придется передавать данные одного типа, вызывать одни и те же микросервисы и создавать (почти) одни и те же ресурсы, чтобы иметь возможность вызывать механизм правил.
Продолжая, как есть, мы столкнемся с несколькими проблемами:
- каждый (вызывающий механизм правил) должен переопределить выборку данных, даже если им это не нужно для себя;
- запросы к движку правил сложны;
- продолжая в этом направлении, нам придется передавать эти данные по всей сети для многих запросов (представьте, что μs A вызывает μs B, вызывающий механизм правил, но у A уже есть некоторые данные, необходимые механизму правил);
shopping-cart
стал огромным из-за всей выборки данных;- Я, наверное, забыл много ...
Что мы можем сделать, чтобы избежать этих неприятностей?
В идеале мы бы не добавляли больше сложности в механизм правил. Мы также должны убедиться, что это не становится узким местом - например, некоторые данные довольно медленно выбираются (10 с или даже больше), поэтому мы реализовали предварительную выборку shopping-cart
таким образом, чтобы данные с большей вероятностью находились там до того, как мы вызовем правила двигатель, и сохранить приемлемый пользовательский опыт.
Некоторые идеи
- Позвольте механизму правил получать нужные ему данные. Это добавило бы еще большей сложности, нарушив принцип единой ответственности ( еще больше… );
- Внедрите прокси μ перед механизмом правил для извлечения данных;
- Реализуйте «сборщик данных», который механизм правил вызывает для извлечения всех данных, которые ему нужны одновременно (составной запрос).
shopping-cart
, но мы можем довольно легко адаптировать его для нужд других микросервисов (они по-прежнему связаны с пользователями, продуктами и заказами). Как мы видим, они будут нужны одни и те же входные данные, тем более, что бизнес способен выбрать предикаты применить. Все данные предоставляются другими микросервисами, кроме самого содержимого корзины. Извлечение данных само по себе не сложно, но становится сложным, когда вам нужно вызвать ~ 10 других микросервисов и поддерживать структуру, ожидаемую механизмом правил.