RabbitMQ come backbone per servizi scritti in lingue diverse

1

Sto cercando consigli da persone che usano RabbitMQ per collegare servizi scritti in lingue diverse. Attualmente la mia organizzazione utilizza RabbitMQ esclusivamente con C # e tutto funziona abbastanza bene. Per fornire alcune funzionalità aggiuntive aggiuntive rispetto a ciò che fornisce RabbitMQ, abbiamo implementato MassTransit. MassTransit offre alcuni grandi vantaggi rispetto a RabbitMQ (astrae le specifiche di RabbitMQ, gestisce i messaggi "veleno", tentativi, serializzazione, fornisce molti schemi di messaggistica, ecc.). Tuttavia, il principale svantaggio è che ti blocca usando .NET; gestisce SOLO la deserializzazione nelle classi .NET. Questo limita la nostra capacità di creare servizi scritti in linguaggi non.NET. Ovviamente potremmo mettere in risalto endpoint REST scritti in C # per consentire la connessione di altri servizi, ma non è l'ideale, dato che altri servizi dovrebbero essere in grado di coinvolgere pub / sub e altri messaggi non adatti a REST.

Quindi ecco la domanda: se stai usando RabbitMQ, come stai connettendo servizi scritti in lingue diverse? Devi implementare del codice condiviso per ogni lingua che vuoi supportare per gestire la serializzazione / deserializzazione?

Grazie per il tempo dedicato a rivedere questo e condividere il tuo consiglio.

    
posta Andy 02.03.2018 - 17:58
fonte

2 risposte

2

Lo fai come se stessi chiamando i sistemi direttamente attraverso una determinata API, come la connessione diretta dei microservizi. Hai bisogno di un formato unificato.

Molte, se non la maggior parte, le API hanno adottato JSON come formato di scambio, perché è facilmente comprensibile e processabile praticamente da qualsiasi lingua standard oggi.

Con RabbitMQ dovrebbe essere lo stesso, invece di serializzare l'intera classe .NET, dovresti serializzarli in e.g. JSON e hanno una logica di deserializzazione dall'altra parte.

Nella maggior parte delle lingue la serializzazione da e verso JSON è incredibilmente facile, ci sono numerose librerie (come GSON per Java, Newtonsoft per C #, metodi incorporati in PHP, ...). Avrai solo bisogno di un sacco di nuovi DTO su ciascun lato del bus dei messaggi.

Se ritieni che il formato JSON manchi di qualcosa, forse è troppo grande, potresti dare un'occhiata a qualcosa come Buffer del protocollo .

    
risposta data 02.03.2018 - 19:46
fonte
1

Ho fatto quello che stai facendo con i dati del sensore. Abbiamo molti tipi diversi di sensori. Alcuni includono molti tipi di dati, alcuni molto piccoli, e spesso i dati sono in diverse unità di misura (metri o piedi, ecc.).

Il team si è riunito e ha creato una rappresentazione JSON di come vorremmo che il messaggio fosse visualizzato quando i nostri consumatori lo ricevono da RabbitMQ. Ovviamente, alcuni campi saranno vuoti o inesistenti, e alcuni messaggi potrebbero avere campi aggiuntivi, ma gli oggetti JSON di primo e secondo livello nel messaggio saranno coerenti.

I produttori serializzano il loro messaggio in un oggetto JSON con codifica UTF-8 byte molto vicino al modello che abbiamo progettato e lo inviano al RabbitMQ. I consumatori lo deserializzano in un POCO / POJO e fanno ciò di cui hanno bisogno.

Alla fine della giornata, la maggior parte delle lingue è in grado di convertire il messaggio in una stringa e leggere l'oggetto JSON, così possiamo usare qualsiasi lingua desideriamo.

    
risposta data 03.03.2018 - 18:55
fonte

Leggi altre domande sui tag