Fluxos Poliglotas cover

Fluxos Poliglotas

A suruba da comunicação entre sistemas

10/Jul/2018
8 minutos

Escuta, entende e responde

De maneira geral, é assim que a comunicação ocorre entre os seres vivos e o propósito é transmitir uma mensagem e, talvez, receber outra mensagem como resposta.

A teoria da comunicação formaliza e identifica diversos elementos na própria comunicação. Dentre outros elementos, listo: mensagem, emissor, receptor, meio, código, etc.

Acredito que um deles merece um destaque especial: código.

O código desempenha papel indispensável para a comunicação: a maneira pela qual a mensagem se organiza. É uma coleção de regras que governa a comunicação de dados, um comum e pré-determinado acordo entre o emissor e o receptor.

Comunicação humana

Analisando a forma que a comunicação da humanidade em todos os tempos, identificamos em abundância códigos verbais, visuais, gestuais, sonoros, fumaçais (?), luminosos, elétricos, acrobático e muitos outros.

Os motivos para tamanha abundância variam e são incontáveis, mas geralmente envolve restrições do meio, emissor e receptor. Outros elementos identificados na teoria da comunicação. Dependendo dessa combinação, alguns códigos são mais favoráveis enquanto outros são impossíveis.

Já tentou ter uma conversa verbal submerso em água? Experimente conversar gestualmente em ambientes escuros.

Libras, por exemplo, é um código para comunicação de deficientes auditivos, entretanto exige luminosidade e contato visual. O Código Morse, por sua vez, demanda apenas um sinal, sendo este longo ou curto para o envio de mensagens. Stickers e memes no whatsapp são excelentes exemplos, mas só pessoas profundamente letradas são capazes de entender.

Entendem onde eu quero chegar? Existem inúmeros meios de comunicação. E não existe um fundamentalmente ideal para todas as ocasiões. As formas, diferenciam-se entre si de diversas maneiras e cada qual se sobressai dependendo da circunstância.

Ruídos de comunicação

Existe uma tradicional brincadeira infantil que destaca a importância dos elementos da comunicação, sobretudo o código.

Telefone sem fio é jogo no qual uma pessoa (remetente) fala (código verbal) uma frase (mensagem) para o participante ao seu lado (destinatário), de maneira que os demais não escutem. Quem ouviu tenta então repeti-la fielmente — se você jogar com pessoas honestas, o que nunca foi meu caso — para o próximo participante, e assim por diante até chegar ao último, que deve falar a frase em voz alta.

Uma das regras do jogo é que o ouvinte da vez não pode solicitar que a frase seja repetida. Os ruídos de código são acumulados sucessivamente e é comum a frase tornar-se cada vez mais deturpada a medida que é repassada, eventualmente ficando totalmente diferente ao ouvinte final.

Nas minhas jogatinas, inexplicavelmente, a mensagem original “o rato roeu o rei de Roma” virava “três pratos de trigo tristes” e a frase “espalha rama pelo chão” virava “voulevu cuchê avemuá”. Definitivamente, eu não jogava com pessoas honestas.

Recebe, processa e envia

De maneira análoga e em diferentes níveis de abstração, a tarefa típica de desenvolvimento de software espelha a comunicação entre os seres vivos: receber inputs, processá-los e produzir outputs. Percebe-se reflexos dessa atividade na elaboração de funções, classes e fluxos de dados em um conjunto de sistemas.

Arquiteturas reativas são compostas por múltiplos componentes e, não raramente, múltiplas gerações de tecnologia coexistem pacificamente fornecendo um produto viável.

Além disso, softwares estão incrementalmente dependentes de outros softwares para providenciar suas funcionalidades, assim eles consomem dados de muitas fontes de informação: apps, websites, _API_s, arquivos, banco de dados, filas e muitos outros.

Esses componentes atuam como receptores e transmissores e a mensagem é composta pelos dados que desejamos transitar.

Invariavelmente, é necessário integrá-los de alguma forma. Portanto, um mecanismo de comunicação se faz necessário para que diferentes sistemas dialoguem entre si.

Comunicação inter-processos

No contexto de sistemas/processos/softwares, chamamos o código da teoria da comunicação de inter process communication protocol — IPC.

Existem vários tipos de IPC e, assim como os códigos da comunicação humana anteriormente exemplificados, diferenciam-se entre si por diversos atributos. Tem para todo gosto e fetiche. Alguns desses atributos são:

Sincronia

