2012-01-05 10 views
6

Pracowałem nad sprawdzeniem koncepcji przy użyciu WCF i MSMQ. Gram z ustawieniami przepustnicy, używając wartości domyślnych This Article, a także dodając własne ustawienia do pliku konfiguracyjnego. Mam 2 procesory Quad Core Xeon z tą aplikacją. Bez względu na ustawienia, które stosuję, zawsze pojawia się tylko 8 wiadomości na raz (co pasuje do moich rdzeni przetwarzających). Chcę, aby każdy z komunikatów był obsługiwany w ramach jednej transakcji, tak aby mogło być częścią problemu ... nie jestem pewien. Założę się, że poradziłoby sobie o wiele więcej komunikatów jednocześnie, niż jest.Ustawienia przepustnicy WCF

usługi Zachowanie:

[ServiceBehavior(UseSynchronizationContext = true, 
        ReleaseServiceInstanceOnTransactionComplete=true, 
        ConcurrencyMode = ConcurrencyMode.Single, 
        InstanceContextMode = InstanceContextMode.PerCall)] 

Endpoint Zachowanie:

<endpointBehaviors> 
    <behavior name="endpointBehavior"> 
     <transactedBatching maxBatchSize="1" /> 
    </behavior> 
    </endpointBehaviors> 

Moja własna Throttling Usługa:

<serviceThrottling maxConcurrentCalls="128" maxConcurrentSessions="800" /> 

Am I widokiem na coś? Może po prostu nie w pełni rozumiem domyślne/niestandardowe ustawienia przepustnicy (prawdopodobne).

EDIT

Mam zmodyfikowano ConcurrencyMode (zmiana do wielu) wraz z ustawieniem ReleaseServiceInstanceOnTransactionComplete. Zmiana na wiele nie wydawała się niczego zmieniać?

EDIT Czy to może być ustawienie TransactionBatch? Mam ten zestaw do jednego ...?

Dzięki,

S

+0

Czy to nie jest jednowątkowe? –

+0

Hi @JohnBreakwell Zmieniłem tryb współbieżności na Wiele i wydawało się, że realizuję te same wyniki? – scarpacci

Odpowiedz

4

znalazłem bloga, który wskazał mi do jakiejś dobrej dokumentacji na WCF dławienia/wydajność. Dodałem trochę więcej meta do mojej aplikacji przetwarzania i byłem w stanie uzyskać wydajność, której szukałem. Dodając więcej informacji do mojego procesu (ManagedThreadID, etc) mogłem zobaczyć, że otrzymałem znacznie większą przepustowość niż początkowo zakładałem. Też znalazłem kilka wskazówek na blogu poniżej, aby być pomocnym.

Blog

Dzięki,

S

0

Ponieważ używasz PerCall Instancing należy zwiększyć MaxConcurrentInstances. Nawet w .Net 4 wartość domyślna to 26. W 4,5 "Wartość domyślna to suma domyślnej wartości MaxConcurrentSessions i domyślnej wartości MaxConcurrentCalls .."

BTW ... WCF wywoła instancję na wielu wątkach chyba że używasz InstanceContextMode.PerCall. InstanceContextMode.PerCall + Any ConcurrencyMode = N współbieżnych wywołań metody w N instancjach usług, gdzie N jest określona przez przepustnicę usługi Reference

+0

Myślę, że to, co powiedziałeś o PerCall/Single thread jest niepoprawne. Wszystkie instancje serwisowe zostaną utworzone na tym samym wątku i w ten sposób wykonają synchronicznie. Możesz zobaczyć na [zrzut ekranu tutaj] (http://www.codeproject.com/KB/WCF/WCFConcurrency.aspx#Instance mode = per Call i Concurrency = Multiple).Ten wpis na blogu jest bardzo przydatny i warty przeczytania. –

+0

hmmmmmm Byłem właśnie regurgitating oświadczeń z tego odniesienia na końcu mojego komentarza. – felickz