View Full Version : [C++] Event channel
sottovento
23-02-2011, 16:36
Carissimi
vorrei scrivere un applicativo che deve girare su sistemi Windows.
La versione attualmente in produzione e' strutturata come una serie di processi che girano su tre macchine.
I processi si sincronizzano tramite invio di "eventi" (i quali hanno la possibilita' di avere un numero fisso di parametri p1...p10, usati per specificare il tipo di evento, dove trovare i dati, ...).
Gli eventi viaggiano da un processo all'altro attraverso un "event channel" basato su CORBA, sviluppato da un'azienda esterna. Questo canale si e' rivelato estremamente inefficiente (i.e. un uso inaspettatamente alto di CPU, lentezza di invio,...), anche se il suo utilizzo in effetti e' comodo.
Per la nuova versione, vorrei tenere la stessa architettura... qualcuno conosce un'implementazione simile per quanto riguarda lo scambio di eventi/messaggi?
L'applicazione sarebbe in C++ sotto Visual Studio...
tomminno
23-02-2011, 22:11
La prima (e unica) alternativa che mi viene in mente è Ice (http://www.zeroc.com/iceVsCorba.html).
L'altra alternativa poteva essere l'utilizzo di webservice (es gSoap), ma sarebbe un'introduzione che si discosta un pò troppo dall'infrastruttura attuale.
Carissimi
vorrei scrivere un applicativo che deve girare su sistemi Windows.
La versione attualmente in produzione e' strutturata come una serie di processi che girano su tre macchine.
I processi si sincronizzano tramite invio di "eventi" (i quali hanno la possibilita' di avere un numero fisso di parametri p1...p10, usati per specificare il tipo di evento, dove trovare i dati, ...).
Gli eventi viaggiano da un processo all'altro attraverso un "event channel" basato su CORBA, sviluppato da un'azienda esterna. Questo canale si e' rivelato estremamente inefficiente (i.e. un uso inaspettatamente alto di CPU, lentezza di invio,...), anche se il suo utilizzo in effetti e' comodo.
Per la nuova versione, vorrei tenere la stessa architettura... qualcuno conosce un'implementazione simile per quanto riguarda lo scambio di eventi/messaggi?
L'applicazione sarebbe in C++ sotto Visual Studio...
La cosa piu' vicina a CORBA e' in effetti ICE. Poi tieni presente che puoi usare i vari meccanismi che fornisce Windows (http://msdn.microsoft.com/en-us/library/aa365574(v=vs.85).aspx). A seconda dell'esperienza pregressa di chi sviluppa potrebbe essere piu' semplice l'una o l'altra.
Tieni presente pero' che stai usando un meccanismo RPC per un una comunicazione message-based.... non so se sia la soluzione piu' adatta.
Se i messaggi da scambiare sono semplici o comunque in un numero finito, potresti anche limitarti a serializzarli e spedirli via socket; se qualcuno ha un po' di esperienza coi socket, forse meno di quel che ci mettete ad imparare ad usare una nuova libreria. Sicuramente e' la soluzione piu' efficiente.
sottovento
24-02-2011, 07:11
Grazie per le risposte. Non ho mai sentito parlare di Ice e comunque vale la pena di darci un'occhiata.
Ad ogni modo, gli "eventi" che volevo spedire erano piuttosto semplici, anche se in numero discreto. La soluzione via socket e' praticabile ma ho paura che alcuni componenti del gruppo che deve sviluppare abbiano un'idea piuttosto "leggera" della programmazione (non considerano codici di ritorno, eccezioni, casi particolari,...) quindi mi serve una soluzione robusta....
Grazie ancora
PS qualcuno sa dove posso trovare qualche informazione su ice? Googlare "ice" mi sembra poco pratico...
banryu79
24-02-2011, 08:43
Ice è l'acronimo per "Internet Communications Engine" ;)
sottovento
24-02-2011, 09:53
Ice è l'acronimo per "Internet Communications Engine" ;)
Ho dato un'occhiata, velocemente. E' un middleware RPC sulla falsariga di CORBA. A dire il vero, mi serviva qualcosa di semplice semplice, easy easy, terra terra :D, qualcosa del tipo:
Processo 1:
Event event;
event.destination = IdProcesso2;
event.Id = ID_START_CALCULATION;
event.ProductId=1234123;
SendEvent(&event);
Processo 2 riceve l'evento, indipendentemente dalla macchina su cui e' localizzato, lo decodifica (basandosi sull'Id e sui parametri) e fa quanto richiesto.
Non vorrei portarmi dietro altre complicazioni, i prodotti elencati sono belli ma troppo grossi. Mi serve solo questo.
Fra l'altro potrei realizzarlo in poco tempo tramite delle socket. Pero', prima di farlo, vorrei capire se qualcuno ha gia' fatto niente del genere.....
banryu79
24-02-2011, 10:54
La sparo, perchè non sono certo un esperto: ma una cosa basata su JSON-RPC non potrebbe fare al caso di sottovento?
Fra l'altro potrei realizzarlo in poco tempo tramite delle socket. Pero', prima di farlo, vorrei capire se qualcuno ha gia' fatto niente del genere.....
Noi abbiamo adottato una soluzione basata sui socket proprio perche' avevamo bisogno di buone performance con consumo minimo di risorse (generiamo un traffico di attorno ai 10MB/sec continuo e non abbiamo tanti cicli cpu a disposizione).
Se qualcuno del gruppo mal digerisce i socket si puo' wrappare tutto attorno ad una classe di comodo che fornisca quei tre-quattro metodo che servono (inizializzazione, spedizione, ricezione, controllo messaggi in attesa), e magari trasformi i codici i errore in eccezione.
sottovento
25-02-2011, 09:23
Noi abbiamo adottato una soluzione basata sui socket proprio perche' avevamo bisogno di buone performance con consumo minimo di risorse (generiamo un traffico di attorno ai 10MB/sec continuo e non abbiamo tanti cicli cpu a disposizione).
Se qualcuno del gruppo mal digerisce i socket si puo' wrappare tutto attorno ad una classe di comodo che fornisca quei tre-quattro metodo che servono (inizializzazione, spedizione, ricezione, controllo messaggi in attesa), e magari trasformi i codici i errore in eccezione.
Effettivamente questa e' la soluzione. Almeno secondo il mio punto di vista.
Penso che dovro' rassegnarmi a wrappare... ho trovato in internet qualcosa ma e' sempre troppo grande e troppo complicato.
Grazie a tutti. Ad ogni modo, se qualcuno sa di una libreria che abbia gia' implementato questo in maniera robusta, lo segnali :D
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.