2015-04-20 12 views
6

Ho usato RabbitMQ senza Masstransit e ho inviato 10.000 messaggi/secondo e un milione di messaggi in 100 secondi.Masstransit usa RabbitMQ è una prestazione molto lenta?

Ma dopo aver usato Masstransit con RabbitMQ le prestazioni sono molto basse nella mia macchina.

Il disco rigido è molto attivo (utilizzo del 99%) quando il messaggio di pubblicazione/consumo e l'attività della CPU per questo processo sono quasi dello 0%.

Quando l'applicazione console/Subscriber run Editore con questo codice:

var bus = ServiceBusFactory.New(x => 
{ 
    x.UseRabbitMq(); 
    x.ReceiveFrom("rabbitmq://localhost/Example_Hello"); 
}); 
var message = new MyMessage() { Text = "hello", When = DateTime.Now }; 
for (int i = 0; i < 100; i++) 
{ 
    bus.Publish<MyMessage>(message, x => { }); 
} 

Pubblicato 100 messaggio in 6 secondi e non so il motivo per cui è molto lenta.


versione software di configurazione e della mia macchina è:

di Windows 8.1 a 64 bit

Intel Core i3 3.30GHz

memoria 8GB


Visual Studio 2013 C# .Net 4.5.1

Erlang 6.3

RabbitMQ 3.4.4

Masstransit 2.9.9

RabbitMQ.Client 3.4.0

+1

FYI, la capacità di non attendere un Ack con .NET 4.x è stata aggiunta in MT 2.10. –

+0

Grazie per la risposta, signor Chris Patterson. ora lo userò. –

+0

@MohammadRadmanFar: sei riuscito per caso qui? Ho appena pubblicato sul gruppo di discussione mt (https://groups.google.com/forum/#!topic/masstransit-discuss/XiqSDnJzd8U) perché non riesco a trovare una soluzione a questo problema. –

risposta

3

Questo perché sotto le coperte, MassTransit è in attesa di RabbitMQ al Ack il messaggio , assicurandosi che sia stato accettato con successo dal broker prima di tornare al chiamante. Senza questa attesa, se il broker non riesce a ricevere la scrittura, il messaggio potrebbe essere perso.

Con MassTransit v3 (attualmente in pre-release), il metodo Publish (e tutti Send metodi) sono ora async, restituendo un Task che può essere atteso (o no, se non vi interessa circa il risultato).

Potrei aggiungere un metodo PublishAsync per gli sviluppatori .NET 4.0 alla versione 2.9.9, infatti, questo è quello che potrei fare come soluzione temporanea per le applicazioni che utilizzano ancora la versione stabile corrente. Potrebbe anche essere utile aggiungere un'opzione NoWait allo SendContext, consentendo all'applicazione di disattivare il comportamento di attesa Ack.

Preferisco solo la durabilità rispetto alle prestazioni nel mio caso d'uso, onestamente.

+2

Dato che ho praticamente risposto a me stesso (e si è scoperto un semplice bug nelle fonti), potrei anche non assegnare la generosità a nessuno. Tuttavia, dato che la taglia è già stata creata, ho deciso di assegnartelo a Chris come segno di gratitudine per tutto il tuo impegno che hai fatto in MT. Continuate così, saluti :) –

3

Ho trovato un bug in MT2 < = 2.10.1 che impedisce di gestire correttamente il flag WaitForAck. Ho pubblicato una proposta di patch e spero che Chris rilasci 2.10.2 il prima possibile.

Le informazioni dettagliate sul problema è descritto qui:

https://groups.google.com/forum/#!topic/masstransit-discuss/XiqSDnJzd8U

In breve, il problema è causato dal bug nel costruttore SendContext copia, nonostante il contesto originale ha l'attesa per il set flag ACK a false, il contesto utilizzato nella chiamata ha il flag sempre impostato su true.

+0

Leggi il thread - strada da percorrere, amico! –

Problemi correlati