WCF: invia eventi tra servizi

0

Recentemente ho lavorato in un progetto più ampio in cui ho toccato per la prima volta l'argomento dei sistemi distribuiti nel mondo c #.
l'ho trovato wcf è fantastico per le chiamate di procedura remote, ma come si aggiunge la comunicazione di eventi tra servizi utilizzando solo wcf?

Ecco i requisiti del progetto:

  • Abbiamo avuto ~ 15 diversi servizi per diversi aspetti dell'intero sistema
  • ogni servizio ha funzionato nel suo stesso processo
  • I client WPF potrebbero utilizzare RPC sui servizi e potrebbero iscriversi agli eventi di servizio
  • i servizi necessari per eseguire RPC gli uni sugli altri e anche essere abbonati agli eventi di altri servizi
  • I servizi
  • erano ospitati sulla stessa macchina e su macchine diverse all'interno della rete locale
  • La comunicazione
  • era via TCP
  • Erano tutti servizi a lungo termine (tempo di attività pianificato ~ 2 anni)
  • Il sistema gestisce i flussi di lavoro aziendali a lungo termine
  • l'evento è stato realizzato tramite un editore e un sottoscrittore
  • Gli eventi
  • non devono essere persi
  • durante le ore di punta molti eventi devono essere gestiti tra tutti i servizi

Ora la parte malvagia: per la comunicazione di eventi, è stato utilizzato un servizio di abbonamento-pubblicazione centrale. Per ogni abbonato aveva (più) canali di callback e li teneva aperti per sempre (tramite un keep-alive-ping). Bene, ho letto: mantenere i canali WCF aperti per sempre è una specie di antipattern WCF. Abbiamo anche avuto molti problemi con quella soluzione.

Esiste un'alternativa migliore di una di queste?

  1. Utilizzare un sistema di accodamento messaggi (come MSMQ, RabbitMQ, ZeroMQ ...)
    Aspetti negativi:

    • Non puoi usare solo WCF
    • devi implementare un sistema di accodamento aggiuntivo (mentre ZeroMQ sarebbe solo una dll!)
    • sarà necessario un codice più avvolgente per gestire le code
    • per quanto ho visto normalmente è necessario eseguire il polling delle code
  2. Utilizzare il polling semplice o lungo Downside:

    • questo produrrà un bel po 'di traffico di rete
  3. Usa modello osservatore (implementa RegisterListener / HandleEvent RPC con WCF)
    Svantaggi:

    • Gli eventi possono essere consumati solo dai servizi WCF, non dai client WPF
    • È necessario un ulteriore codice wrapping
posta Haphi 01.09.2017 - 23:01
fonte

1 risposta

0

I requisiti suggeriscono "l'accodamento dei messaggi". Essenzialmente, la necessità di non perdere mai eventi richiede persistenza. Questo, insieme alla necessità di tenere traccia di quali eventi sono stati elaborati (per "consumarli"), viene elegantemente risolto utilizzando un sistema di accodamento dei messaggi, e molti di essi potrebbero anche fornire le funzionalità di pubblicazione / sottoscrizione immediatamente.

WCF supporta l'accodamento di messaggi trasparenti tramite associazioni speciali. WCF viene fornito con un binding per MSMQ. Esistono binding di terze parti per altri sistemi di messaggistica, come un binding RabbitMQ. Questi collegamenti ti consentono di mantenere il semplice modello di programmazione WCF ed evitare il polling.

In ogni caso, anche se si rilascia WCF, non è necessario eseguire il polling delle code: la maggior parte dei sistemi di code supporta le API basate su push. In .NET si manifesta come API basata su eventi (un evento OnMessage) o IEnumerable che è possibile utilizzare in un ciclo foreach .

    
risposta data 01.09.2017 - 23:35
fonte