2011-12-02 23 views
6

Rozważ sytuację.Czy REST w praktyce może być bezpaństwowcem?

Piszę aplikację do analizy statystycznej. Aplikacja ma wiele poziomów.

  1. Interfejs użytkownika interfejsu użytkownika napisany dla wielu typów urządzeń, komputera, przeglądarki, telefonu komórkowego .
  2. Serwlet średniego poziomu, który oferuje tak zwaną usługę REST do tego frontendu.
  3. Backend, który wykonuje ekstremalne obliczenia przetwarzania statystycznego .
  4. , który komunikuje się z dalszym bazie backend

Ze względu na przyczyny, że analiza statystyczna wymaga dużej ilości mocy obliczeniowej, nigdy nie przyszłoby do głowy delegowanie takie przetwarzanie do front-end.

  1. Analizy statystyczne składa procedur lub szeregu etapów obróbki przepływu.

  2. Niektóre etapy mogą wymagać tak dużej mocy obliczeniowej, aby ich powtórzyć.

  3. Jeśli masz pracę przepływ 20 kroków, nie można wykonać krok 20 bez uprzedniego wykonywania kroku 19, który nie może być wykonany bez najpierw wykonując krok 18, tak dalej i tak dalej.

  4. Istnieje punktów obserwacyjnych, tak że, na przykład, statystyk musi sprawdzić wyniki etapów 3, 7, 9, 14, 19 przed opowiadają się po stronie klienta, aby przejść do następnego kroku.

  5. Każdy z tych etapów są tzw żądanie usługi REST, do powiedzieć superkomputer backend stopniowe skonfigurować model statystyczny w pamięci.

  6. Istnieje wiele workflow. Niektóre przepływy pracy mogą przypadkowo udostępniać wyniki z etapu . np. Flow [dry]: Step [7] może udostępniać Flow [wet]: Step [10]. Z powodu do ilości przetwarzania, musimy bezwzględnie zapobiec powtórzeniu kroku, który mógłby przypadkowo już być osiągnięty przez inny przepływ.

Zatem widać, że w tak zwanej usługi REST są zaprojektowane, nie jest możliwe, że każda prośba jest niezależna od jakiegokolwiek poprzedniego wniosku.

W związku z tym, jak prawdziwe może być następujące stwierdzenie?

Wszystkie interakcje w trybie REST są bezpaństwowcami. Oznacza to, że każde żądanie zawiera wszystkie informacje niezbędne dla konektora, aby zrozumieć żądanie , niezależnie od żądań, które mogły go poprzedzić.

Oczywiście, opisana przeze mnie aplikacja wymaga, aby żądanie było zależne od poprzedniego żądania. Widzę trzy możliwości dotyczące tej aplikacji.

  • Moja aplikacja nie spełnia wymagań REST, ponieważ nie może spełnić żądań bezpaństwowych. Może używać szkieletu JAX-RS, ale używanie JAX-RS i wszystkich pułapek REST nie powoduje, że jest on REST, tylko dlatego, że nie spełnia kryteriów bezpaństwowych.
  • Moja aplikacja jest źle zaprojektowana - powinienem lekceważyć próbę uniknięcia czasowego i finansowego kosztu upakowania modelu statystycznego, nawet gdyby trwało to od 5 do 15 minut. Tylko upewnij się, że nie ma zależności od poprzednich wniosków. W razie potrzeby powtarzaj kosztowne kroki.
  • Kryteria dotyczące bezpaństwowców są nieaktualne. Moje rozumienie REST jest przestarzałe/wadliwe, ponieważ społeczność REST stale ignoruje te kryteria.

Czy moja aplikacja jest uważana za RESTOWNĄ?

New Pytanie: ISO 9000

Wreszcie, w przypadku moja aplikacja nie jest całkowicie spokojny uznać, że wszelkie odniesienia do „odpoczynku” musi być pominięte zdać certyfikat ISO 9000?

nowy edit:

REST-in-kawałka

OK, mój kolega i ja rozmawialiśmy o tym i postanowił zadzwonić do takiej architektury/wzorzec REST-in-kawałka = Spoczywaj w fragmentarycznych etapach .

+1

jaka jest twoja definicja "stanu"? –

+0

Dmitry - dokładnie moje pytanie. Musimy zapytać guru, który definiuje REST. –

+3

Baza danych zawiera stan, ale istnieje wiele aplikacji internetowych opartych na bazach danych, które są uważane za REST. Co jeśli baza danych lub jej część znajduje się w pamięci? Zasadniczo uważam, że "stan", którego architektura ReST nie powinna utrzymywać, to stan sesji (niestabilny), a nie stan aplikacji (biznesowy). –

Odpowiedz

9

ISTM, zbyt wiele czytasz w kwestii bezpaństwowości. Interfejs REST API obsługuje tradycyjne CRUD operations. Interfejs API dla CouchDB jest dobrym przykładem tego, w jaki sposób stan bazy danych jest aktualizowany przez szereg transakcji bezstanowych.

Twoim zadaniem jest zidentyfikowanie zasobów i "transferów między nimi". Każdy etap przepływu pracy to inny transfer stanu, oznaczony innym identyfikatorem URI. Każda aktualizacja/zmiana do zasobu ma dołączoną operację POST/PATCH lub idempotentną operację PUT lub DELETE.

