2011-12-01 29 views
7

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ạ:

  1. 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.
  2. 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?

Trả lời

3

Sự hiểu biết của tôi là "Xác nhận kênh" dành cho Nhà môi giới xác nhận đã nhận được tin nhắn từ nhà sản xuất thành công, bất kể người tiêu dùng có nhắn tin này hay không.Tùy thuộc vào loại hàng đợi và thông điệp cung cấp chế độ, xem http://www.rabbitmq.com/confirms.html để biết chi tiết,

các thông điệp được khẳng định khi:

  • nó quyết định một thông báo sẽ không được chuyển đến hàng đợi (nếu cờ bắt buộc được thiết lập sau đó bản basic.return được gửi đầu tiên) hoặc
  • một thông báo tạm thời đã đến tất cả các hàng đợi (và gương) hoặc
  • một thông báo liên tục đã đạt đến tất cả các hàng đợi (và gương) và được lưu vào đĩa (và fsynced) hoặc
  • nhắn dai dẳng đã được tiêu thụ (và nếu cần thừa nhận) từ tất cả các hàng đợi của nó
0

Cũ câu hỏi nhưng cũng oh ..

tôi công bố tất cả các thông điệp vào hàng đợi và tiêu thụ thông điệp từng người một, sau đó tôi dừng máy chủ thỏmq 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 tin nhắn khác trong hàng đợi sau khởi động lại máy chủ.

Đây thực sự là cách hoạt động, NẾU tính kiên trì được bật. Nếu máy chủ bị treo hoặc có lỗi khác, các thư không thể được xác nhận và do đó sẽ không bị xóa khỏi hàng đợi.

Tin nhắn sẽ chỉ bị xóa khỏi hàng đợi nếu chúng được xác nhận sẽ được xử lý hoặc người môi giới chưa ghi nó vào bộ nhớ hoặc đĩa trước khi máy chủ bị lỗi.

Xác nhận và xác nhận có thể được đặt ra nếu muốn, và nhà sản xuất sẽ không chờ đợi các acks. Tôi không thể tìm thấy lệnh chính xác cho nó ngay bây giờ, nhưng nó tồn tại.

Thông tin thêm về acks và xác nhận: https://www.rabbitmq.com/reliability.html

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