Tipos de comunicação

Sistemas Distribuídos & Microsserviços

Tipos de comunicação


Sistemas Distribuídos & Microsserviços
(série de 3 partes)

O que são Sistemas Distribuídos?
Pensando Arquiteturalmente
Tipos de comunicação

Quando pensamos em Microsserviços e Sistemas distribuídos estamos na verdades falando de duas categorias que tem muito em comum, mas são vistos sob diferentes perspectivas. Como já discutimos em O que são Sistemas Distribuídos?, ao falarmos de Sistemas Distribuídos estamos enfatizando a capacidade desses sistemas de atuarem de maneira coordenada para um único fim, já quando falamos de microsservicos estamos falando da capacidade de sistemas serem entregues independentemente. O que há em comum nessas duas categorias é que eles precisam se comunicar! Nesse post vamos discutir como essa comunicação pode ser feita.

Os desafios dos sistemas distribuídos

A comunicação entre sistemas distribuídos e/ou microsserviços ocorre exclusivamente por meio de interfaces de rede. Esse tipo de comunicação apresenta uma série de desafios que não são encontrados em sistemas que operam em uma mesma máquina. Entre esses desafios estão a falta de um relógio comum, a ausência de memória compartilhada, a separação geográfica, além da autonomia e heterogeneidade dos sistemas envolvidos.

Ausência de relógio comum

Quando o sistema A envia uma mensagem para o sistema B o relógio da máquina em que A está sendo executado está desincronizado com o relógio da máquina em que B está sendo executado. Isso significa que se A gerou a mensagem em ta0 não há como B saber quando essa mensagem foi gerada. A única suposição que B pode fazer é que essa mensagem foi gerada antes de tb0 que é o momento em que B recebeu a mensagem. Da mesma forma, ao B enviar uma resposta para A em tb1, não há como A saber quando essa resposta foi gerada, só que ela foi gerada depois de ta0 e antes ta1.

no common clock
Figura 1. Ausência de relógio comum

Ausência de memória compartilhada

Processos em execução na mesma máquina podem criar espaços de memória compartilhado para escrita e leitura atrávés das chamadas de sistemas mmap e shmget. Porém essa possibilidade é inexistente quando se trata de sistemas distribuídos ou microsserviços, uma vez que eles operam em máquinas diferentes, impossibilitando o uso direto de memória compartilhada para comunicação entre processos.

Assim a comunicação entre sistemas deve ser feita através do envio de mensagens. Mensanges podem ser enviadas através de diversos protocolos da camada de transporte como o TCP, UDP, QUIC, Multicast. A escolha do protocolo será definida pelas características da comunicação. O protocolo TCP perde a comunicação orientada a conexão full-duplex, ou seja, ambos podem enviar e receber mensagens em um canal exclusivo e com a garantia de entrega da mensagem. O protocolo UDP é usado para transmitir dados pocuso sensíveis como aúdio e vídeo, por isso seu design foi pensado para oferecer baixa latência e pouca confiabilidade. Multicast é um protocolo usado para o envio de pacotes para diversos equipamentos em uma mesma rede, pode ser usado para descoberta de serviços e dispositivos. Por fim o QUIC é um protocolo que visa substituir o TCP baseando-se em conexões UDP.

A grande maioria dos microsservicos se comunicam usando protocols TCP e a diferenciação entre os formatos de comunicação se dá na camada de aplicação.

Separação Geográfica

Além da dificuldade de não terem relógio compartilhado, sistemas distribuídos não podem confiar no horário informados por outros sistemas. Isso se dá porque se os sistemas estão sendo executados em máquinas distintas, a comunicação insere latência entre o envio e recebimento das mensagens. Isso significa que no momento em que A envia uma mensagem para B, B recebe a mensagem algum tempo depois. Essa diferença de tempo é o que chamamos de latência. A latência de comunicação é impossível de se calcular porque mesmo que seja enviada uma mensagem para o outro dispositivo, esse ao responder colocará a latência de processamento dentro da latência total.

no common clock latency
Figura 2. Latência de comunicação

Autonomia e Heterogeneidade

Outra características das comunicaçòes entre sistemas distribuidos ou microsservicos é a autonomia e heterogeneidade dos sistemas. Quando um serviço A se comunica com B, A é executado em um sistema operacional e utiliza uma série de bibliotecas que podem dificultar sua comunicação com B.

Para abstrair essa complexidas existem os Middlewares. Middlewares são elementos de software que abstraem a complexidade de comunicação entre serviços, oferecendo uma interface uniforme para comunicação.

middleware 2
Figura 3. Middlware

Pensando a comunicação

Outra forma de pensar a comunicação entre dois serviços é avaliar se ela é sincrona, assincrona, bloqueante ou não-bloqueante. O envio de uma mensagem síncrona acontece quando o sistema que envia a mensagem aguarda o recebimento da resposta da mesma. Em uma comunicação assincrona, o sistema que envia a mensagem não aguarda o recebimento.

Já a comunicação bloqueante acontece quando o sistema, ao enviar uma mensagem bloqueia o processamento até que a comunicação seja terminada. Sistemas bloequantes são mais fáceis de serem implementados. Já envios não-bloequantes liberam a execução antes que a mensagem seja enviada pela rede. A comunicação entre dois sistemas podem ser bloequantes ou não-bloequantes independentemente. Isso significa que um sistema bloqueante pode se comunicar com um sistema não-bloequante usando o mesmo protocolo. Porém quando falamos de sistemas síncronos e assíncronos é impossível que a comunicação seja hibrida porque essa é uma característica do protocolo de comunicação.

Conclusão

Essas características da comunicação são muito importantes na hora de selecionar o protocolo pelo qual nosso sistema vai se comunicar. Todos os protocolos existentes e suas implementações poderão ser caracterizados pelo que foi discutido no texto.

Licença Creative Commons
Este obra está licenciado com uma Licença Creative Commons Atribuição-NãoComercial-CompartilhaIgual 4.0 Internacional .

Sistemas Distribuídos & Microsserviços
(série de 3 partes)

O que são Sistemas Distribuídos?
Pensando Arquiteturalmente
Tipos de comunicação