Взаимодействие приложений Django в слое абстракции

Мы начинаем новый проект Django, который будет состоять из множества различных приложений. Сначала я думал рассматривать некоторые из этих приложений как отдельные сервисы, но руководители отделов сказали нам, что на данном этапе нам не нужно масштабирование, распределение и балансировка, поэтому просто держите их внутри одного проекта. Однако меня также попросили сохранить чистоту проекта и перенести коммуникации между приложениями на абстрактный уровень

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

Все звучало хорошо для меня, пока я не начал реализовывать это. Мне сказали, что однажды мы можем извлечь эти приложения django и поместить их в другой проект и запустить их на нескольких машинах, чтобы распределить и сбалансировать нагрузку между ними

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

Приближение A

Я не смог придумать много идей, чтобы сохранить и производительность, и лучшие практики проектирования. Одна из идей заключается в том, что реализации интерфейса будут вызывать VIEW определенных приложений django путем создания запроса с помощью django RequestFactory.

  • Хорошая часть этого в том, что каждое приложение будет иметь свой API View, когда они будут извлечены.
  • Плохая часть в том, что это дерьмо!!! Мне кажется, что это плохая практика, но я новичок в Django и не уверен. Также API приложения могут нуждаться в получении http адреса обратного вызова, так что это также будет нарушено при вызове представлений (я полагаю).

Приближение B

Другая идея заключается в том, чтобы заставить сетевой уровень немного поучаствовать и сделать фактические HTTP-запросы к моему собственному приложению. Конечно, это немного медленнее, но если даже однажды любое из этих приложений будет извлечено, у нас останется чистый дизайн, и нам просто нужно будет изменить http-адрес приложения в нашей реализации "хорошо определенного интерфейса".

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

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

Вернуться на верх