Fluxos Poliglotas

A suruba da comunicação entre sistemas

"Valeu" escrito em um papocado de idioma

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.

Código para “bola rápida, semi-devagar, retilínea e uniformemente variada”, obviamente.

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.

Aposto que foi o de cachimbo

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, APIs, arquivos, banco de dados, filas e muitos outros.

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

Estou quase certo que existe uma mensagem subliminar na imagem

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:

  • Direção É possível que os comunicantes enviem mensagens uns aos outros ou essa habilidade é restrita apenas a um dos participantes? Em uma palestra, usualmente, apenas o palestrante consegue enviar uma mensagem;
  • Peso Quantos bytes são adicionados para enviar a mensagem? Qual o tamanho do cabeçalho? No alfabeto aeronáutico, para evitar ambiguidades, cada letra se torna uma palavra. A letra "A" é representada pela palavra "alpha" e a letra "B", pela palavra "bravo". Funciona, mas a mensagem se torna bem maior do que a original;
  • Quantidade de destinatários É possível enviar a mensagem para múltiplos destinatários ao mesmo tempo, como em um grupo de whatsapp?;
IPC não confiável
  • Confiabilidade Existe um grau de confiança que as mensagens chegarão aos ouvintes? A ordem das palavras será mantida? Não se você for usuário X (substitua X por sua operadora telefônica);
  • Facilidade Convenhamos, não é tão fácil aprender japonês em braille;
  • Sincronia Ao enviar a mensagem, o remetente precisa ficar plantado, com o telefone no ouvido, esperando a resposta ou pode receber a mensagem posteriormente?
  • Outros Acreditem, existem inúmeras outras características, mas eu não sou corno para listar todas.

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.

O quê? O seu também é Beth?

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.

A torre de Babel da computação

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 e com quais ferramentas podem ser testados tais sistemas?

Guilherme Virgs Moraes

Written by

I am a doer. Enthusiastic about everything, amazed at the life itself and the desire to evolve everyone's skills. pagehub.me/virgs

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade