REST czy kolejka komunikatów w heterogenicznym systemie wielowarstwowym?

9

Projektuję interfejs API REST dla trójwarstwowego systemu, takiego jak: Client application-> Front-end API cloud server-> user's home API server (Home).

Homejest urządzeniem domowym i ma utrzymywać połączenie Front-endprzez Websocket lub długą ankietę (jest to pierwsze miejsce, w którym naruszamy REST. Później staje się jeszcze gorzej) . Front-endgłównie tuneluje Clientżądania Homepołączenia i obsługuje niektóre połączenia. Czasami Homewysyła powiadomienia do Client.

Front-endi Homemają w zasadzie ten sam interfejs API; Clientmoże łączyć się Homebezpośrednio przez sieć LAN. W takim przypadku Homemusi zarejestrować niektóre Clientdziałania na Front-endsobie.

Plusy dla REST w tym systemie to:

  • REST jest czytelny dla człowieka;
  • REST ma dobrze zdefiniowane odwzorowanie czasowników (takich jak CRUD), rzeczowników i kodów odpowiedzi na obiekty protokołu;
  • Działa przez HTTP i przekazuje wszystkie możliwe proxy;

Kontrole REST to:

  • Potrzebujemy nie tylko stylu komunikacji żądanie-odpowiedź, ale także subskrypcji publikowania;
  • Kody błędów HTTP mogą być niewystarczające do obsługi błędów komunikacji trójwarstwowej; Front-endmoże powrócić 202 Accepteddo jakiegoś wywołania asynchronicznego, aby dowiedzieć się, że konieczne Homepołączenie zostało zerwane i powinno być 503;
  • Homemusi wysłać wiadomości do Client. Clientbędzie musiał odpytać Front-endlub utrzymać połączenie.

Rozważamy WAMP / Autobahn przez Websocket, aby uzyskać funkcjonalność publikowania / subskrybowania, kiedy uderzyło mnie, że już wygląda jak kolejka wiadomości.

Czy warto oceniać rodzaj kolejki przesyłania komunikatów jako transportu?

Wygląda na to, że kontrole kolejki wiadomości to:

  • Będę musiał sam zdefiniować czasowniki CRUD i kody błędów na poziomie komunikatu.
  • Przeczytałem coś o „wyższych kosztach utrzymania”, ale co to znaczy?

jak poważne są te względy?

Victor Sergienko
źródło
1
Dlaczego masz w chmurze serwer chmurowy? Wygląda na to, że wszystko, co robi, to przekierowanie, co sprawia, że ​​myślę, że powinien żyć na tej samej maszynie co serwer domowy ...
Jimmy Hoffa
3
analizując kolejki wiadomości, pamiętaj, że większość z nich jest zoptymalizowana pod kątem prywatnych sieci LAN: małe opóźnienia, kontrolowani klienci, chroniona sieć itp. wystawianie kolejki na Internet może być ogromnym problemem bezpieczeństwa.
Javier
@Jimmy Hoffaważny punkt, dzięki. Zgadza się, ale nie do końca. To wspólna baza danych, pamięć masowa i tak dalej. @Javierdziękuję, to dobra część odpowiedzi.
Victor Sergienko
Czy serwer domowy ma być uruchamiany w domu użytkownika i na interfejsie użytkownika w chmurze? Dom łączy się z front-endem, a klient wysyła wiadomości do domu przez front-end. Jeśli dobrze rozumiem twój projekt, mogę udzielić boskiej odpowiedzi.
Michael Brown
@Mike Browndokładnie. Proszę zrób.
Victor Sergienko

Odpowiedzi:

5

Jeśli masz łączność, idź z kolejką komunikatów - chociaż musisz zdefiniować własne protokoły (trudne zadanie!), Aby wysyłać wiadomości o określonej strukturze i formacie.

Problem z konserwacją polega na tym, że zazwyczaj klient i serwer są budowane osobno, więc musisz zachować ostrożność, aby zachować obie strony przy użyciu tych samych definicji komunikatów, ale jeśli nie jesteś wystarczająco zorganizowany, po prostu użyj tego samego kodu XML, którego użyłbyś w REST usługa.

Jeśli masz problemy z łącznością przez Internet, tylko z portem 80 i http oraz komunikacjami „jednokierunkowymi”, prawdopodobnie styl w stylu REST jest prawdopodobnie najlepszy. Wysyłaj i odpytuj lub uzyskaj gniazdo sieciowe na dane zwrotne, ale ogólnie architekt systemu powinien być klientem / serwerem. Jeśli masz możliwość uzyskania łączności, to systemy wiadomości są świetne.

Pójdę z ZeroMQ dla systemu komunikacyjnego, jego konfigurowalny wystarczy przekręcić w rozmaitych sytuacjach, także odporny na uszkodzenia. Nie jestem jednak pewien, czy działa na http .

gbjbaanb
źródło
Dzięki. To, co znalazłem po @Javierkomentarzu: ØMQ wydaje się nie obsługiwać samego szyfrowania atm: zeromq.org/area:faq#toc8, chociaż RabbitMQ
Victor Sergienko
Nie wiem, czy mam łączność. Homejest urządzeniem domowym użytkownika i Clientjest smartfonem przez Wi-Fi lub 3G. Ważną częścią tego pytania jest moja niewiedza na temat metod przejścia przez NAT.
Victor Sergienko
5

Wygląda na to, że Autobahn ładnie pasuje do tego, co próbujesz zrobić. Dostępne są również inne narzędzia. Sprawdź usługę Windows Azure Service Bus (która ma struktury klienta dla Java, .NET, PHP, Python, NodeJS i Ruby).

Podczas gdy wbudowane komunikaty odpoczynku są przydatne. Przekonasz się, że Twoja aplikacja przerośnie podstawowe operacje CRUD. Na przykład, jeśli Twoja aplikacja była systemem bankowym. Zamiast

Aktualizacja Acct 54321 Saldo = Saldo - 20,00 Aktualizacja Acct 98765 Saldo = Saldo + 20,00

Prawdopodobnie chciałbyś mieć jedną wiadomość

Przenieś 20,00 z konta 54321 na konto 98765

Najlepiej jest, gdy odkryjesz tę przeszkodę w REST teraz niż później. Sprawdź Greg Young's Event Centric, który omawia sposób tworzenia bogatszego modelu przesyłania wiadomości w aplikacji.

Michael Brown
źródło
Wielkie dzięki. Rzeczywiście możemy przerosnąć CRUD, choć nie bardzo szybko, nasza domena jest teraz dość prosta. BTW, książka nie została jeszcze opublikowana, próbując znaleźć jakieś matheriale na blogu Grega ... Myślę, że to dobrze, że nie muszę do tego używać technologii Microsoft.
Victor Sergienko
Poczekaj, aż jego książka wciąż nie jest dostępna ... mówił o tym tak długo ... brzmi jak inny autor techniczny, którego znam. : ">
Michael Brown
1
Dla przypomnienia podejście REST polegałoby na utworzeniu utworzonego zasobu Transfer. Lub nawet TransferRequest, który może przejść lub nie. W niektórych przypadkach REST staje się trudny, ale nie jest to jeden z nich.
Jacek Gorgoń