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?
-
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
-
Utilizzare il polling semplice o lungo Downside:
- questo produrrà un bel po 'di traffico di rete
-
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