2013-09-16 8 views
6

Mam do czynienia z niezwykle zagadkowym problemem. Mam usługę Windows, która monitoruje dwie kolejki MSMQ w celu wprowadzenia i wysyła komunikaty do kolejnej kolejki MSMQ. Mimo że operacja wysyłania wydaje się natychmiastowa z punktu widzenia usługi, w rzeczywistości wiadomość jest wysyłana dokładnie trzy (3) minuty (jak pokazano w oknie właściwości w MMC MSMQ). Testowałem ten problem, nic innego nie słuchałem po drugiej stronie, więc widzę, jak wiadomości się napełniają. W ten sposób usługa wysyła wiadomości:Wiadomości MSMQ zawsze przybywają z opóźnieniem dokładnie o 3 minuty na tej samej maszynie.

var proxyFactory = new ChannelFactory<IOtherServerInterface>(new NetMsmqBinding(NetMsmqSecurityMode.None) 
{ 
    Durable = true, 
    TimeToLive = new TimeSpan(1, 0, 0), 
    ReceiveTimeout = TimeSpan.MaxValue 
}); 

IOtherServerInterface server = this.proxyFactory.CreateChannel(new EndpointAddress("net.msmq://localhost/private/myqueue")); 

var task = new MyTask() { ... }; 
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required)) 
{ 
    server.QueueFile(task); 
    scope.Complete(); 
} 

Usługa działa w systemie Windows Server 2008 R2. Testowałem go także na R1 i zauważyłem to samo zachowanie. Znowu wszystko dzieje się na tej samej maszynie. Wszystkie komponenty są tam rozmieszczone, więc nie sądzę, że może to być problem z siecią.

EDIT # 1:

Włączyłem diagnostyce WCF i co zauważyłem jest bardzo dziwne. Datagram MSMQ jest zapisywany normalnie. Jednak po komunikacie śledzenia "wiadomość została zamknięta" nic się nie dzieje. To tak, jakby usługa czekała, aż coś się wydarzy. Dokładnie 3 minuty później i dokładnie, gdy nadejdzie wiadomość MSMQ (zgodnie z MMC MSMQ), widzę inną wiadomość śledzenia o poprzednim działaniu. Podejrzewam, że jest jakaś ingerencja.

Pozwolę sobie podać więcej szczegółów na temat działania usług. Istnieje aplikacja IIS, która odbiera zadania od klientów i umieszcza je w kolejce MSMQ. Stamtąd uciążliwa usługa (MainService) odbiera je i rozpoczyna ich przetwarzanie. W niektórych przypadkach do wykonania zadania wymagana jest inna usługa (AuxService), aby usługa MainService wysłała komunikat (który zawsze się opóźnia) do AuxService. AuxService ma swoją własną kolejkę skrzynki odbiorczej, w której odbiera wiadomości MSMQ, a kiedy to zrobi, wysyła wiadomość MSMQ do usługi MainService. W międzyczasie wątek, który wysłał wiadomość do AuxService, czeka, dopóki nie otrzyma sygnału lub do czasu, gdy upłynie limit czasu. Istnieje specjalna kolejka, w której usługa MainService wyszukuje wiadomości od AuxServices. Po otrzymaniu wiadomości powyższy wątek jest budzony i wznawia swoją aktywność.

Oto reprezentacja całej architekturze:

  • aplikacji IIS -> Q1 -> MainService
  • MainService -> Q2 -> AuxService
  • AuxService -> Q3 -> MainService

Chociaż wszystkie operacje są oznaczone jako OneWay, zastanawiam się, czy uruchomienie operacji MSMQ z poziomu innej operacji MSMQ jest w jakiś sposób nielegalne. Wydaje się, że tak jest, biorąc pod uwagę dowody empiryczne. Jeśli tak, czy istnieje możliwość zmiany tego zachowania?

EDIT # 2:

porządku, po jakimś bardziej kopanie wydaje WCF jest winowajcą. Zmieniłem zarówno kod klienta w MainService, jak i kod serwera w AuxService, aby używać pakietu SDK MSMQ bezpośrednio i działało zgodnie z oczekiwaniami. 3-minutowy czas oczekiwania był w rzeczywistości czasem po którym MainService zrezygnował i uznał, że AuxService nie działa. Dlatego wydaje się, że z jakiegoś powodu WCF odmawia wykonania wysyłania, dopóki nie zakończy się bieżące działanie WCF.

Czy jest to zgodne z projektem, czy jest to błąd? Czy to zachowanie może być kontrolowane?

+0

Czy używasz uwierzytelniania? Czasami te opóźnienia są związane z problemami sieci/infrastruktury związanymi z uwierzytelnianiem. – Groo

+0

Nie używam żadnego uwierzytelnienia. Co więcej, "Wszyscy" mają pełny dostęp do kolejki. –

+0

Operacja wysyłania do lokalnej kolejki jest natychmiastowa, ponieważ nie jest wymagana kolejka wychodząca. Jeśli używałeś Monitora wydajności do śledzenia MSMQ, oczekiwałbym, że zobaczysz komunikat dostarczany, gdy zostanie wysłany. Jeśli nie, może to być opóźnienie oczekiwania na zatwierdzenie transakcji. Test Easy7 byłby wysłany do kolejki nietransakcyjnej i sprawdzić, czy występuje takie samo opóźnienie. –

Odpowiedz

1

Masz ustawienia transakcji na kodzie kolejki, czy masz konfigurację obiektu msmq dla transakcji? 3 minuty brzmią jak okres oczekiwania na dołączenie do programu Distributed Transaction Coordinator.

Powiązane problemy