/ / Quais são as desvantagens práticas de usarformato de intercâmbio de dados com forte digitação (por exemplo, thrift / capn proto) em um contexto de microsserviços? - json, serialização, economia, microsserviços, intercâmbio de dados

Quais são as desvantagens práticas de usar o formato de intercâmbio de dados fortemente tipado (por exemplo, thrift / capn proto) em um contexto de microsserviços? - json, serialização, economia, microsserviços, intercâmbio de dados

Estou pensando em introduzir um texto fortemente tipado(leitura - com esquema predefinido) formato de intercâmbio de dados para comunicação entre nossos serviços internos. Por exemplo, acho que algo como Thrift ou Cap "n Proto.

Pelo menos duas vantagens óbvias (para mim) de usar isso em algo como JSON é que

  1. você saberia o formato exato dos dados que o serviço pode esperar (portanto, deixa menos espaço para ambiguidade e erros durante a comunicação) e
  2. a implementação geralmente desserializa a mensagem bruta para você e fornece métodos para acessar os objetos.

Quais são as desvantagens práticas de seguir esse caminho, em comparação com o JSON?

Por contexto - nosso sistema consiste em serviçosescrito em python e java - e possivelmente em outras linguagens no futuro, e se comunica via pontos de extremidade HTTP entre serviços e intermediários de mensagens, como rabbitmq.

Respostas:

0 para resposta № 1

Como em todo sistema fortemente tipado, uma das principais vantagens é, sem dúvida, que se você cometer erros, falha cedo no processo, normalmente na fase de compilação, o que é uma coisa boa.

Segunda maior vantagem IMHO é o que você jádito: como os campos e tipos são bem conhecidos, o compilador, as bibliotecas e o código relacionado sabem quais dados esperar e, portanto, podem ser gravados / organizados de uma maneira mais eficiente - ou, em resumo: desempenho.

Por outro lado, um sistema com baixa tipagem (como o Avro), ao mesmo tempo em que permite flexibilidade sem a necessidade de recompilar, vem com o outro lado da mesma moeda: a desvantagem de ser propenso a erros em relação ao conteúdo da mensagem em tempo de execução.

Isso ocorre porque um sistema mal definido definesomente a sintaxe de um documento válido (como por exemplo XML) e deixa a semântica no nível da mensagem do que está no documento até as camadas superiores. Um sistema fortemente tipado tem o conhecimento sobre a semântica no nível da mensagem já incorporada em tempo de compilação. Portanto, é fácil detectar / decidir seum documento ou mensagem em particular não é apenas bem formado, mas é válido em relação ao conteúdo da mensagem. Se você precisar fazer o mesmo com o sistema com definição deficiente, precisará fornecer informações adicionais em tempo de execução (como esquema XML) e valide seu documento contra ele.

Linha de fundo

Qual sistema você prefere é mais ou menos um problemade gosto na maioria dos casos. Eu tomava a decisão com base na pergunta: quão variáveis ​​são os dados com os quais tenho que lidar. Se faz sentido usar um sistema fortemente tipado, eu continuo assim, porque gosto muito de ser informado sobre erros e erros cedo.

No entanto, se houver necessidade de flexibilidade muitoestruturas de dados, pode fazer mais sentido seguir o outro caminho. Embora seja certamente possível projetar um esquema com baixa tipografia em cima de um sistema fortemente tipado, é um tanto contraditório e você terminará com alguma coisa excessivamente complicada e genérica.


0 para resposta № 2

Digitado

As mensagens de entrada marcadas com tipo são muitolibertador, contanto que seja possível dizer qual é a mensagem recebida sem ler tudo. Nesse caso, você não se preocupa mais com a ordem das mensagens. Isso ocorre porque é fácil para o destinatário das mensagens manipular seja o que for enviado. Assim, você pode ter um aplicativo que fica lá, pegando o que quer que seja, e faz o que é apropriado para cada um.

Formato

Uma linguagem de esquema que permite definir valore restrições de tamanho são muito úteis. Isso significa que o remetente de uma mensagem não pode enviar acidentalmente uma mensagem inválida. Além disso, o receptor pode dizer automaticamente se uma mensagem recebida atende ao esquema. Este é um bônus real na implementação de um serviço de rede; a grande maioria da validação de mensagens é feita para você!

Por restrição de tamanho, quero dizer que você pode especificarpor quanto tempo uma matriz está no esquema e o código gerado se recusará a manipular matrizes mais longas ou mais curtas. Por restrições de valor, imagine um campo de mensagem chamado "rumo"; convém restringir o valor entre 0 e 359.

Ambos permitem que você faça uma clara e inequívocadeclaração sobre o que é a interface e aplicá-la automaticamente. Quantos erros de segurança ocorreram recentemente em que alguma validação de dados da interface de rede foi mal implementada ...

Opções

Um padrão de serialização que faz tudo isso éASN.1. As ferramentas que usei usam um esquema ASN.1 e produzem código para serializar e desserializar, verificando automaticamente se as restrições de valor e tamanho foram atendidas e também informando qual é o tipo de mensagem recebida. As ferramentas para ASN.1 podem ser bastante idosos e com necessidade de atualização.Se atualizado, seria ideal para todos os fins, com os formatos de fio binário e de texto disponíveis.

Agora também existem esquemas JSON, e eles parecem ter restrições de tipo, valor e tamanho. Isso pode ser o que você está procurando.

Tenho certeza de que os Buffers de Protocolo do Google não fazem tags muito bem e não fazem restrições de valor e tamanho. Vi comentários no esquema GPB ao longo das linhas de:

// não deve ser maior que 10.

Se é isso que está sendo escrito em um esquema, a linguagem do esquema é indiscutivelmente inadequada ...

Não tenho certeza da Thrift, não tenho certeza de que ela valorize as restrições (alguém me corrija se estiver errado, por favor!).

Desvantagens

Não consigo pensar em nada! Isso pode irritar os desenvolvedores; o código que eles consideravam bom pode ser facilmente revelado como produzindo mensagens indesejadas, o que os irrita intensamente ...