2013-09-16 42 views
6

Tôi đang đối mặt với một vấn đề cực kỳ khó hiểu. Tôi có một dịch vụ Windows theo dõi hai hàng đợi MSMQ cho đầu vào và gửi tin nhắn đến một hàng đợi MSMQ khác. Mặc dù hoạt động gửi có vẻ như ngay lập tức từ quan điểm của dịch vụ nhưng nó thực sự nhận được thông điệp chính xác ba (3) phút đến (như được hiển thị trong cửa sổ thuộc tính trong MSMQ MMC). Tôi đã thử nghiệm vấn đề này mà không có gì khác lắng nghe ở phía bên kia để tôi có thể thấy các tin nhắn chồng chất lên. Đây là cách dịch vụ gửi tin nhắn:Tin nhắn MSMQ luôn bị trễ 3 phút trên cùng một máy

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(); 
} 

Dịch vụ đang chạy trên Windows Server 2008 R2. Tôi cũng đã thử nghiệm nó trên R1 và nhận thấy hành vi tương tự. Một lần nữa, mọi thứ xảy ra trên cùng một máy. Tất cả các thành phần được triển khai ở đó vì vậy tôi không nghĩ rằng nó có thể là một vấn đề mạng.

EDIT # 1:

Tôi bật chẩn đoán WCF và những gì tôi nhận thấy là rất lạ. Các datagram MSMQ không được viết bình thường. Tuy nhiên, sau khi "tin nhắn đã được đóng lại" tin nhắn theo dõi không có gì xảy ra. Nó giống như là dịch vụ đang chờ đợi một cái gì đó xảy ra. Chính xác 3 phút sau đó và chính xác khi thông báo MSMQ đến (theo MSMQ MMC), tôi thấy một thông báo theo dõi khác về hoạt động trước đó. Tôi nghi ngờ có một số loại nhiễu.

Để tôi cung cấp cho bạn thêm chi tiết về cách hoạt động của các dịch vụ. Có một ứng dụng IIS nhận nhiệm vụ từ khách hàng và thả chúng vào hàng đợi MSMQ. Từ đó, dịch vụ phiền hà (MainService) chọn chúng và bắt đầu xử lý chúng. Trong một số trường hợp, một dịch vụ khác (AuxService) là bắt buộc để hoàn thành nhiệm vụ để MainService gửi một thông điệp (luôn bị trì hoãn) đến AuxService. AuxService có hàng đợi hộp thư đến riêng của nó, nơi nó nhận được các tin nhắn MSMQ và khi nó được thực hiện, nó sẽ gửi một thông báo MSMQ đến MainService. Trong khi đó, luồng gửi tin nhắn đến AuxService đợi cho đến khi nó nhận được tín hiệu hoặc cho đến khi nó hết thời gian chờ. Có một hàng đợi đặc biệt, nơi MainService tìm kiếm các thông điệp từ AuxServices. Khi nhận được một tin nhắn, chủ đề trên được đánh thức và tiếp tục hoạt động của nó.

Dưới đây là một đại diện của toàn bộ kiến ​​trúc:

  • ứng dụng IIS -> Q1 -> MainService
  • MainService -> Q2 -> AuxService
  • AuxService -> Q3 -> MainService

Mặc dù tất cả các hoạt động được đánh dấu bằng OneWay, tôi tự hỏi liệu bắt đầu một hoạt động MSMQ từ bên trong một hoạt động MSMQ khác là bất hợp pháp nào đó. Nó có vẻ là trường hợp được đưa ra bằng chứng thực nghiệm. Nếu vậy, có cách nào để thay đổi hành vi này không?

EDIT # 2:

Được rồi, sau khi tìm hiểu thêm, có vẻ như WCF là thủ phạm. Tôi đã chuyển cả mã máy khách trong MainService và mã máy chủ trong AuxService để sử dụng MSMQ SDK trực tiếp và nó hoạt động như mong đợi. Thời gian chờ 3 phút tôi đã trải qua thực sự là thời gian sau đó MainService đã từ bỏ và coi rằng AuxService không thành công. Do đó, có vẻ như vì một số lý do WCF từ chối thực hiện gửi cho đến khi hoạt động WCF hiện tại thoát.

Đây có phải là do thiết kế hay là lỗi? Hành vi này có thể được kiểm soát không?

+0

Bạn có sử dụng xác thực không? Đôi khi những sự chậm trễ này liên quan đến các vấn đề về mạng/cơ sở hạ tầng liên quan đến xác thực. – Groo

+0

Tôi không sử dụng bất kỳ xác thực nào. Hơn nữa, 'Mọi người' có toàn quyền truy cập vào hàng đợi. –

+0

Thao tác gửi đến hàng đợi cục bộ ngay lập tức vì không yêu cầu hàng đợi gửi đi. Nếu bạn đã sử dụng Trình theo dõi hiệu suất để theo dõi MSMQ, tôi hy vọng bạn sẽ thấy thông báo được gửi khi nó được gửi. Nếu không, thì có thể là sự chậm trễ chờ giao dịch thực hiện. Kiểm tra Easy7 sẽ gửi đến hàng đợi không giao dịch và xem có xảy ra sự chậm trễ tương tự hay không. –

Trả lời

1

Bạn có thiết lập giao dịch trên mã hàng đợi, bạn có thiết lập đối tượng msmq cho giao dịch không? 3 phút âm thanh như thời gian chờ cho một điều phối viên giao dịch phân phối giao dịch.

Các vấn đề liên quan