Modalità indipendenti dalla piattaforma per trasmettere messaggi tra eseguibili

-2

Sto lavorando su un raccoglitore di dati che potrebbe essere chiamato un'API di alcuni tipi, che si basa su .Net Core 2.1 . Il suo compito è ricevere e prelevare (chiedere) dati dai raccoglitori di dati (eseguibili, DLL, servizi), quelli possono essere in qualsiasi lingua, ma in questo caso restiamo fedeli al C ++.

Il programma di raccolta (API) deve essere indipendente dalla piattaforma, quindi NET Core (questo non cambierà), mentre i programmi di raccolta dati possono essere scritti in qualsiasi lingua, eseguiti nel modo che ritengono opportuno, dipendenti dalla piattaforma, ma non limitato a quanti di loro possono inviare dati al collezionista.

Questo è tutto locale sulla stessa macchina, probabilmente tra diversi account utente e diverse sessioni per motivi di sicurezza.

La mia idea di implementare questo è creare ASP.NET Core web API che verrebbe ospitata autonomamente tramite kestrel localmente. È leggero e non richiede un server adeguato poiché non affronterà mai il traffico esterno. Può funzionare su Windows, Linux e Mac. Il trasporto tra collector e data collector sarebbe basato su web / http, che è disponibile praticamente da qualsiasi lingua e qualcosa che la maggior parte degli sviluppatori sapeva come mantenere.

Ma è eccessivo? Solo per passare messaggi tra processi sulla stessa macchina, ci sono alternative? Io vengo primario dallo sfondo di sviluppo web, quindi questo è abbastanza nuovo per me.

In breve, ho bisogno di ricevere un Collector C, e chiedere dati da Data Collectors D . Questo può avvenire attraverso eventi, abbonamenti, passaggio di messaggi, D chiamando C con dati, C lo elabora. C chiama D per chiedere se ci sono dati. D chiama C con i dati (può essere attivata una nuova chiamata chiedendo dati). C è indipendente dalla piattaforma, D può essere dipendente dalla piattaforma, ma deve essere in grado di comunicare con C. Ci possono essere molti D, in C++, Java, C# , in esecuzione su Windows, Linux, Mac. Il Collector C è solo, sempre lo stesso, può solo ricevere e chiedere dati ed è indipendente dalla piattaforma.

Esistono strutture di messaggistica diverse da http che possono essere utilizzate per implementare questo?

    
posta Aistis Taraskevicius 31.05.2018 - 17:56
fonte

3 risposte

3

Considera l'utilizzo di una coda messaggi (ad esempio RabbitMQ ). Fornirà i seguenti vantaggi:

  1. Un robusto trasporto di messaggi. L'ordine di consegna è garantito se tutti i messaggi vengono eseguiti nella stessa coda. I messaggi vengono rimossi dalla coda solo dopo che sono stati completamente elaborati e riconosciuti dall'app consumer.
  2. Possibilità di separare i moduli su macchine diverse. Per esempio. un contenitore finestra mobile per modulo.
  3. Se un modulo si interrompe, i messaggi nella coda di input vengono mantenuti per un lungo periodo di tempo (fino a quando la coda non supera il limite dei messaggi in attesa). Dopo essere tornati di nuovo, il modulo consumerà tutta la cronologia dei messaggi che ha perso.
  4. Backpressure out of the box: se i messaggi arrivano a raffica, a volte più veloce di loro, la coda dei messaggi fornirà un buffer che non rallenterà il produttore e non causerà il sovraccarico del consumatore.
  5. Soluzione potenzialmente indipendente dal linguaggio e dalla piattaforma. Basta implementare la logica di consumare e produrre messaggi del tuo modulo per la piattaforma (e anche serializzazione e deserializzazione, come ha detto Sean Burton) - e sei a posto.

Il rovescio della medaglia è che avresti un'altra tecnologia nel tuo stack.

    
risposta data 31.05.2018 - 20:58
fonte
2

But is it an overkill?

No, non è necessariamente eccessivo. Se si desidera trasmettere dati tra processi in modo portatile, è assolutamente necessario dovrebbe utilizzare un metodo API e di serializzazione ben definito. Un'interfaccia web che utilizza la serializzazione JSON è sicuramente un modo per farlo. Esistono altre opzioni, come l'uso della serializzazione binaria (ad esempio, i buffer del protocollo) e la trasmissione tramite TCP. Quale di questi è meglio per te dipende dalle tue esigenze, ad esempio un protocollo binario è probabile che sia più veloce e più efficiente (meno byte trasferiti), quindi dovresti considerare che se hai bisogno di prestazioni molto elevate.

    
risposta data 31.05.2018 - 18:24
fonte
0

Potresti considerare l'utilizzo di SignalR per asp.net core. È progettato per la comunicazione in tempo reale tramite chiamate RPC. Non è solo per le applicazioni web.

Crea un hub che funga da host e coordinatore di chiamate e diversi client che raccolgono i dati. Può fare tutto ciò che hai menzionato nell'ultimo paragrafo.

    
risposta data 31.05.2018 - 22:17
fonte

Leggi altre domande sui tag