Utilizzare Message Queuing per scalare le applicazioni
di Ugo Lattanzi, in .NET Framework, 12 dicembre 2008
4 pagine in totale: <<Indietro 1 2 3 [4]
Dequeue
Come andremo a vedere, la parte di Dequeue degli oggetti dalla coda di Message Queue è altrettanto semplice dell'inserimento e lo è ancor di più se ci si avvale di Windows Comunication Foundation che offre un binding già pronto per Message Queue.
Se si decide di optare per l'utilizzo di Windows Communication Foundation, ci basta creare un'interfaccia come quella mostrata di seguito:
[ServiceKnownType(typeof (string))] [ServiceContract(Namespace = "http://services.winfxitalia.it/internals/test", Name = "Logger")] public interface IService1 { [OperationContract(IsOneWay = true, Action = "*")] void GetMessage(MsmqMessage<string> msg); }
Come si può notare l'unica differenza da un servizio classico sta nell'attributo ServiceKnowType che serve a specificare al servizio il tipo di oggetto contenuto nella coda, nel nostro esempio una stringa.
La coda dove prelevare i dati e il vari parametri vengono impostati tutti da file di configurazione del servizio come si può vedere dal blocco seguente blocco di configurazione:
<system.serviceModel> <services> <service name="WinFXItalia.Articolo.WCFplusMSMQ.Dequeue.Service1"> <endpoint address="msmq.formatname:DIRECT=OS:.\private$\SampleServiceQueue" binding="msmqIntegrationBinding" bindingConfiguration="MessageQueueBinding" contract="WinFXItalia.Articolo.WCFplusMSMQ.Dequeue.IService1"> </endpoint> </service> </services> <bindings> <msmqIntegrationBinding> <binding name="MessageQueueBinding" exactlyOnce="false" durable="true" maxRetryCycles="5" receiveErrorHandling="Drop" serializationFormat="Binary" useMsmqTracing="true"> <security mode="None"/> </binding> </msmqIntegrationBinding> </bindings> </system.serviceModel>
Sono molto importati i parametri exactlyOne, maxRetryCycles e receiveErrorhandling, che vanno ad influire sul comportamento del servizio e più nello specifico stanno ad indicare:
- exactlyOnce: va impostato su true nel momento in cui la coda è di tipo transazionale;
- maxRetryCycles: indica il numero di tentativi che il servizio deve effettuare prima di dichiarare il messaggio in coda come "poison message";
- receiveErrorHandling: indica cosa deve fare il servizio nel momento in cui è stato raggiunto il numero massimo di tentativi (specificati dal parametro maxRetryCycles) nel recuperare l'oggetto dalla coda.
Un'alternativa all'utilizzo di Windows Comunication Foundation per recuperare gli oggetti dalla coda è utilizzare la classe MessageQueue e nello specifico il metodo Receive come mostrato di seguito:
MessageQueue queue = new MessageQueue(@"FormatName:DIRECT=OS:.\private$\SampleServiceQueue", QueueAccessMode.Receive); Message queueObject = queue.Receive();
In alternativa la coppia [Begin|End]Receive e l'evento ReceiveCompleted permettono di ricevere in asincrono il messaggio non appena viene inserito in coda.
Conclusioni
Come abbiamo potuto vedere gli scenari in cui Message Queue ci viene in aiuto sono svariati e i benefici che può portare alla nostra applicazione sul concetto di performance e scalabilità sono altrettanto importanti.
Un'alternativa all'utilizzo di Microsoft Message Queue possono essere i Service Broker di SQL Server.
Un vantaggio dei Service Broker di SQL Server consiste nel fatto che tutta la messagistica viene persistita nel database, con il risvolto di evitare transazioni distribuite ed ovvi vantaggi in fatto di performance.
Purtroppo i Service Broker al momento hanno un costo di implementazione maggiore rispetto a MSMQ (che beneficia del binding di WCF) e anche un costo di licenza, mentre MSMQ è incluso nel sistema operativo, poiché i Service Broker richiedono una licenza di SQL Server.
4 pagine in totale: <<Indietro 1 2 3 [4]
Attenzione: Questo articolo contiene un allegato
Contenuti dell'articolo
- Pagina 1
- Pagina 2
- Pagina 3
- Pagina 4
Sullo stesso argomento
-
Mostrare le camere di sorveglianza tramite il .NET Micro Framework
-
La piattaforma Microsoft per il cloud computing: Windows Azure
-
Interoperabilità con WCF: invocare servizi da PHP e Flash
-
Le novità di Windows 7 per gli sviluppatori
-
Le problematiche più comuni di un'architettura M-V-VM con WPF
-
Costruire una chat per Silverlight con il PollingDuplexHttpBinding
-
Introduzione a .NET RIA Services
-
Architettura Model-View-ViewModel in un'applicazione WPF
-
Condizioni e regole in Windows Workflow Foundation

















Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.