2015-04-20 17 views
6

Tôi đã sử dụng RabbitMQ không có Masstransit và gửi 10.000 tin nhắn/giây và một triệu tin nhắn trong 100 giây.Sử dụng Masstransit RabbitMQ có hiệu suất rất chậm?

Nhưng sau khi sử dụng Masstransit với RabbitMQ hiệu suất rất thấp trong máy của tôi.

Đĩa cứng rất hoạt động (sử dụng 99%) khi xuất bản/tiêu thụ thông báo và hoạt động CPU cho quá trình này gần như là 0%.

Khi chạy Publisher/Subscriber console ứng dụng với mã này:

var bus = ServiceBusFactory.New(x => 
{ 
    x.UseRabbitMq(); 
    x.ReceiveFrom("rabbitmq://localhost/Example_Hello"); 
}); 
var message = new MyMessage() { Text = "hello", When = DateTime.Now }; 
for (int i = 0; i < 100; i++) 
{ 
    bus.Publish<MyMessage>(message, x => { }); 
} 

đăng 100 tin nhắn trong 6 giây và tôi không biết tại sao là rất chậm.


cấu hình và phần mềm phiên bản máy của tôi là:

Windows 8.1 64bit

Intel Core i3 3.30GHz

Memory 8GB


Visual Studio 2013 C# Net 4.5.1

Erlang 6.3

RabbitMQ 3.4.4

Masstransit 2.9.9

RabbitMQ.Client 3.4.0

+1

FYI, khả năng không đợi Ack với .NET 4.x được thêm vào MT 2.10. –

+0

Cảm ơn câu trả lời, ông Chris Patterson. bây giờ tôi sẽ sử dụng nó. –

+0

@MohammadRadmanFar: bạn có cơ hội thành công ở đây không? Tôi vừa mới đăng trên mt thảo luận nhóm (https://groups.google.com/forum/#!topic/masstransit-discuss/XiqSDnJzd8U) vì tôi không thể tìm ra cách giải quyết vấn đề này. –

Trả lời

3

Điều này là do dưới lớp chăn, MassTransit đang chờ RabbitMQ để Ack thông điệp , đảm bảo rằng nó đã được chấp nhận bởi người môi giới trước khi trở về người gọi. Nếu không có sự chờ đợi này, nếu người môi giới không nhận được thông báo, tin nhắn có thể bị mất.

Với MassTransit v3 (hiện tại trước khi phát hành), các phương pháp Publish (và tất cả các phương pháp Send) bây giờ là async, trả lại một Task có thể được chờ đợi (hay không, nếu bạn không quan tâm đến kết quả).

tôi có thể thêm một phương pháp PublishAsync cho .NET 4.0 phát triển lên phiên bản 2.9.9, trên thực tế, đó là những gì tôi có thể kết thúc làm như một cách giải quyết tạm thời cho các ứng dụng vẫn sử dụng phiên bản ổn định hiện hành. Cũng có thể hữu ích khi thêm tùy chọn NoWait vào SendContext, cho phép ứng dụng chọn không tham gia hoạt động chờ Ack.

Tôi chỉ ủng hộ độ bền so với hiệu suất trong trường hợp sử dụng của tôi, một cách trung thực.

+2

Vì tôi khá nhiều trả lời cho bản thân mình (và nó hóa ra một lỗi đơn giản là trong các nguồn) Tôi cũng có thể không giải thưởng tiền thưởng cho bất cứ ai. Tuy nhiên, kể từ khi bounty đã được thiết lập, tôi quyết định trao nó cho bạn Chris như một dấu hiệu của gratitutde cho tất cả các nỗ lực của bạn bạn đặt trong MT. Hãy tiếp tục công việc tốt, liên quan :) –

3

Tôi đã tìm thấy một lỗi trong MT2 < = 2.10.1 có thể ngăn chặn nó từ việc xử lý đúng các WaitForAck cờ. Tôi đã đăng một đề xuất vá và hy vọng Chris phát hành phiên bản 2.10.2 càng sớm càng tốt.

Các thông tin chi tiết về vấn đề này được mô tả ở đây:

https://groups.google.com/forum/#!topic/masstransit-discuss/XiqSDnJzd8U

Nói tóm lại, vấn đề này là do lỗi trong constructor SendContext sao chép, mặc dù bối cảnh ban đầu có sự chờ đợi cho bộ ack cờ đến false, ngữ cảnh được sử dụng trong cuộc gọi có cờ luôn được đặt thành true.

+0

Đọc chủ đề - con đường để đi, người đàn ông! –

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