Destaco aqui o valor da sincronia. Ninguém merece ficar bloqueado enquanto não recebe uma resposta.

Isso causa um certo incômodo em alguns usuários do whatsapp. Mas, se é necessária uma resposta imediata, recomendo a utilização de um outro protocolo bem conhecido: ligação telefônica!

Eu, como destinatário do whatsapp, possuo outras prioridades (leia: não me importo com você e sua urgência). Pode ser considerada uma ação egoísta, e, na maior parte do tempo, é mesmo. Não há vergonha em admitir isso. Existem momentos em que isso é absolutamente a coisa correta a se fazer.

A regra é que a comunicação deve ser assíncrona**.** O que não significa que você precisa usar um IPC específico, significa que a comunicação deve ser feita pela propagação de dados assincronamente, não dependendo de outros como parte da operação inicial de solicitação.

O destinatário da mensagem a processa somente quando disponível, evitando sobrecargas e congestionamentos desnecessários.

Fazer uma consulta para poder fornecer uma resposta deteriora a resiliência. Além disso, as dependências síncronas entre os microsserviços, ao criar cadeias de requisição/resposta, também afetam o desempenho geral e responsividade quando um dos serviços nessa cadeia não é executado corretamente. Responsividade e resiliência são pontos cruciais nos sistemas reativos.

É válido reforçar que a comunicação assíncrona é naturalmente mais complexa e requer maior precaução. Afinal, não há, necessariamente, uma resposta para cada requisição e sim uma “nova requisição”. Se não implementada com a devida atenção, pode acarretar em problemas como loops infinitos, transações de compensação e condições de corrida. Considere ler sobre SAGA para maiores detalhes.

Comunicação de sistemas reativos

Como mencionado anteriormente, a escolha do protocolo de comunicação deve ser baseada em vários aspectos. Esses aspectos variam dependendo do sistema e do contexto.

Protocolos mais leves são preferíveis em ambientes com restrição de recursos computacionais. Da mesma forma, em um contexto com restrições mais brandas, a escolha de um protocolo mais robusto e com grau de confiança maior pode ser mais apropriada. Em outras ocasiões, pode ser necessário consumir recursos de uma biblioteca de terceiros através de uma API síncrona.

Fluxo poliglota

Dado que em um conjunto de sistemas reativos as características variam, conclui-se que os protocolos apropriados podem variar também, permitindo a escolha de múltiplos protocolos.

É razoável admitir a coexistência de múltiplos protocolos IPC dentro de um mesmo ecossistema de serviços, o que denomino “fluxos poliglotas”.

Assino embaixo da frase acima. Até porque eu criei. Mas friso a sua importância.

Fluxo poliglota é um termo chique que diz: ao transitar dados entre sistemas distribuídos, a escolha do protocolo IPC deve ser baseada nas aplicações envolvidas e no que os dados representam.

Diferentes fluxos são tratados com diferentes tecnologias. Significa permitir o uso da melhor ferramenta para o melhor caso de uso. É o mesmo argumento que sustenta programação poliglota e persistência poliglota, que falam sobre a viabilidade de um mix na escolha da linguagem de programação e tecnologia de persistência, respectivamente.

Do mesmo modo, apesar de desejável, não é viável que o código verbal seja aplicado para todas as comunicações existentes. Simplesmente não é possível utilizá-la em longas distâncias, embaixo d’água, com deficientes auditivos, com alguém que não fala a mesma língua e em muitos outros cenários.

Em um futuro breve, escreverei sobre o protocolos de IPC que considero mais populares (leia: os possuo maior proficiência), como: HTTP, AMQP, MQTT e KAFKA. O propósito é destacar as principais virtudes, carências, e cenário adequado de cada um deles.

Ruídos na comunicação de sistemas

Apesar da possível/provável coexistência, o ideal é tentar minimizar a troca de mensagens entre os componentes internos da arquitetura.

Assim como na brincadeira de telefone sem fio, as menores falhas de comunicação podem ser acumuladas ao passar a informação sucessivamente. Potencializando mal-entendidos e ambiguidades.

Além das próprias falhas de inerentes ao código, cada sistema processa a mensagem antes de repassá-la adiante. Portanto, a mensagem é reinterpretada a bel-prazer em cada processamento. Sem contar do desgaste de performance em cada retransmissão.

Testes de fluxos poliglotas

Dada a maior complexidade inerente a adoção de fluxos poliglotas, como podem ser testados tais sistemas?

Já que você tá por aqui, dá uma olhada nesses aqui também: