2013-12-18 15 views
7

Wąskie gardło mojej aplikacji stało się wysyłaniem i odbieraniem wiadomości przez MSMQ z MassTransit. Wysyłanie i odbieranie odbywa się w ramach tej samej aplikacji, ale często jest za dużo wiadomości, aby użyć kolejki w pamięci.Jak możemy przyspieszyć otrzymywanie wiadomości z MSMQ?

Oto mój prosty setup kolejka:

messageBus = ServiceBusFactory.New(sbc => 
       { 
        sbc.UseMsmq(); 
        sbc.VerifyMsmqConfiguration(); 
        sbc.UseMulticastSubscriptionClient(); 
        sbc.ReceiveFrom("msmq://localhost/msg_queue"); 
        sbc.Subscribe(subs => 
        { 
         subs.Handler<EventMessage>(msg => Enqueue(msg)); 
        }); 
       }); 

Dla moich doświadczeniach MSMQ obecnie ~ 1 milion wiadomości i nie naciskają żadnych nowych wiadomości do niego. Nie wykonujemy żadnej pracy w Enqueue() z wyjątkiem czasu, w jakim wysyłane są wiadomości.

Dzięki tym informacjom możemy pobrać tylko od 150 do 200 wiadomości na sekundę z MSMQ, kiedy miałem nadzieję, że będzie to co najmniej 1000 wiadomości na sekundę, gdy nie ma opóźnień w sieci. Każda wiadomość to < 2kb.

Jak możemy przyspieszyć, jak szybko MSMQ przekazuje wiadomości do aplikacji przez MassTransit, zachowując kolejność wiadomości wymuszoną przez kolejkę?

+0

Być może już to przeszedłeś, ale zapoznaj się z [patrz tutaj] (http://support.microsoft.com/kb/199428). Używamy Websphere MQ i prawdopodobnie dostajemy informacje o tym, co robisz teraz dzięki MSMQ. –

+0

Na czym opiera się twoje 1000 wiadomości/druga nadzieja? –

+0

Jeśli masz obecnie zaległości * nieprzetworzonych wiadomości *, nie oczekuj cudów, magazyn danych jest dla nich znaczny. MSMQ nie ma problemu z obsługą tysięcy wiadomości na sekundę. To poszło nie tak dawno temu, najlepiej oczyścić kolejkę, aby powrócić do rozsądnego punktu wyjścia. –

Odpowiedz

1

Zrobiłem już coś podobnego wcześniej. Jeśli dobrze to pamiętam, Określono datę wygaśnięcia wiadomości przez TimeToBeReceived (Łączny czas wysłania wiadomości z kolejki docelowej. Wartość domyślna to InfiniteTimeout.). Patrz: msdn link.

+0

Czy to nie są tylko wygasające wiadomości, jeśli przetwarzanie nie jest wystarczająco szybkie? Jeśli możesz przetworzyć tylko 200 wiadomości na sekundę, nie sądzę, aby usunięcie 800 wiadomości było kwalifikowanych jako przetwarzanie 1000 na sekundę. Czy brakuje mi czegoś w tej konfiguracji? – Chris

+0

@Chris, jestem z tobą. Jednak w moim systemie (rozłączonym systemie) ignorujemy komunikaty lub wywoływane zwroty w oparciu o dwie strategie. (a) TimeToBeReceived (b) niestandardowy znacznik czasu wraz z wiadomością. Korzystając z tych czynników, mogliśmy przetworzyć najnowszą wiadomość z mniejszymi zaległościami w kolejce. Pamiętaj, że przetwarzanie 500-1000 wiadomości na sekundę jest możliwe, o ile masz lepszy mechanizm czyszczenia zaległości. – Nair

Powiązane problemy