Mam do czynienia z aplikacją python, która składa się z wielu rozproszonych lekkich komponentów, które komunikują się przy użyciu RabbitMQ & Kombu.Dodawanie zachowania REST do klasy z kolbą, case dla planów?
Komponent słucha w dwóch kolejkach i może odbierać wiele typów wiadomości w każdej kolejce. Podklasy mogą nadpisać sposób przetwarzania każdego typu wiadomości poprzez rejestrowanie niestandardowych procedur obsługi. Wszystko to działa dobrze.
Mam teraz dodatkowe wymaganie, że każdy komponent musi mieć podstawowy interfejs REST/HTML. Pomysł polegający na tym, że kierujesz przeglądarkę do działającego komponentu i uzyskujesz w czasie rzeczywistym informacje o tym, co aktualnie robi (jakie wiadomości przetwarza, użycie procesora, informacje o stanie, dziennik itp.).
To musi być lekkie, więc po pewnych badaniach zdecydowałem się na Flask (ale jestem otwarty na sugestie). W Pseudokod oznacza to przyjmuje:
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):
...
...
i dodając kilka widzenia metod:
@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
...
Jednak przykręcenie UI internetową na klasy jak ten łamie SOLID zasad i przynosi problemy z dziedziczenia (podklasę może chcieć wyświetlić więcej/mniej informacji). Dekoratory nie są dziedziczone, więc każda metoda widoku musiałaby zostać jawnie nadpisana i zmieniona. Może użycie mixin + reflection może jakoś zadziałać, ale czuje się hackish.
Zamiast tego, użycie kompozycji może działać: umieść elementy sieciowe w osobnej klasie, która deleguje trasy adresów URL do ustalonego, predefiniowanego zestawu metod polimorficznych w komponencie zagnieżdżonym. W ten sposób komponenty pozostają nieświadome Flasku kosztem utraty elastyczności (zestaw dostępnych metod jest stały).
Właśnie odkryłem Flask blueprints i Application Dispatching i wygląda na to, że mogą przynieść lepsze, bardziej rozszerzalne rozwiązanie. Jednak muszę jeszcze owinąć się wokół nich.
Mam wrażenie, że brakuje mi tutaj wzoru i mam nadzieję, że ktoś z większą ilością flak-fu lub doświadczeniem z tego typu problemami może komentować.
Fajnie, dziękuję za odpowiedź, zdecydowanie się na to przyjrzę i zatwierdzę odpowiedź, jeśli się uda – dgorissen
Czy to działa @dgorissen –