Я имею дело с приложением python, которое состоит из нескольких распределенных облегченных компонентов, которые взаимодействуют с использованием RabbitMQ & Kombu .
Компонент прослушивает две очереди и можетполучать несколько типов сообщений в каждой очереди.Подклассы могут переопределять способ обработки каждого типа сообщений путем регистрации пользовательских обработчиков.Все это прекрасно работает.
Теперь у меня есть дополнительное требование, чтобы у каждого компонента был базовый интерфейс REST / HTML.Идея заключается в том, что вы указываете своему браузеру на работающий компонент и получаете в реальном времени информацию о том, что он в данный момент делает (какие сообщения он обрабатывает, использование процессора, информация о состоянии, журнал и т. Д.)
Он должен быть легкимИтак, после некоторых исследований я остановился на Flask (но я открыт для предложений).В псевдокоде это означает:
class Component:
Queue A
Queue B
...
def setup(..):
# connect to the broker & other initialization
def start(..):
# start the event loop and wait for work
def handle_msg_on_A(self,msg):
# dispatch a msg to a handler depending on the msg type
def handle_msg_on_B(self,msg):
...
...
и добавление нескольких методов просмотра:
@app.route('/')
def web_ui(self):
# render to a template
@app.route('/state')
def get_state(self):
# REST method to return some internal state info as JSON
...
Однако, прикрепление веб-интерфейса пользователя к классу, подобному этому, ломает SOLID принципы и приносит проблемы с наследованием (подкласс может захотеть отображать больше / меньше информации).Декораторы не наследуются, поэтому каждый метод представления должен быть явно переопределен и переопределен.Может быть, использование mixin + отражение может работать как-то, но это кажется хакерским.
Вместо этого может сработать использование композиции: поместите веб-материал в отдельный класс, который делегирует маршруты URL-адресов фиксированному, предварительно определенному набору полиморфных методов во вложенном компоненте.Таким образом, компоненты остаются в неведении о Flask за счет некоторой потери гибкости (набор доступных методов исправлен).
Я обнаружил Чертежи Flask и Диспетчеризация приложений и похоже, что они могли бы предложить лучшее, более расширяемое решение.Тем не менее, мне еще предстоит обернуть голову вокруг них.
Я чувствую, что здесь отсутствует шаблон проектирования, и, надеюсь, кто-то с большим количеством фляг-фу или опытом с этим типом проблемы сможет прокомментировать.