Lo stile client-server
Due stili architetturali fondamentali per i sistemi distribuiti sono lo stile client-server e lo stile peer-to-peer.
Contesto: il sistema deve fornire l’accesso a risorse e/o servizi condivisi a un insieme di client distribuiti. Più in particolare il problema è consentire l’accesso a risorse e/o servizi condivisi sostenendo scalabilità, disponibilità da una parte e riuso e modificabilità dall’altra. La soluzione proposta da questo client-server è di organizzare il sistema come un insieme di servizi, server e client, che sono i tre tipici elementi di questo stile.
Ciascun servizio è caratterizzato da un’interfaccia, basata su un protocollo richiesta-risposta (di tipo sincrono), ed è un elemento centrale in questo stile architetturale.
Un server è un componente software runtime quindi un processo in grado di erogare uno o più servizi, da esso implementati.
Un client è anch’esso un componente runtime (processo) interessato a fruire di uno o più servizi, da parte di uno o più server.
In generale sono i client che richiedono servizi ai server, che svolgono attività solo se richieste ed inoltre questo stile prevede che ci possono essere molti client concorrenti. Quindi i server devono essere implementati in modo da consentire l’accesso concorrente, questo può essere facilitato con le tecnologie di middleware.
In alcuni casi alcuni componenti possono agire sia da server di alcuni servizi. che da client di altri servizi, in particolare quando implementano funzionalità che richiedono il supporto di servizi offerti di altri componenti.
Stile client-server e livelli
Un concetto importante nello stile C/S è quello di livello: in generale il sistema può essere organizzato come una sequenza di livelli; un livello è un nodo o un gruppo di nodi su cui è distribuito il sistema C/S; ogni livello ha responsabilità coese:
Esistono architetture client-server a due, tre e anche quattro livelli.
Nell’architettura a due livelli si distinguono il livello client ed il livello server. Il livello server si fa sempre carico della responsabilità di gestione delle risorse ed il livello server della presentazione, mentre la responsabilità della logica applicativa nel caso di thin client è assegnata al client e nel caso di thick client è assegnata al server. La prima è la prima architettura client-server introdotta intorno agli anni ‘80 in cui i client avevano capacità elaborative abbastanza scarse, ma può sovraccaricare il server ponendo problemi di scalabilità. Il thick consente di ridurre il carico a lato del server, quindi una scalabilità migliore
Nell’architettura a tre livelli il livello client si occupa solo della presentazione, un server intermedio che si occupa della logica applicativa chiamato talvolta application server, ed un data server per la gestione dei dati e delle risorse. In questo modo il carico viene distribuito meglio ed è possibile ottenere prestazioni migliori ed una migliore scalabilità, anche se l’architettura è più complessa, ma facilitata dall’utilizzo dei middleware moderni. Un’applicazione JavaEE è organizzata su quattro livelli un livello client, due livelli per la logica applicativa (Web Tier e Business Tier quest’ultima costituita da diversi tipi di componenti) e da un Database server. L’introduzione di più livelli consente maggiore flessibilità nella realizzazione di applicazioni, anche se aumenta la complessità e richiede l’uso di middleware più sofisticati.
Tipi di servizi
Nello stile client-server i servizi costituiscono una risorsa fondamentale.
Esistono diversi tipi di servizi:
un servizio è stateful se mantiene informazioni sulle conversazioni ovvero sulle sessioni di lavoro con i suoi client; (per esempio un servizio di commercio elettronico, deve mantenere memoria del carrello del cliente, nel momento della vendita)
altrimenti viene detto stateless (per esempio un servizio di previsione del tempo).
In genere questi ultimi sono più facili da implementare e non pongono problemi di scalabilità, mentre i primi possono richiedere dei middleware, essendo più complessi.
Altre caratteristiche
Nello stile client-server la comunicazione di solito è asimmetrica e sincrona.
Di tipo asincrono perché la comunicazione è iniziata dal client e proseguita dal server, inoltre è sincrona perché il client rimane in attesa dell’esecuzione da parte del server, ma talvolta sono possibili chiamate asincrone, notifiche e callback che rompono questi vincoli comuni, perché il client dopo la richiesta, continua a lavorare senza attendere la risposta, con le callback il server notifica al client il completamento di un’operazione onerosa e gli restituisce i risultati