2010-06-22 32 views
11

W SOA nie powinniśmy budować ani wstrzymywać stanu (ani projektować zależności) między klientem a serwerem. Jest to zrozumiałe. Ale jakie wzorce można zastosować w przypadku, gdy klient chce skorzystać z usługi czasu rzeczywistego, która może zwrócić otwartą liczbę "wierszy"?SOA/Web Service Pagination

Aplikacje internetowe, podobnie jak w SOA, ale pozwalające na stan (sesje) rozwiązały to przy pomocy paginacji. Paginacja wymaga (w większości przypadków, szczególnie w przypadku SQL), że serwer przechowuje dane i że klient żąda danych w porcjach.

Jeśli zastanowimy się nad scenariuszem podobnym do paginacji dla usług sieciowych, jakie wzorce podążałyby za nimi, nadal możliwe byłoby przestrzeganie zasad SOA (lub jak najbliżej).

Niektóre zasady myślicieli: 1) poparte bazy danych SQL (w związku z tym nie ma pojęcia z wielu wierszy w wybranej zestawie) 2) Ważne jest, aby nie pominąć wiersz lub powielić wiersz w ustawić podczas paginacji 3) dane można wprowadzać i usuwać w dowolnym momencie do bazy danych przez innych klientów 4) nie istnieje potrzeba rozważenia zestaw danych na żywo (update-stanie) zestaw danych

Osobiście uważam, że 1 i 2 powyżej już przeliterują nasze rozwiązanie, ograniczając przestrzeń rozwiązania z wymaganiami.

Proponowane przeze mnie rozwiązanie zawiera dane (w takim zakresie, w jakim jest zaznaczone) przechowywane w pamięci podręcznej/pamięci podręcznej tylko do odczytu, gdzie można przypisać numer wiersza w zestawie wyników i zezwolić na stronicowanie w tej migawce danych. Posiadałbym infrastrukturę do przechowywania migawek (serwerów, zewnętrznych pamięci podręcznych, memcached lub ehcache - to musi być dość duże). Wynikiem takiego zapytania byłby identyfikator migawki, a klienci mogliby pobrać dane z migawki za pomocą snapshot API (usług internetowych) i identyfikatora migawki. Wyniki będą przetwarzane w trybie tylko do odczytu, do przodu dla rekordów X w czasie, gdy x jest czymś rozsądnym.

Radzenie sobie ze swoimi myślami i pomysłami, krytyka lub pochwała.

+0

Wskażę ci, jak twitter obsługuje ich stronicowanie. To może być pomocne dla Ciebie https://dev.twitter.com/rest/public/timelines –

Odpowiedz

0

Pseudonimy w usłudze sieciowej są w rzeczywistości dość łatwe do osiągnięcia.

Wszystko, co musisz zrobić, to dodać dwa parametry do połączenia serwisowego: Rozmiar strony, Numer strony.

Rozmiar strony to liczba wyników do uwzględnienia na stronie. Numer strony jest numerem strony wyników, której szukasz.

Twoja usługa sieciowa następnie wraca do bazy danych (lub pamięci podręcznej), wyświetla wyniki, określa, które wyniki pasują do żądanej strony, i zwraca tylko te wyniki.

Klient musi następnie wysłać jedno żądanie na stronę wyników, które chce uzyskać z usługi.

+1

Dziękujemy - ale nie spełnia wymagań. Wracając do bazy danych, nie można uzyskać spójnych wyników, dane można dodawać, usuwać lub zmieniać między połączeniami, co utrudnia ich spójność. W ten sposób można pominąć wiersze, ponieważ dane zostały usunięte powyżej. Jeśli kryteria sortowania nie są unikalne, nie można również zagwarantować kolejności. Pamiętaj, szukam wzoru, który mogę zastosować globalnie, który rozwiązuje te problemy. Niezła próba. – cmdematos

0

To, co proponujesz z memcached, będzie działało również z tabelą buforowania. Pierwsze zgłoszenie serwisowe: (1) WSTAW wyniki do tabeli buforowania z identyfikatorem migawki (2) zwraca pierwszą stronę z tabeli buforowania i identyfikator migawki. Kolejne wywołania będą zwracać strony na podstawie rozmiaru strony i numeru strony, wysyłając zapytanie do tabeli buforowania za pomocą identyfikatora migawki.

