4. Systemy rozproszone

4.5. Architektura klient/serwer

Bardzo popularnym sposobem projektowania aplikacji sieciowych jest model klient-serwer, znany choćby ze sposobu manipulowania plikami w systemach UNIX, X Windows czy bazach danych. Klient oraz serwer to umowne nazwy pewnych typów programów komputerowych. Pierwszy z nich, z powodu braku danych lub funkcji, musi się kontaktować z drugim. Program zbierający dane lub obsługujący usługi, z którym kontaktuje się klient, nazywany jest serwerem. Rozproszony model klient/serwer, to taki, w którym klient oraz serwer rezydują w różnych komputerach połączonych siecią (niezależnie od systemu operacyjnego).

Serwer gromadzi dane, przetwarza je oraz przechowuje. Klient łączy się z serwerem, przedstawiając swoje zapytania lub żądania wykonania usługi. Serwer analizuje polecenia od klienta, przetwarza dane i wysyła odpowiedź. Ten prosty i sprawdzony model jest zastosowany w wielu aplikacjach dostępnych za pośrednictwem Internetu: serwery WWW, wyszukiwarki informacji w sieci, ogólnodostępne bazy danych czy też serwery poczty elektronicznej.

Wszystkie informacje przechowywane są na serwerze, wobec tego możliwe jest lepsze zabezpieczenie danych. Serwer może „decydować" kto ma prawo do odczytywania i zmiany danych. Istnieje wiele rozwiniętych technologii wspomagających działanie, bezpieczeństwo i użyteczność tego typu rozwiązania.

Duża liczba klientów próbujących otrzymać dane z jednego serwera może powodować różnego typu problemy związane z przepustowością łącza oraz technicznymi możliwościami przetworzenia żądań klientów. W czasie gdy serwer nie działa, dostęp do danych jest całkowicie niemożliwy. Do uruchomienia jednostki będącej serwerem z możliwością obsługi dużej liczby klientów potrzebne jest specjalne oprogramowanie oraz hardware, które nie występują w większości komputerów domowych.

Mimo faktu, że główna idea może być zaimplementowana na wiele sposobów najprostszym przykładem są strony internetowe. Przeglądając strony internetowe komputer użytkownika jest klientem, a komputery które obsługują bazy danych i inne aplikacje potrzebne do obsługi połączenia to serwery. W momencie gdy przeglądarka żąda jakiejś strony, serwer wyszukuje odpowiednie informacje w bazie danych, przetwarza je do postaci strony internetowej, a następnie wysyła do klienta.

Serwerem może być zwykły komputer, jednak do pełnego wykorzystania możliwości, jakie daje oprogramowanie serwerowe powinna to być maszyna dedykowana tej roli. Maszyny takie są przystosowane do pracy ciągłej, wyposaża się je w duże i szybkie dyski twarde, głównie SCSI, dużą ilość pamięci RAM, najczęściej z ECC oraz wydajne procesory serwerowe. Często serwerowe płyty główne mogą obsłużyć 2, 4 lub więcej procesorów. Serwer musi być maszyną niezawodną, w tym celu często zawiera 2 lub więcej (wbudowane) zasilacze typu hot-plug i awaryjne zasilanie, a pomieszczenie, w którym stoi powinno być wyposażone w odpowiednią wentylację lub klimatyzację.

Serwer jest zazwyczaj podłączony do Internetu szybkim łączem i potrafi dzielić pomiędzy aktualnie chcących korzystać z zasobów Internetu użytkowników, których nazywa się klientami. Serwer nie podłączony do Internetu, na przykład w sieci lokalnej może zarządzać współdzieleniem zasobów na poszczególnych komputerach (na przykład zainstalowanymi programami, danymi czy też urządzeniami peryferyjnymi).

Serwery najczęściej pracują pod kontrolą systemów operacyjnych takich jak: FreeBSD, GNU/Linux, Solaris, Novell NetWare, Microsoft Windows Server. Oprogramowanie zainstalowane na komputerze, który pełni rolę serwera, zależne jest od jego funkcji. Wśród wielu usług realizowanych przez serwery w Internecie są między innymi: obsługa stron WWW, poczty elektronicznej, przesyłanie plików (np. FTP), komunikacja online czy strumieniowa transmisja audio i wideo oraz wiele innych. Przykładowo jeśli ma to być serwer WWW, wykorzystuje się często wolne oprogramowanie Apache.

