2012-07-03 43 views
13

Tôi có dịch vụ WCF tự lưu trữ trong giao diện điều khiển với ràng buộc netNamedPipeBinding. Dịch vụ này có chỉ là một phương pháp có sản phẩm nào Send(DataTable bulk)Tại sao MSMQ nhanh hơn WCF QueueService?

[ServiceContract] 
public interface IWcfQueueService 
{ 
    [OperationContract] 
    void Send(DataTable bulk);  
} 
public class WcfQueueService : IWcfQueueService 
{ 
    public void Send(DataTable bulk) 
    {   
     // Here would be something like _bulks.Add(bulk); 
     // BUT, for now it is empty method and still it's slower than MSMQ 
    }  
} 

Khách hàng của tôi được 200K đầu vào từ DB và xử lý nó với BoundedThreadPool của chúng tôi (chỉ tạo ra, chúng ta hãy nói rằng, 20 bài). Mỗi đầu vào được xử lý với chuỗi khác nhau. Mỗi chuỗi thực hiện MyMethod và vào cuối MyMethod kết quả được thêm vào bulkManager.

public void MyMethod(string input) 
{    
    var res = ProcessInput(input); 
    bulkManager.Add(res); 
} 

Khi bulkManager tích lũy N mục (= số lượng lớn) nó vượt qua số lượng lớn cho một thread mà tất cả nó là enqueue rằng số lượng lớn với một trong hai phương pháp:

  1. Nếu WCF được kích hoạt: wcfQueueService.Send(bulk);
  2. khác nếu MSMQ được bật: new MessageQueue(@".\private$\q").Send(new Message {Body = bulk});

Cả hai phương pháp đều hoạt động, nhưng MSMQ hoạt động nhanh hơn nhiều. Với MSMQ client quản lý để xử lý khoảng 80K bulks trong 20seconds trong khi với wcf chỉ 20K-30K bulks. Tôi không hiểu tại sao nó xảy ra. WCF của tôi chạy trong quá trình khác nhau như MSMQ. Ngoài ra, WCF của tôi không lưu trữ bất cứ điều gì, nó có phương pháp trống rỗng. Vậy tại sao MSMQ thắng WCF?

Cập nhật

Như leppie đề nghị tôi thử .NetRemoting. NetRemoting thực sự đã cải thiện tốc độ. Khách hàng đã xử lý 60K. Nhưng,

  1. Nó vẫn chậm hơn so với MSMQ
  2. Khi tôi đọc Net Remoting bị phản đối bởi WCF và WCF nên nhanh hơn Net Remoting theo this, vậy tại sao tôi nhận được rằng WCF của tôi là chậm? Có lẽ ràng buộc của tôi là sai?
+0

Có thể bạn sẽ tìm thấy điều khiển từ xa nhanh hơn rất nhiều so với MSMQ (được đặt tên theo đường ống, tôi giả định IPC trên máy cục bộ). – leppie

+0

@leppie,. Net Remoting thực sự đã cải thiện tốc độ. Khách hàng đã xử lý 60K. Nhưng, 1 - nó vẫn còn chậm hơn so với MSMQ và 2 - như tôi đọc. Net Remoting được deprecated bởi WCF và WCF nên được nhanh hơn. Net Remoting theo http://msdn.microsoft.com/en-us/library/bb310550 .aspx # wcfperform_topic3d, vậy tại sao tôi nhận được wcf của tôi chậm hơn? – theateist

+0

@theateist: Bạn có thể thay đổi 'InstanceContextMode' trên dịch vụ thành' Single' và 'ConcurrencyMode' thành' Multiple' không? Sau đó thực hiện một thử nghiệm khác. Cũng cố gắng điều chỉnh cài đặt điều chỉnh (trong hành vi dịch vụ). –

Trả lời

4

Bạn không so sánh như thế.

Sự khác biệt rõ ràng nhất là trong trường hợp WCF, thời gian của bạn bao gồm thực hiện toàn bộ ngăn kênh bên dịch vụ và yêu cầu hoạt động, trong khi trường hợp MSMQ trực tiếp của bạn chỉ đo thời gian để nạp tải trọng ở phía máy khách. Ghi nhớ rằng việc xử lý phía dịch vụ trong WCF bao gồm deserialization đối tượng DataTable của bạn, mà có lẽ khá đắt nếu hệ số bulking N của bạn lớn. Hơn nữa, tùy thuộc vào cách bạn đã cấu hình các nút điều chỉnh và chỉnh lưu dịch vụ, các yêu cầu từ máy khách có thể được thực hiện nhanh hơn dịch vụ được cấu hình để xử lý, dẫn đến các yêu cầu được xếp hàng đợi để thực thi phía dịch vụ.

Ngoài ra, tùy thuộc vào cách bạn đã định cấu hình ràng buộc của mình, có thể có sự khác biệt đáng kể, bảo mật chẳng hạn. Nhân tiện, bạn có thực sự sử dụng NetNamedPipeBinding (như trạng thái câu hỏi của bạn) thay vì NetMsmqBinding như tiêu đề dường như ngụ ý? Nếu vậy, bằng cách sử dụng cấu hình ràng buộc mặc định, bạn sẽ có mã hóa totally unnecessary và ký từng thông báo Hàng loạt đang diễn ra, điều này không xảy ra trong trường hợp MSMQ trực tiếp của bạn. Các hoạt động mã hóa trên các tin nhắn lớn cũng sẽ tương đối đắt tiền.

So sánh tốt hơn với hoạt động WCF được định nghĩa là OneWay.

+0

rằng liên kết 'hoàn toàn không cần thiết' đã chết, bất kỳ cơ hội nào bạn có một bản sao của mục nhập? thực sự quan tâm để đọc điều đó, cảm ơn – zaitsman

0

Tôi nghĩ sự khác biệt là những gì xảy ra trong hoạt động WCF của bạn so với những gì MSMQ thực hiện khi nó chấp nhận yêu cầu.

Tôi hy vọng rằng phương thức được thực hiện khi bạn enqueue một tin nhắn với MSMQ đơn giản chấp nhận tin nhắn và không có gì khác. Một số công nhân back-end thực hiện việc nâng hạng nặng.

Trong hoạt động của bạn, bạn cần phải chuyển yêu cầu đến một trường hợp đơn lẻ của trình xử lý yêu cầu. Yêu cầu trình xử lý cần được khởi tạo khi dịch vụ được "tách".

Bạn cũng có thể tìm thấy hiệu suất được cải thiện bằng cách sử dụng Thư viện song song nhiệm vụ trong .NET 4 để song song các yêu cầu của bạn.

1

Bạn có thể cung cấp mã ví dụ thể hiện hành vi bạn đang thấy không?

Tôi đã thử nghiệm riêng của mình bằng cách tạo 20.000 tin nhắn để gửi. Tôi đã thử cả hai, 20.000 với MSMQ trực tiếp, và 20.000 với WCF trừu tượng điểm cuối MSMQ cho tôi. Số 20.000 với MSMQ trực tiếp sử dụng 64,75% thời gian CPU và phiên bản WCF gửi 20.000 tin nhắn sử dụng 34,16% thời gian CPU (được thiết kế bằng tính năng Phân tích của Visual Studio Ultimate).

Trừ khi tôi đã thực hiện một lỗi trên kết thúc của tôi phiên bản WCF là gần gấp đôi so với MSMQ mã hoá cứng tương đương.

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