Jaki jest najlepszy sposób na przełączenie awaryjne offline klienta stacjonarnego korzystającego z usługi internetowej?

13

Mam trzy nadchodzące projekty, które mają wspólny problem:

muszą mieć logikę w systemie internetowym i potrzebują aplikacji lokalnej (np. punktu sprzedaży), która komunikuje się z takim systemem za pośrednictwem usługi internetowej RESTful.

Moje rozwiązanie

Rozwiązaniem, które udało mi się wymyślić, jest zaimplementowanie w kolejce komunikatów aplikacji komputerowej do przechowywania operacji, gdy usługa jest offline, a dokładniej, asynchroniczne kolejkowanie wiadomości . Jest to jednak łatwa część (jeśli takie jest najlepsze rozwiązanie). Zajmuję się również synchronizacją danych i rozwiązywaniem konfliktów.

Główny system musi być oparty na sieci, ponieważ do raportów i monitorowania przez zainteresowane strony wymagana jest aplikacja internetowa, a usługi sieciowe obsługiwałyby żądania dotyczące kilku zakładów.

Klienty stacjonarne (najlepiej cienkie) zostaną zaimplementowane w Javie (a dokładniej Netbeans), a system WWW w Symfony2. Dwa z tych projektów wymagają integracji sprzętowej dla klienta, więc wykonanie aplikacji komputerowej za pomocą technologii internetowej (np. Appcelerator Titanium) może być poważnym problemem.

Moje pytanie

  1. Jakie jest lepsze rozwiązanie, które można skalować, co oznacza maksymalną wydajność przy minimalnym wysiłku (a najlepiej bez dodatkowych kosztów, takich jak zakup serwera zapasowego do pracy lokalnej)?

  2. Kto jeszcze miał z tym do czynienia? Jak rozwiązałeś swój problem? Jakie lekcje możesz udostępnić?

  3. Jak poradziłeś sobie z synchronizacją?

Edycja: Dodano brakującą część do mojego pytania w punkcie # 3

dukeofgaming
źródło

Odpowiedzi:

3

Wiem, że pytanie to jest Java, ale bardzo podoba mi się ten styl architektury magistrali komunikatów na tego typu rzeczy.

Zasadniczo po wysłaniu wiadomości uzyskują potencjalnie dwie odpowiedzi. Pierwszy pochodzi z lokalnej pamięci podręcznej, drugi pochodzi z serwera po podłączeniu.

Jestem pewien, że możesz łatwo dostosować tę architekturę (nosorożec i nhib) do swojej (MQ i hib).

Potok
źródło
Tak, szukałem właśnie takiej architektury zorientowanej na wiadomości. Argumenty z pamięci podręcznej i ostatnie zdanie w twoim linku przekonały mnie.
dukeofgaming
10

Rób wszystko lokalnie i okresowo synchronizuj .

Oto, co bym zrobił, gdybym był tobą (nie znam struktury synchronizacji w Javie, tak jak w .NET).

Zachowaj znacznik czasu w lokalnej aplikacji, który będzie przechowywał ostatnie udane połączenie.

Niezależnie od tego, kiedy ponownie się połączysz, znacznik czasu zostanie wykorzystany do pobrania nowych danych, a następnie wysłania nowych zamówień wygenerowanych lokalnie.

Następnie utrzymasz dwa znaczniki czasu. Jeden do określenia, kiedy zamówienie zostało utworzone (lokalnie lub online), a drugi, kiedy zostało zarejestrowane przez serwer.

Nie polecam do tego kolejkowania wiadomości. W przeszłości korzystałem z MQ jako strony e-commerce, która musiała być połączona z Navision. Wszystko działało w systemie Navision, a zmiany wysyłane do witryny e-commerce za pośrednictwem MQ, w tym status zamówienia i wszystko, w tym opisy produktów, ceny itp. Nowe zamówienia zostały również wysłane do Navision za pośrednictwem MQ.

Walter
źródło
Hmmm, podoba mi się pomysł modelu wypychania, jednak widzę problem polegający na tym, że zmiana czasu komputera może spowodować utratę danych. BTW, mam konwencję, aby każdy rekord był oznaczony znacznikiem czasu w moich projektach baz danych. Dlaczego nie polecasz MQ?
dukeofgaming
Zgadza się, musisz używać komputerów zsynchronizowanych z czasem i UTC, ale teraz jest to dość standardowy (przynajmniej w systemie Windows). MQ jest czasem konieczne, ale myślę, że byłoby to zbyt wiele dla tego rodzaju aplikacji, którą tworzysz.
Ok, więc aby nadać priorytet niezawodności, lepiej jest raczej myśleć, że aplikacja komputerowa zostanie odłączona, a zatem lepiej traktować ją jako obywatela pierwszej klasy, jednak nadal mam wrażenie, że MQ łatwiej zastępować lokalną implementację bazy danych. Sądzę też, że wykonywanie wszystkich operacji CRUD na serwerze niejawnie zapewnia lepsze bezpieczeństwo. Co sądzisz o tych dwóch punktach ?.
dukeofgaming
@dukeofgaming: w moim przypadku zamówienia można przyjmować z dowolnego punktu sprzedaży (również aplikacja może być używana jako system przyjmowania zamówień, a nie system przetwarzania zamówień), w tym również z sieci. Wszystko było dystrybuowane w całym kraju. Absolutnie konieczne było, aby każdy komputer był autonomiczny w przypadku rozłączenia. MQ również działałby w tym scenariuszu, więc nie jestem przeciwny. Po prostu uważam, że łatwiej jest wdrożyć silną synchronizację danych między serwerami głównymi i klientami. Dlatego operacja CRUD na serwerze głównym nie była opcją.
2
+1 - tak widziałem to w przeszłości. Powiedziałbym również, że użycie unikalnego identyfikatora (Guids) jako kluczy podstawowych upraszcza rzeczy w ogromnym stopniu. Jest to jedna z tych rzeczy, które naprawdę ułatwiają życie na drodze, jeśli potrzebujesz synchronizacji.
Scott Whitlock,
1

Lub powinieneś przyjrzeć się implementacjom baz danych systemów podłączonych od czasu do czasu, które wykonują chropowatą synchronizację zdalnych klientów z serwerem. (SQL Server ma to do pewnego stopnia z SQL CE, Outlook to robi).

W ten sposób możesz wprowadzać wszystkie zmiany lokalnie w małej bazie danych (zachowuje wersje / logiczne znaczniki czasu itp., Dzięki czemu nie musisz się martwić o zegary na komputerze itp.), A po przejściu do trybu online synchronizujesz to z głównym serwer.

Nie wybrałbym rozwiązania REST, gdy system nie może być online przez większość czasu.

Subu Sankara Subramanian
źródło
Czy opisujesz rozproszoną bazę danych? Czy możesz to rozwinąć?
dukeofgaming
Nie - nie jest to rozproszony db w sensie prawdziwego świata. Rozproszony db zwykle oczekuje również, że prawie wszystko będzie w trybie online, ale logika replikacji wśród równorzędnych użytkowników również tutaj obowiązuje. Istnieje kilka baz danych na komputerach stacjonarnych / urządzeniach, które mają funkcję wykonywania replikacji ( blogs.msdn.com/b/stevelasker/archive/2007/03/18/… ) - więc wystarczy ustawić bazę danych tego urządzenia, zaloguj tutaj swoje zmiany, a kiedy połączysz się z siecią komputerową, zsynchronizuj połączenia - a to zrobi dla Ciebie transfer danych na główny serwer.
Subu Sankara Subramanian