tôi đã có một số rắc rối tìm hiểu xác nhận của RabbitMQ, tôi thấy sau lời giải thích từ RabbitMQ:Hành vi của các kênh truyền hình trong chế độ "xác nhận" với RabbitMQ
Ghi chú
Các nhà môi giới mất thông điệp dai dẳng nếu nó bị treo trước khi thông báo được ghi vào đĩa. Trong các điều kiện nhất định, điều này gây ra nhà môi giới hoạt động theo những cách đáng ngạc nhiên. Ví dụ, hãy xem xét kịch bản này:
một khách hàng công bố một thông điệp dai dẳng đến một hàng đợi bền
một khách hàng tiêu thụ thông điệp từ hàng đợi (lưu ý rằng thông điệp là dai dẳng và hàng đợi lâu bền) , nhưng chưa ack nó,
người môi giới chết và được khởi động lại, và
client kết nối lại và bắt đầu thông điệp tiêu thụ.
Tại thời điểm này, khách hàng có thể giả định hợp lý rằng thư sẽ được gửi lại. Đây không phải là trường hợp: việc khởi động lại đã gây ra người môi giới mất thư. Để đảm bảo sự kiên trì, khách hàng nên sử dụng xác nhận. Nếu kênh của nhà xuất bản ở chế độ xác nhận , nhà xuất bản sẽ không nhận được thông báo bị mất cho số bị mất (vì người tiêu dùng đã không ack'd nó và nó đã không được ghi vào đĩa).
Sau đó, tôi đang sử dụng http://hg.rabbitmq.com/rabbitmq-java-client/file/default/test/src/com/rabbitmq/examples/ConfirmDontLoseMessages.java này để làm một số xét nghiệm cơ bản và xác minh xác nhận, nhưng nhận được một số kết quả kỳ lạ:
- Phương pháp waitForConfirmsOrDie không chặn các nhà sản xuất, đó là khác biệt so với mong đợi của tôi , Tôi cho rằng waitForConfirmsOrDie sẽ chặn nhà sản xuất cho đến khi tất cả các tin nhắn đã được ack'd hoặc một trong số họ là nack'd.
- Tôi xóa kênh.confirmSelect() và channel.waitForConfirmsOrDie() khỏi nhà xuất bản và thay đổi người tiêu dùng từ auto ack sang ack thủ công, tôi xuất bản tất cả thư tới hàng đợi và sử dụng từng thư một, sau đó tôi dừng chú thỏ máy chủ trong quá trình tiêu thụ, những gì tôi mong đợi bây giờ là các tin nhắn bên trái sẽ bị mất sau khi máy chủ thỏmq được khởi động lại, vì kênh không ở chế độ xác nhận, nhưng tôi vẫn thấy tất cả các thư khác trong hàng đợi sau khi khởi động lại máy chủ.
Vì tôi mới sử dụng RabbitMQ, bất kỳ ai cũng có thể cho tôi biết vấn đề về sự hiểu biết của tôi ở đâu?