2010-09-01 25 views
5

Tôi có một nhà sản xuất mà tôi muốn phân phối công việc liên tục trên khắp người tiêu dùng bằng cách băm đồng nhất. Ví dụ, với các nút người tiêu dùng X và Y, các nhiệm vụ A, B, C phải luôn đi đến người tiêu dùng X, và D, E, F cho người tiêu dùng Y. Nhưng điều đó có thể thay đổi một chút nếu Z tham gia nhóm người tiêu dùng.Nhà sản xuất có thể làm việc liên tục với người tiêu dùng thông qua hàng đợi tin nhắn không?

Tôi không muốn xử lý logic của riêng mình để kết nối với các nút của người tiêu dùng, và đặc biệt là không quản lý các nút tham gia và rời khỏi nhóm, vì vậy tôi đã đi theo con đường sử dụng RabbitMQ. xếp hàng cho mỗi nút người tiêu dùng.

Một vấn đề mà tôi đang gặp phải là liệt kê các hàng đợi này, vì nhà sản xuất cần biết tất cả các hàng đợi có sẵn trước khi phân phối công việc. AMQP thậm chí không hỗ trợ hàng đợi danh sách, khiến tôi không chắc chắn về toàn bộ cách tiếp cận của mình. RabbitMQ và Alice (brokenly at the moment) thêm chức năng đó mặc dù: Is there an API for listing queues and exchanges on RabbitMQ?

Đây có phải là cách sử dụng khôn ngoan của Thỏ không? Tôi có nên sử dụng hàng đợi tin nhắn không? Có thiết kế tốt hơn để hàng đợi có thể nhất quán phân chia công việc của tôi cho người tiêu dùng, thay vì tôi cần phải làm điều đó?

+1

Ngoài sự tò mò, tại sao bạn quan tâm nhiều đến tính nhất quán khi chia công việc? Như bạn nói, ánh xạ sẽ thay đổi khi người tiêu dùng được thêm hoặc xóa. – scvalex

+1

Bạn có thể nói là "địa phương tham chiếu". Người tiêu dùng X không biết trước nó sẽ làm việc trên A nhưng nó sẽ có lợi nếu X luôn có nhiệm vụ bằng hoặc giống A. (Xin lỗi vì sự mơ hồ.) Dù sao, với mục đích của tôi, một chút dịch chuyển là khỏe. Những thay đổi trong hồ bơi nên rất hiếm. – Bluu

Trả lời

6

Những gì bạn mô tả là có thể thực hiện được trong RabbitMQ.

thiết lập của bạn sẽ là một cái gì đó như:

  • một nhà sản xuất công bố thông điệp để trao đổi chủ đề; chúng ta hãy đặt tên là consist_divider;
  • khi người tiêu dùng tham gia vào hồ bơi, kết nối với nhà môi giới và tạo hàng đợi độc quyền có tên, nhưng không ràng buộc hàng đợi với bất kỳ điều gì
  • nhà sản xuất định kỳ thăm dò ý kiến ​​của nhà môi giới (có thể sử dụng rabbitmqctl list_consumers) để kiểm tra nếu người tiêu dùng thay đổi; nếu họ có, nó loại bỏ tất cả các ràng buộc hiện có và rebinds các hàng đợi khi cần thiết;
  • khi nhà xuất bản xuất bản, thư được gán khóa định tuyến khớp với loại công việc của họ.

Vì vậy, nếu bạn có 6 loại nhiệm vụ: A, B, C, D, E, F và chỉ có hai người tiêu dùng C1 và C2, các ràng buộc của bạn sẽ trông như sau: C1 bị ràng buộc 3 lần A, B và C; C2 bị ràng buộc 3 lần đến c_d với các phím định tuyến D, E và F.

Khi C3 tham gia nhóm, nhà sản xuất sẽ thấy điều này và rebinds hàng đợi cho phù hợp.

Khi nhà sản xuất xuất bản, nó sẽ gửi thư có routing_keys A, B, C, D, E và/hoặc F và các thư sẽ được định tuyến đến hàng đợi chính xác.

Sẽ có hai vấn đề tiềm năng với điều này:

  1. Có chút chậm trễ giữa khi người tiêu dùng tham gia các hồ bơi và các thông điệp được chuyển đến nó; Ngoài ra, nếu có tin nhắn trong hàng đợi, người tiêu dùng có thể nhận tin nhắn cho người tiêu dùng khác (ví dụ C3 tham gia, nhà sản xuất rebinds, nhưng C2 vẫn nhận được một số tin nhắn E và F vì họ đã ở trong hàng đợi),
  2. Nếu người tiêu dùng chết vì bất kỳ lý do gì, các thông điệp trong hàng đợi của nó (và trên đường đến hàng đợi của nó) sẽ bị mất; điều này có thể được giải quyết bằng cách tái xuất bản và chết chữ cái, tương ứng.

Để trả lời câu hỏi cuối cùng, bạn có thể muốn sử dụng xếp hàng và RabbitMQ là lựa chọn tuyệt vời, nhưng yêu cầu của bạn (chính xác hơn là `chia đều công việc ') không hoàn toàn phù hợp với AMQP.

+0

Rất kỹ lưỡng, câu trả lời đáng khích lệ! Một câu hỏi. Bạn nói người tiêu dùng không ràng buộc bản thân họ. Điều này có khác biệt gì so với người tiêu dùng ràng buộc bản thân với khóa định tuyến bằng tên hàng đợi của họ không? Sau đó, thay vì list_consumers tôi list_queues trực tiếp, không cần ràng buộc thêm. – Bluu

+1

Hàng đợi được tự động ràng buộc với amq.default (trao đổi trực tiếp) với tên của chúng là khóa ràng buộc. Theo như tôi có thể nói, đây không phải là những gì bạn muốn. Bạn không xuất bản cho người tiêu dùng, vì vậy, để nói, bạn đang xuất bản cho các loại nhiệm vụ và bạn muốn một số người tiêu dùng xử lý nhiều nhiệm vụ. Vì vậy, tôi đã nghĩ về một bản đồ một nhiệm vụ-ràng buộc và người tiêu dùng mà đối phó với nhiều nhiệm vụ có nhiều ràng buộc. Ngoài ra, kể từ khi các ràng buộc thay đổi, tất cả (hầu hết) của chúng thay đổi, có vẻ như không đúng đối với người tiêu dùng để xử lý việc này, vì vậy nhà sản xuất có vẻ phù hợp hơn với công việc. – scvalex

+0

Chế độ xem tốt, nó có bị mất thư khi khôi phục không? – flycee

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