Arquitectura cliente-servidor

miniatura|275px|Representación da arquitectura cliente-servidor.
A **arquitectura cliente-servidor** é un modelo de aplicación no que as tarefas son divididas entre os provedores de recursos e servizos, chamados servidores, e os demandantes, chamados clientes. Un cliente fai as peticións a outro programa, o servidor, que dá resposta. Esta idea pode ser aplicada a programas executados nun único ordenador, aínda que sexa máis vantaxosa nunha contorna distribuída a través dunha rede de comunicacións.

Exemplos de aplicacións informáticas que usan o modelo cliente-servidor son: o correo electrónico, os servidores de impresión e a World Wide Web.

## Información xeral 
A arquitectura cliente-servidor é unha estrutura de organización de alto nivel do software na que os clientes se comunican ou interactúan cun servidor, que proporciona distintos recursos e funcionalidades que están así dispoñibles e son xestionados de xeito centralizado.

Nesta arquitectura, a responsabilidade de procesamento divídese entre clientes e servidores (dando lugar a modelos de *cliente lixeiro* ou *cliente pesado* segundo as capacidades que se trasladen do servidor aos clientes), e presenta vantaxes de organización debido á centralización da xestión da información nos servidores e a separación de responsabilidades, o que adoita facilitar o deseño de certo tipo de sistemas.

A separación entre cliente e servidor é unha división lóxica en que o servidor non se atopa necesariamente nunha única máquina e non é necesariamente un único programa. De feito, unha variante común son os sistemas en que os diferentes servizos proporcionados polo servidor están divididos en diferentes compoñentes independentes que poden ser executados por diferentes computadores, favorecendo así a distribución do sistema.

## Compoñentes e características 
Na arquitectura cliente-servidor o remitente dunha solicitude é coñecido como cliente. As súas características son:
 
* É quen inicia solicitudes ou peticións, polo tanto, ten un papel activo na comunicación.
* Agarda respostas do servidor ás súas peticións (habitualmente de xeito síncrono).
* Pode ter a posibilidade de conectarse a varios servidores ao mesmo tempo.
* Posibilita a interacción cos usuarios finais a través dunha Interface gráfica de usuario.

O receptor da solicitude enviada polo cliente é coñecido como servidor. As súas características son:

* Agarda a chegada de peticións de clientes, polo tanto, xoga un papel pasivo na comunicación.
* Tras a recepción da solicitude, procésaa e a continuación, envía a resposta para o cliente (habitualmente de xeito síncrono).
* Pode aceptar e atender peticións de varios clientes ao mesmo tempo.

Os servidores poden manter un estado interno (*stateful*) para cada petición/cliente ou non telo (*stateless*). Un servidor sen estado interno non garda ningunha información entre as solicitudes. Pola contra, un servidor con estado pode "lembrar" información entre diferentes solicitudes, de xeito que a súa resposta dependa en certo modo desa información. O ámbito desta información "lembrada" pode ser global ou específico a unha *sesión* (isto é, a un cliente, a un período de tempo, ou a unha combinación de ambos). Por exemplo, un servidor HTTP para páxinas estáticas HTML é un exemplo de servidor sen estado, mentres que Apache Tomcat é un exemplo dun servidor con estado.

A interacción entre o cliente e o servidor descríbese frecuentemente usando diagramas de secuencia. Os diagramas de secuencia son parte da linguaxe de modelaxe estándar UML.

## Vantaxes 
A arquitectura cliente-servidor presenta as seguintes fortalezas:
* Centralización do control: os accesos, recursos e integridade dos datos son controlados unicamente polo servidor, de xeito que para un programa cliente defectuoso ou non autorizado non pode danar o sistema. Esta centralización tamén facilita a tarefa de actualización de datos ou outros recursos.
* Escalabilidade: a organización que se propón favorece o aumento da capacidade dos clientes e servidores por separado. Calquera elemento pode ser aumentado (ou mellorado) en calquera momento, ou é posible engadir novos compoñentes (clientes e/ou servizos) ao sistema.
* Facilidade de mantemento: ó estar divididas as funcionalidades e as responsabilidades entre varios compoñentes independentes, é posible substituír, arranxar, actualizar ou incluso trasladar un servizo/servidor, sen afectar aos clientes (ou sendo afectados minimamente). Esta flexibilidade con respecto aos cambios tamén é coñecida como encapsulamento.

## Desvantaxes 
A arquitectura cliente-servidor presenta as seguintes debilidades:
* Dispoñibilidade: cando un servidor esta caído, as peticións dos clientes non poden ser atendidas. Distribuír diferentes servizos do sistema en distintos servidores físicos permite que se un servizo se cae, o resto sigan funcionando.
* Rendemento: a conxestión do tráfico no acceso ao servidor é un dos posibles problemas desta arquitectura. Cando unha gran cantidade de clientes envían de xeito simultáneo solicitudes para o mesmo servidor, este pode non ser quen de atendelas todas, podendo chegar a saturarse provocar a caída do sistema. Pola contra, distribuír os servizos proporcionados en diferentes servidores físicos pode mellorar esta situación.