Jeśli chcesz lepiej zrozumieć, co znaczy być WYTRZYMAŁOŚCIĄ i powody każdego wyboru projektu, polecam spędzić godzinę czytając Chapter 5 of Roy Fielding's Dissertation.

Dokonując wyboru projektu, zastanów się, co próbują osiągnąć zasady RESTful Design. Skonfiguruj projekt tak, aby zapytania były bezpieczne (nie zmieniaj stanu) i były wykonywane w sposób, który może być księgowy, buforowalny, dystrybuowalny itp. Pozwól każdemu krokowi w przepływie pracy przejść do nowego stanu z wyraźnym identyfikatorem URI, tak aby że użytkownik może tworzyć kopie zapasowe, rozgałęziać się na różne sposoby itp. Cała idea polega na stworzeniu skalowalnego, elastycznego projektu.

+0

Chciałbym, żebyś mi powiedział, czy kryteria bezpaństwowe już mają wodę. Tak nie? Czy moje rozumienie bezpaństwowości jest wadliwe? Tak nie. Jeśli tak, wyjaśnij bezpaństwowość RESTful. –

+0

Zanim zadałem to pytanie, dokładnie czytałem ten rozdział. –

2

Aktualizujesz model pamięci w interfejsie REST. Oznacza to, że utrzymujesz stan na serwerze między żądaniami.

Najskuteczniejszym sposobem rozwiązania tego problemu byłoby sprawienie, aby klient utrzymywał stan, po prostu przetwarzając żądanie i zwracając wszystkie informacje potrzebne do skonstruowania następnego żądania w odpowiedzi. Serwer następnie rekonstruuje model pamięci w oparciu o informacje w żądaniu, a następnie robi to. W ten sposób, jeśli działasz ww środowisku klastrowym, każdy z dostępnych serwerów byłby w stanie obsłużyć żądanie.

To, czy jest to najbardziej efektywny sposób działania, zależy od aplikacji. Istnieje wiele aplikacji dla przedsiębiorstw, które używają sesji po stronie serwera i opracowują równoważenie obciążenia, aby zapewnić, że klienci zawsze używają tych samych węzłów w klastrze. Tak więc posiadanie stanu po stronie serwera jest całkowicie poprawnym wyborem projektu i istnieje wiele sposobów jego realizacji. Jednak stan po stronie serwera ogólnie komplikuje skalowanie, a REST w najczystszym znaczeniu polega na unikaniu stanu po stronie serwera i unikaniu złożoności.

Obejście/kompromis utrzymuje stan w jakiejś bazie danych lub sklepie. W ten sposób Twoje węzły mogą pobrać stan z dysku przed przetworzeniem żądania.

Wszystko zależy od tego, czego potrzebujesz i co jest do zaakceptowania. Jak wspomniał poprzedni komentator, nie zwlekaj zbytnio z tym całym stanem. Najwyraźniej ktoś będzie musiał utrzymywać stan, a pytanie jest tylko tym, co najlepsze jest, aby umieścić ten stan dla ciebie i jak masz do niego dostęp. Zasadniczo istnieje kilka kompromisów, które zasadniczo dotyczą różnych scenariuszy typu "co, jeśli". Na przykład, jeśli serwer ulega awarii, czy chcesz, aby klient ponownie uruchomił cały zestaw żądań, aby zrekonstruować obliczenia, czy wolisz po prostu ponownie wysłać ostatnie żądanie? Mogę sobie wyobrazić, że tak naprawdę nie potrzebujesz wysokiej dostępności tutaj i nie przeszkadza ci niskie ryzyko, że coś nie zawsze dzieje się źle dla twoich klientów. W takim przypadku posiadanie stanu po stronie serwera w pamięci jest rozwiązaniem dopuszczalnym.

Zakładając, że twój serwer utrzymuje stan obliczeń w niektórych mapach mieszania, najlepszym sposobem na przekazanie stanu dookoła może być po prostu odesłanie klucza do modelu w odpowiedzi. To doskonale działający interfejs API i możesz zmienić implementację, aby utrzymać stan lub zrobić coś innego, nie zmieniając interfejsu API w razie potrzeby. I to jest główny punkt bycia REST-ful: oddzielić szczegóły implementacji od API. Twój klient nie musi wiedzieć, gdzie umieścisz stan lub jak go przechowujesz. Wszystko czego potrzebuje to reprezentacja zasobów tego stanu, którą można zmanipulować.

Oczywiście klucz powinien być reprezentowany jako identyfikator URI. Polecam przeczytanie "REST w praktyce" Jima Webbera. To świetne wprowadzenie do projektowania interfejsów API REST.

+0

Czy moja aplikacja ma koszt wyładowania modelu matematycznego z pamięci superkomputera do bazy danych, aby spełnić kryteria bezpaństwowości? –

+0

Nie, chyba że utrata stanu, gdy serwer umrze, jest dla ciebie problemem, nie zrobiłbym nic takiego. Jeśli nie, wszystko, co musisz zrobić, to spróbować myśleć o swoim modelu jako zasobu, który udostępniasz za pośrednictwem http, i że możesz wykonywać żądania PUT, POST, GET i DELETE. –

Powiązane problemy