Serwlet to mały program wykonywany po stronie serwera WWW (nazwa powstała na wzór nazwy aplet). Serwlet otrzymuje od serwera komplet informacji zebranych z interakcyjnych elementów strony (zwykle z pól formularza) i po ich przetworzeniu dostarcza gotową stronę WWW - przesyłaną przez serwer do użytkownika. Ponieważ serwlet jest jedną z klas Javy, można w nim korzystać z całego dobrodziejstwa Java API - w tym z mechanizmów łączących z bazą danych, zdalnych wywołań metod (RMI) oraz CORBA. Parametry pobrane ze strony można przekazywać (forward) do następnego serwletu, tworząc w ten sposób kaskadę, w której każdy serwlet odpowiedzialny jest za fragment witryny.

Do uruchomienia serwletów konieczne jest funkcjonowanie serwera WWW z zaimplementowanym tzw. kontenerem serwletów. Najpopularniejszym z nich jest Tomcat oraz silniki korzystające z niego jak JBoss czy Apache z dodatkowym modułem (Apache Tomcat).

W ogólniejszym znaczeniu serwlet to program działający w modelu żądanie-odpowiedź. Poprzez analogię do protokołu HTTP, działającego w takim właśnie modelu, konstruować można inne typy serwletów. Przykładem technologii wykorzystującej koncepcję serwletu jest SIP Servlet API.

 

Przykład aplikacji sieciowej typu klient/serwer - rozproszony system plików.

Próba otwarcia pliku przez klienta jest równoważna wysłaniu serwerowi wiadomości z typem operacji, nazwą pliku, identyfikatorem użytkownika i szeregiem innych danych. Serwer otrzymujący taką wiadomość przeprowadza niezbędne testy - na przykład sprawdza, czy podany plik istnieje, czy użytkownik ma do niego prawo dostępu itp. W przypadku, gdy wszystkie testy wypadną pomyślnie, serwer wykonuje żądaną operację i wysyła odpowiedź klientowi.

Na etapie projektowania systemu podejmowana jest decyzja, który element modelu (klient, czy serwer) ma zapamiętać wszystkie dane dotyczące stanu czytanego pliku (nazwę pliku, przez kogo został otwarty, aktualne pozycje wskaźników do otwartych plików) oraz dane mogące się zmieniać w wyniku operacji wykonywanych przez klienta. W przypadku, gdy informacje te przechowywane są przez serwer, mamy do czynienia z modelem serwera „ze stanem” (z każdym z klientów mogą być związane struktury danych zawierające informacje na temat poprzednich poleceń), jeżeli przez klienta - jest to model serwera „bez stanu”. Wybór modelu może zależeć od wielu czynników.

Inna charakterystyka modelu klient/serwer obejmuje sposób obsługi poleceń przesyłanych przez klienta: serwery mogą być wielowątkowe (wewnętrznie współbieżne) lub też mogą być napisane bez użycia wątków. Serwery wielowątkowe są w stanie jednocześnie przetwarzać pewną liczbę żądań i związanych z nimi wątków, czyli tworzyć odpowiednik „lekkiego” procesu. Serwery napisane bez użycia wątków muszą skończyć wykonywanie bieżącego zadania zanim przejdą do obsługi następnego lub też manipulują wieloma wykonywanymi zadaniami za pomocą skomplikowanych struktur danych. Większość popularnych serwerów jest wielowątkowa. Wynika to głównie z postępów poczynionych w ciągu ostatnich lat w projektowaniu oraz implementacji bibliotek wątkowych.

Działanie programów prowadzących interakcje w sieci nie zawsze w pełni odpowiada definicji modelu klient/serwer. Na przykład, wybrany serwer może żądać wykonania usługi od jakiegoś innego serwera stając się jego klientem. Istotnym wymaganiem przy projektowaniu usług świadczonych przez poszczególne elementy modelu jest zasada, aby nie doprowadzać do zamknięcia kręgu zależności pomiędzy elementami modelu (klientami i serwerami).