Utilizzare Message Queuing per scalare le applicazioni

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

Commenti

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.



Segnala su: Facebook MSDN Social Twitter Segnalo Wikio Diggita Technorati Stumbleupon Google Yahoo FriendFeed Delicious Furl

IL CONTENUTO
TUTORIALS
TOP TEN ARTICOLI
ARTICOLI VIA E-EMAIL

Iscriviti alla nostra newsletter nuoviarticoli per ricevere via e-mail le notifiche!

MEDIA
IN EVIDENZA
MISC