2016-02-28 12 views
5

Giả sử một số nhà sản xuất xuất bản cho cùng một trao đổi E (fanout). Mỗi nhà sản xuất có kênh riêng. Hàng đợi Q bị ràng buộc để trao đổi E. nhà sản xuất P1 xuất bản thông điệp M1 đến E và nhận được xác nhận A1 từ E. Chỉ sau khi xác nhận A1 nhà sản xuất thứ hai P2 xuất bản thông báo thứ hai M2. Thứ tự bảo hành của RabbitMQ trong Q: M1 là đầu tiên, M2 là thứ hai? Điều đó sẽ được đăng ký với người tiêu dùng Q luôn nhận M1 và sau đó là M2?Gửi tin nhắn thứ hai sau khi nhận được tin nhắn đầu tiên. ThỏMQ có bảo đảm đơn đặt hàng không?

+0

Tại sao bạn có nhiều nhà sản xuất khi nhà sản xuất (P2) luôn chờ nhà sản xuất trước đó (P1) lấy mã ACK? Làm thế nào để P1 và P2 giao tiếp? – cantSleepNow

Trả lời

1

RabbitMQ đảm bảo thứ tự các thư trong hàng đợi: Trước tiên, Đầu tiên. Tin nhắn đầu tiên đi vào hàng đợi sẽ là thông điệp đầu tiên xuất hiện trong hàng đợi và chúng sẽ vẫn giữ nguyên thứ tự (giả sử bạn chỉ đang tiêu thụ và acking chúng ... nếu bạn bắt đầu nacking/rejecting message, tái xuất bản chúng , vv, mọi thứ thay đổi)

Đó là sự đảm bảo duy nhất mà nó sẽ thực hiện theo thứ tự các thông điệp: Hàng đợi FIFO.

Nếu bạn cần đảm bảo thứ tự thư được gửi đến hàng đợi, bạn phải tự mình xây dựng quy trình đó.

FWIW, rất khó để xây dựng đảm bảo này. Cách duy nhất được đảm bảo thực sự để đảm bảo thứ tự của các tin nhắn không phải là gửi tin nhắn tiếp theo cho đến sau lần xử lý đầu tiên được xử lý.

Ngay cả khi bạn chờ xác nhận của nhà xuất bản trước khi gửi bản tiếp theo, có thể người tiếp theo sẽ kết thúc trong hàng đợi trước lần đầu tiên (mặc dù rất khó xảy ra).

Bạn có thể muốn xem xét Message SequenceResequencer nếu bạn cần đảm bảo khách hàng nhận được thư theo một thứ tự nhất định.

+0

Cảm ơn bạn. Tôi hiểu bạn trả lời là "Không". Cả hai chúng tôi đều đồng ý rằng "Thông báo đầu tiên đi vào hàng đợi ** ** sẽ là thông điệp đầu tiên xuất hiện trong hàng đợi". Nhưng câu hỏi của tôi là khoảng cách ** giữa trao đổi và xếp hàng **. Và nếu tôi hiểu chính xác bạn nói rằng trao đổi có thể thừa nhận có được thông điệp M1 đến P1, nhận được tin nhắn M2 và đặt chúng trong hàng đợi theo thứ tự ngược lại: M2, sau đó M1. Chính xác? – Kaponir

+0

rất khó xảy ra điều này, nhưng vẫn có thể xảy ra. M1 có thể rất lớn và yêu cầu ghi vào đĩa, ví dụ, trong khi M2 là rất nhỏ và không yêu cầu ghi vào đĩa. Hoặc, quá trình erlang đang hoạt động trên M1 có thể bị lỗi và phải khởi động lại, cho phép M2 đến đó trước. Một lần nữa, không có khả năng kịch bản, nhưng có thể, vẫn còn. –

+0

cuối cùng, nếu bạn cần thứ tự xử lý được bảo đảm, bạn đã sử dụng trình tự sắp xếp và giới hạn xử lý hàng đợi thành 1 thư cùng một lúc để bạn có thể sắp xếp lại các thư đúng cách nếu chúng bị lỗi –

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