/ / Quali sono gli svantaggi pratici dell'utilizzoformato di scambio di dati fortemente tipizzato (ad es. parsimonia / proto capn) in un contesto di microservizi? - json, serializzazione, parsimonia, microservizi, scambio dati

Quali sono gli svantaggi pratici dell'utilizzo di un formato di interscambio di dati fortemente tipizzato (ad es. Parsimonia / proto capn) in un contesto di microservizi? - json, serializzazione, parsimonia, microservizi, interscambio dati

Sto pensando di introdurre un fortemente tipizzato(leggi - con schema predefinito) formato di scambio dati per la comunicazione tra i nostri servizi interni. Ad esempio, immagino qualcosa come Thrift o Cap "n Proto.

Almeno due ovvi vantaggi (per me) di usare questo su qualcosa come JSON è quello

  1. dovresti CONOSCERE il formato esatto dei dati che il servizio può aspettarsi (quindi lascia meno spazio a ambiguità ed errori durante la comunicazione) e
  2. l'implementazione generalmente deserializza il messaggio non elaborato e fornisce metodi per accedere agli oggetti.

Quali sono gli svantaggi pratici per percorrere questa strada rispetto a qualcosa come JSON?

Per il contesto: il nostro sistema è costituito da serviziscritto in Python e Java - e possibilmente in altre lingue in futuro, e comunica tramite endpoint HTTP tra servizi e broker di messaggi come rabbitmq.

risposte:

0 per risposta № 1

Come con ogni sistema fortemente tipizzato, uno dei maggiori vantaggi è senza dubbio che se si commettono errori, esso fallisce presto nel processo, in genere in fase di compilazione, il che è positivo.

Secondo grande vantaggio IMHO è quello che giàdetto: poiché i campi e i tipi sono ben noti, il compilatore, le librerie e il codice correlato sanno quali dati aspettarsi e quindi possono essere scritti / organizzati in un modo più efficiente - o in breve: prestazione.

Al contrario, un sistema tipicamente losco (come Avro), pur consentendo molto di più flessibilità senza la necessità di ricompilare, viene fornito con l'altro lato della stessa medaglia: il rovescio della medaglia di essere incline a errori riguardanti il ​​contenuto del messaggio in fase di esecuzione.

Questo perché definisce un sistema losamente definitosolo la sintassi di un documento valido (come ad esempio XML) e lascia la semantica a livello di messaggio di ciò che è nel documento fino ai livelli superiori. Un sistema fortemente tipizzato ha le conoscenze su quella semantica a livello di messaggio già integrata al momento della compilazione. Pertanto, è facile rilevare / decidere seun particolare documento o messaggio non è solo ben formato ma valido per quanto riguarda il contenuto del messaggio. Se è necessario fare lo stesso con il sistema definito in modo errato, è necessario fornire ulteriori informazioni in fase di esecuzione (come lo schema XML) e convalida il tuo documento.

Linea di fondo

Quale sistema preferisci è più o meno una questionedi gusto nella maggior parte dei casi. Deciderei in base alla domanda, in che misura sono variabili i dati che devo affrontare. Se ha senso utilizzare un sistema fortemente tipizzato, farei così, perché mi piace molto informarmi di errori ed errori in anticipo.

Tuttavia, se è necessario essere molto flessibilistrutture di dati, potrebbe avere più senso percorrere l'altra strada. Anche se progettare uno schema tipicamente losco sopra un sistema fortemente tipizzato è sicuramente possibile, è in qualche modo contraddittorio e finirai con qualche cosa eccessivamente complicata, sebbene eccessivamente generica.


0 per risposta № 2

Typed

I messaggi in arrivo che sono taggati sono moltoliberatorio, purché sia ​​possibile dire quale sia il messaggio in arrivo senza leggerlo tutto. In tal caso, allora non ti interessa più tanto l'ordine dei messaggi. Questo perché è facile da gestire per il destinatario dei messaggi qualunque cosa venga inviata. Quindi puoi avere un'applicazione che si trova lì a prendere tutto ciò che ottiene, e fa solo ciò che è appropriato per ognuno.

Formato

Un linguaggio di schema che consente di definire il valoree i vincoli di dimensione sono molto utili. Significa che il mittente di un messaggio non può inviarne accidentalmente uno non valido. Inoltre, il destinatario può dire automaticamente se un messaggio in arrivo soddisfa lo schema. Questo è un vero vantaggio nell'implementazione di un servizio di rete; la maggior parte della convalida del messaggio è fatta per te!

Per vincolo di dimensione, intendo che è possibile specificareper quanto tempo un array è nello schema e il codice generato rifiuterà di gestire array più o meno lunghi. Per vincoli di valore, immagina un campo di messaggio chiamato "cuscinetto"; potresti voler vincolarlo tra 0 e 359.

Entrambi ti consentono di rendere chiaro, inequivocabiledichiarazione su quale sia l'interfaccia e la faccia applicare automaticamente. Quanti bug di sicurezza ci sono stati di recente in cui alcune convalide dei dati dell'interfaccia di rete sono state implementate male ...

Opzioni

Uno standard di serializzazione che fa tutto questo èASN.1. Gli strumenti che ho usato prendono uno schema ASN.1 e producono codice per serializzare e deserializzare, controllando automaticamente che i vincoli di valore e dimensione siano stati rispettati e anche dicendo che tipo di messaggio in arrivo è. Gli strumenti per ASN.1 possono essere piuttosto anziani e hanno bisogno di essere aggiornati. Se aggiornato, sarebbe l'ideale per tutti gli scopi, con formati binari e di testo disponibili.

Ora ci sono anche schemi JSON e sembrano avere vincoli di tipo, valore e dimensione. Questo potrebbe essere quello che stai cercando.

Sono abbastanza sicuro che Google Protocol Buffers non digita molto bene i tag e non fa vincoli di valore e dimensione. Ho visto commenti nello schema GPB sulla falsariga di:

// musn "t deve essere maggiore di 10.

Se questo è ciò che viene scritto in uno schema, il linguaggio dello schema è probabilmente inadeguato ...

Non sono sicuro di Thrift, non sono sicuro che valga i vincoli (qualcuno mi corregga se sbaglio, per favore!).

svantaggi

Non riesco a pensare a nessuno! Può irritare gli sviluppatori; il codice che ritenevano buono può essere prontamente rivelato per produrre messaggi spazzatura, il che li infastidisce intensamente ...