Myślę, że można to również zoptymalizować za pomocą tabeli buforowania w pamięci, ale zależy to od tego, czy baza danych obsługuje INSERT-INTO z tabeli dyskowej do tabeli w pamięci. To może się jednak skomplikować w środowisku klastrowym.

Taka pamięć podręczna jest z natury istotna, jeśli zachowuje się specyficzną dla klienta kopię między żądaniami, niezależnie od tego, czy pamięć jest w obiekcie sesji, w tabeli bazy danych, czy w pamięci memcached. Biorąc pod uwagę wymagania, nie masz wyboru, musisz tylko buforować wyniki w takiej czy innej formie, z tą różnicą, że ryzykujesz możliwość usunięcia skasowanych lub już nieistniejących rekordów jako uzasadnionych wyników.

1

Architektura SOA nie jest przeznaczona do tak niskiego poziomu funkcjonalności.

Architektura SOA przeznaczona jest do łączenia obszarów biznesowych, a nie frontendów z backendami. Nie dlatego, że aplikacja rozmawia z zapleczem za pomocą usług sieciowych, masz aplikację "SOA". To nie ma sensu, ponieważ SOA nie ma znaczenia w kontekście 1 izolowanego systemu.

Z tego punktu widzenia jasne jest, że w SOA osoba dzwoniąca nie powinna wiedzieć o tabeli SQL, którą się stroni, jest to szczegół implementacji, który SOA powinna ukrywać. Z drugiej strony serwer nie powinien wiedzieć o stanie klienta, ponieważ powinien on być agnostyczny względem szczegółów klientów, aby być naprawdę otwartym.

Po prostu zrozum, że paginacja nie jest SOA. Rób tak, jak chcesz, po prostu zrozum, że usługa sieciowa, której używasz do tworzenia stronicowania, jest wewnętrznym artefaktem twojej aplikacji, a nie jest używana do zewnętrznych klientów w magistrali SOA. Pamiętaj również, że nie może to być transakcja zgodna z bieżącym stanem na serwerze. Prawdopodobnie problem polega na tym, że masz tylko jedną warstwę usługi dla interfejsu aplikacji i magistrali SOA, musisz je rozdzielić.

Korzystanie z tego serwisu w autobusie SOA byłoby złe. Nie mogę być konsekwentny, ponieważ strona jest paginowana, a inne aplikacje się z nią wiążą, stają się powiązane z konkretnym SQL.

... równie dobrze możesz przyznać bezpośredni dostęp SQL do tabeli we wszystkich istotnych sprawach.

Architektura SOA służy do przesyłania komunikatów biznesowych między systemami, a nie do nakładania aplikacji na serwer.

+0

Byłbym wdzięczny za komentarz w głosowaniu w dół. Gdyby to było z powodu mojego pisania, bardzo mi przykro, ale komentarz pomoże. Jeśli to raczej dlatego, że uważasz, że paginacja jest OK w architekturze SOA, sprawdź ponownie, nie jest. Proponuję: http://blogs.msdn.com/b/rogerwolterblog/archive/2006/04/20/580353.aspx –

0

Ten sam problem rozwiązany przy użyciu metody Navision.

$ws->getList($first_record_id, $limit) 

to powrót stronę elementu $ limit, który rozpoczyna się od przekazanym id

select * from collection where collection.id > $first_record_id ASC limit $limit 

zamówionej przez ID ASC

Navision użyć klawisza (każdy element ma klucz), ale w MySQL identyfikator autoinkrementacji jest lepszy.

W tym przypadku paginacji jest przeznaczony do obsługi dużych zestawów wyników, a nie na paginacji frontend ...

0

Nie jestem pewien, czy SOA ma obaw tutaj. Wydaje się, że masz problem z dzieleniem na strony swoich interfejsów API. Wskażę ci, jak twitter obsługuje paginację dev.twitter.com/rest/public/timelines