System rozproszony. Rozsyłanie danych pomiędzy aplikacjami

0

Stanąłem przed takim oto problemem :

Potrzebuję napisać mechanizm w programie, który sprawia, że kolejne instancje tego samego programu potrafią się komunikować ze sobą na tym samym komputerze rozsyłając pomiędzy sobą obiekt typu ArrayList.

Dlaczego nie Remoting ?

  • ponieważ o ile można sprawić żeby pierwszy program uruchomił się jako serwer a reszta pracowała jako klienty, to nie da się sprawić żeby trzeci z uruchomionych programów mógł rozesłać obiekt ArrayListy do innych klientów i serwera, a potem na przykład żeby drugi czy czwarty zrobił to samo. Zawsze jeden jest serwerem, reszta jest klientami i jedynie klienci mogą wywoływać zdalne metody na serwerze (czyli defakto każdy z klientów musiałby się sam dopominać o ten obiekt od serwera, który to może nie mieć aktualnej wersji tego obiektu - czyli tej listy).

Dlaczego nie TcpListener i TcpClient ?

  • wszystko ładnie wygląda i serwer może rozsyłać sam obiekty do wszystkich programów ustawionych jako klienty podpięte do tego samego portu.
    Problem zachodzi wówczas gdy to jeden z klientów nagle ma zaktualizowany obiekt listy i musi go rozesłać do innych klientów i serwera.
    Nie da się, ponieważ klient nie może od tak stać się serwerem dla reszty klientów podpiętych do tego samego portu. Jest tak dlatego, że już jest jeden serwer na tym porcie i wyłączenie go by jeden z klientów mógł się stać serwerem a wcześniejszy serwer klientem (żeby także mógł odebrać tą listę) jest niemożliwe (chyba, że jest - ale mi się to nie udało).

Czego potrzebuję ?

  • potrzebuję czegoś co jednocześnie umożliwi mi bycie klientem, który nie będzie wymagał tego by wcześniej został odpalony na tym porcie serwer (jak w remotingu), ale jednocześnie będzie takim TcpListenerem, który będzie mógł rozesłać obiekt do reszty klientów podpiętych do tego portu.

Czy jest w ogóle taki mechanizm ? Wiem, że w Javie da się zrobić coś podobnego bez skomplikowanej budowli programowej i jeszcze bardziej zamotanego algorytmu.

PS: Wiem, że wszystko się da i można wymyślij super-mega skomplikowany algorytm, który będzie korzystał na raz z 10 portów, Remotingu, TcpClienta i Listenera jednocześnie - ale nie o to chodzi. Na pewno jest prostszy sposób na to. Ktoś na pewno przewidział taką możliwość.

Bardzo proszę Was o pomoc! Może ktoś ma jakieś pomysły/wskazówki dla mnie?

0

Nie rozumiem problemu. Na strukturze klient-serwer (a właściwie klienci-serwer) możesz zbudować dowolny mechanizm transmisji, na przykład sterowany żetonem.

Jedyne co robi serwer to dystrybucja zapytań - nie pełni funkcji klienta warstwy biznesowej; pełni wyłącznie funkcję arbitrażową. Każdy klient czeka na przyznanie mu żetonu. Po jego otrzymaniu wykonuje swoje zadania, wysyła serwerowi wynik i oddaje żeton. Serwer ten wynik rozsyła wszystkim klientom (broadcast lub - jak sieć rozległa - do każdego indywidualnie, z wyjątkiem nadawcy). Po tym przekazuje żeton następnemu klientowi. Jeśli przyjdzie nowy klient, doda się go do listy oczekujących na żeton. Jeśli klient z żetonem się rozłączy, po prostu żeton przekazuje się komuś innemu.

Jak sam serwer ma być mobilny, to przyda się zapisywać IP aktualnego serwera w stałym miejscu. Klient, który nie może się połączyć może wtedy samemu odpalić serwer, podłączyć się do niego i zaktualizować IP w stałym miejscu na swoje.

0

Dzięki za odpowiedź.

Zapomniałem dopisać jednej rzeczy. Warunkiem jest to, że w przypadku wyłączenia serwera jeden z klientów staje się serwerem i całość działa dalej. Serwer sam też korzysta z tego obiektu.

Projekt jest na dobrą sprawę nieużyteczny, chodzi o symulację. Projektem jest sieć oddziałów banku i przyłączonych do nich bankomatów. Każdy oddział banku jest serwerem dla swoich bankomatów (zrobione na Remotingu). Każdy z bankomatów wywołuje zdalną metodę i modyfikuje w ten sposób obiekt listy będący kontem (saldo konta). Potrzebna jest komunikacja pomiędzy oddziałami banku. Każdy oddział jest sobie równy i jeśli z jakiegoś bankomatu klient zaloguje się na swoje konto to automatycznie zostaje to konto zablokowane dla pozostałych bankomatów podłączonych do innych oddziałów banku. Żeby to działało to w momencie zalogowania się przez bankomat oddział musi rozesłać do pozostałych oddziałów informację o tym, że to konto jest zablokowane. Przy wylogowaniu także ma rozesłać do pozostałych oddziałów listę z tymi kontami bądź to jedno konto (nie ma znaczenia - nie to jest problemem).
No i wszystko działa poza tą komunikacją pomiędzy oddziałami.

0

Zakładając, że wszystko ma działać na jednym komputerze i ten serwer (tj. oddział banku) miałby wysłać coś do konkretnego bądź do wszystkich oddziałów to nie może być to Remoting - no bo jak serwer miałby zainicjalizować komunikację z klientem (innym oddziałem) żeby sprawdzić w odpowiedzi czy ten nie ma nowszej listy z kontami niż on sam ma. W Remotingu to klient musi wywołać metodę na serwerze.
A jeśli wykorzystamy TcpListenera to owszem możemy rozesłać zapytanie do pozostałych oddziałów tak by odpowiedział nam tylko ten, który nas interesuje w kolejce, ale jeśli już wyłączymy serwer w jakimś momencie no to w jaki sposób inny klient miałby zająć jego miejsce gdy chcąc wysłać odpowiedź do serwera nie będzie mógł ? Jest na to jakiś sposób ?

Mam nadzieję, że w miarę jasno to opisałem. Wiesz co mam na mysli?

Pozdrawiam!

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