2013-01-23 15 views
5

Tôi muốn tạo hàng đợi ưu tiên có ưu tiên nội bộ để các messags được ưu tiên cao hơn được bật trước tiên bằng ServiceStack. Việc triển khai ServiceStack RedisMQ cung cấp thiết lập Mức độ ưu tiên của loại dài trên giao diện IMessage của nó. Tôi hy vọng rằng thư được gửi với giá trị cao hơn trên thuộc tính Ưu tiên sẽ được bật trước tiên từ hàng đợi. Các thử nghiệm của tôi cho thấy rằng thông báo có Mức độ ưu tiên> 0 được đặt trên Redis "Mq: MyDto.priorityq" trong khi bất kỳ giá trị nào khác đặt thông báo vào hàng đợi bình thường "Mq: MyDto.inq".Servicestack Ưu tiên nội bộ trong RedisMQ PriorityQueue

Đây là một số mẫu mã minh họa những gì tôi đang cố gắng để hoàn thành:

  using (var producer = MsgFactory.CreateMessageProducer()) 
     { 
      var lowPrioMsg = new Message<MyDto>(lowPrioDto); 
      lowPrioMsg = (long)1; 
      producer.Publish<MyDto>(lowPrioMsg); 

      var highPrioMsg = new Message<MyDto>(highPrioDto); 
      highPrioMsg.Priority = (long)100; 
      producer.Publish<MyDto>(highPrioMsg); 
     } 

Nói cách khác, tôi muốn highPrioMsg với Priority = 100 được popped trước lowPrioMsg với Mức độ ưu tiên = 1. Tuy nhiên, trong thực tế, những thông điệp này dường như tuân theo nguyên tắc FIFO tuần tự.

Có cách nào tôi có thể định cấu hình ServiceStack RedisMQ hoạt động như tôi mong đợi với Ưu tiên nội bộ trong PriorityQueue không?

Hoặc là lựa chọn duy nhất của tôi để sử dụng hàng đợi thông thường hoặc hàng đợi ưu tiên? Trong trường hợp đó, tại sao phải sử dụng dài cho thiết bị Ưu tiên thay vì một boolean?

Trả lời

2

Trong việc thực hiện ServiceStack Redis MQIMessageService phải của bạn trong đó PriorityQ chỉ là một Queue FIFO và tất cả những gì xảy ra khi bạn gửi một tin nhắn với một Priority > 0 là nó được xuất bản để PriorityQ thay vì tiêu chuẩn INQ các thông điệp thường được xuất bản.

Mức độ ưu tiên là số để các Nhà cung cấp dịch vụ khác của ServiceStack MQ có khả năng cung cấp triển khai khác, tức là sử dụng điểm ưu tiên. Hiện tại PriorityQ trong Redis được hỗ trợ bởi danh sách redis-server tiêu chuẩn không hỗ trợ ưu tiên các phần tử, cuối cùng chúng tôi có thể xem xét thay đổi triển khai để sử dụng tập hợp được sắp xếp cho phép sắp xếp.

Chúng tôi cũng định gửi các nhà cung cấp Máy chủ MQ khác nhau cho ServiceStack (ví dụ: RabbitMQ, ZeroMQ, ServiceBus, v.v.), nơi chúng tôi sẽ sử dụng điểm Ưu tiên nơi nhà môi giới MQ cơ bản hỗ trợ.

+0

Ok, câu trả lời hay. Cảm ơn! –