2012-08-19 30 views
10
ConnectionFactory factory = new ConnectionFactory {HostName = "localhost"}; 

using (IConnection connection = factory.CreateConnection()) 
using (IModel channel = connection.CreateModel()) 
{ 
    channel.QueueDeclare("hello", false, false, false, null); 
    for (int i = 0; i < 100000; i++) 
    { 
     MemoryStream stream = new MemoryStream(); 

     var user = new User 
         { 
          Id = i 
         }; 

     Serializer.Serialize(stream, user); 


     channel.BasicPublish("", "hello", null, stream.ToArray()); 

    } 

} 

Tôi có mã ở trên và tôi tò mò về sự an toàn của luồng.C# RabbitMQ An toàn chủ đề của khách hàng

Tôi không chắc chắn, nhưng tôi sẽ tưởng tượng ConnectionFactory là chủ đề an toàn. Nhưng sau đó tôi không chắc chắn nếu IConnection là chủ đề an toàn? Tôi có nên tạo kết nối cho mỗi yêu cầu không? Hay đúng hơn là một kết nối liên tục? Và những gì về IChannel?

Ngoài ra, tôi có nên lưu trữ kết nối dưới dạng ThreadLocal không? Hoặc tôi có nên tạo kết nối cho mỗi yêu cầu không?

+1

xem câu trả lời của tôi cho câu hỏi này http://stackoverflow.com/questions/10407760/is-there-a-performance-difference-between-pooling-connections-or-channels-in-rab/10501593#10501593 – robthewolf

Trả lời

23

Kết nối chỉ là an toàn chỉ, IModel thì không. Nói chung, bạn nên cố gắng giữ kết nối mở trong suốt thời gian đăng ký của bạn. Điều này đặc biệt đúng nếu bạn có người tiêu dùng cần kết nối mở để nhận tin nhắn. Điều quan trọng là phát hiện và khôi phục từ các kết nối bị gián đoạn, do lỗi mạng hoặc Môi giới. Tôi muốn khuyên bạn nên đọc 'RabbitMQ trong Hành động' của Videla và Williams, đặc biệt là chương 6 'Viết mã mà sống sót thất bại'.

Bây giờ cho một plug không biết xấu hổ. Tôi là tác giả của EasyNetQ, một API cấp cao cho RabbitMQ. Nó thực hiện tất cả các quản lý kết nối cho bạn và sẽ tự động kết nối lại và xây dựng lại tất cả các thuê bao của bạn nếu có một mạng hoặc cúp môi giới. Nó cũng cung cấp hỗ trợ cluster và fail-over ra khỏi hộp. Hãy thử một lần.

+11

" Vô cùng cẩn thận "? Những loại mối đe dọa mơ hồ là gì? EasyNetQ là một gợi ý hoàn toàn phù hợp ở đây. Nếu mọi người không đồng ý, đó là những gì nút downvote cho. Không có đề nghị nào được đưa ra một ý nghĩ thứ hai, anh cũng không làm lịch sự từ chối quyền tác giả của mình. Tôi sẽ cực kỳ cẩn thận khi cưỡi nó trên con ngựa của bạn. –

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