Wymiana danych między aplikacją a jej pluginami

0

Witam wszystkich!

Załóżmy, że mam aplikację wykonującą pewne skomplikowane, czasochłonne, obliczenia. Aplikacja ta posiada funkcjonalność ładowania pluginów, które mają na celu umożliwienie dostępu do efektów obliczeń. Przykładowo - plugin odpowiedzialny jest za obsługę zapytań odbywających się przez TCP/IP. Po otrzymaniu zapytania ma on zdecydować jaką akcję podjąć, pobrać dane od aplikacji (hosta), która udostępnia mu je poprzez jakieś API, a na koniec wysłać odpowiedź.

Moje pytanie jest następujące: w jaki sensowny sposób zrealizować wymianę informacji między pluginem a aplikacją-hostem. Rozumiem, że proste wywoływanie funkcji API przez plugin nie wchodzi w grę. Do głowy przychodzi mi tylko pomysł ze stworzeniem "kolejek zapytań" - plugin wstawiałby prośbę o pozyskanie informacji do swego rodzaju kolejki znajdującej się w hoście, a ten odpowiadałaby na takie zapotrzebowania w dogodnym momencie. Natomiast co w przypadku gdy komunikacja ma narzucone pewne ramy czasowe i przykładowo musimy odpowiedzieć na zapytanie w czasie nie dłuższym niż np. 50 ms? W jaki sposób radzić sobie w takim przypadku?

0

Zastosuj opcję klient-serwer, gdzie na serwerze masz osobny wątek do obsługi zapytań a osobny na obliczenia.

0

A w jaki sposób zrealizować samą wymianę danych? Jakich struktur i rozwiązań użyć? Pomysł z kolejką wydaje mi się być dobrym rozwiązaniem ale dodaje kolejną warstwę pośredniczącą - co w przypadku gdy dane będą potrzebne natychmiastowo?

0

Masz mnóstwo protokołów, od najprostszego RESTful API (JSON, msgpack) po inne systemy RPC jak gRPC czy Cap'n'Proto. Sama komunikacja to już zależy od platformy.

Dalej mówisz zbyt ogólnikowo, byśmy mogli Ci konkretniej poradzić.

0
Wazka260196 napisał(a):

Witam wszystkich!

Witaj!

Moje pytanie jest następujące: w jaki sensowny sposób zrealizować wymianę informacji między pluginem a aplikacją-hostem. Rozumiem, że proste wywoływanie funkcji API przez plugin nie wchodzi w grę.

Dlaczego tak rozumiesz? Jaki OS, sposób ładowania plugina?

1

Z reguły plugin z hostem porozumiewa się poprzez API/skodyfikowany zestaw funkcji/interfejsów. Jak to zrobisz to już Twoja sprawa.

Jeśli wykonujesz jakieś obliczenia i nie jesteś w stanie zagwarantować, że wykonane zostaną w zadanym czasie to musisz przygotować się na tę ewentualność i umożliwić przekazanie ostatecznemu klientowi informacji, że obliczeń w zadanych ramach czasowych nie udało się wykonać.

0

Żeby uporządkować dyskusję: pluginy w mojej aplikacji mają służyć tylko do obsługi protokołów wymiany danych. Aplikacja wykonuje obliczenia, których wynik zapisuje. Plugin po otrzymaniu żądania dostępu do tych danych ma odpytać o nie aplikację (przy użyciu udostępnionych przez nią funkcji (jakieś proste API)) a następnie odpowiednio je obrobić i odesłać. Co zrobić gdy aplikacja znajduje się w środku obliczeń a do pluginu przyjdzie żądanie odczytu danych? Skoro aplikacja jest zajęta obliczeniami to plugin nie obsłuży zapytania wcale (przynajmniej takie mam przypuszczenia bo próbowałbym wywołać funkcję udostępnioną przez aplikację gdy ta jest zajęta czymś innym). Czy sensowne byłoby uruchomienie pluginu w oddzielnym wątku dla zapewnienia płynności komunikacji?

0

Raczej to nie mój poziom, ale z ciekawości, nie można po prostu wrzucić danych do jakiejś lekkiej db + oczywiście nadawać ID tym obliczeniom które to wymieniane są pomiędzy appką i plugiem? ;p

plug rejestruje task id: 12345 z parametrami a,b,c

appka dodaje do db np.

id, data, isCompleted(bool)
12345, null, no

wykonuje obliczenia

aktualizuje bazę

12345,output_data, yes
0

Baza danych odpada.

1 użytkowników online, w tym zalogowanych: 0, gości: 1