2011-11-28 31 views
9

Tôi có một chương trình thử nghiệm RabbitMQ đơn giản cho các tin nhắn ngẫu nhiên enqueuing, và một đọc chúng, tất cả bằng cách sử dụng Spring-AMQP. Nếu người tiêu dùng chết (ví dụ như giết chết một quá trình mà không có cơ hội đóng kết nối hoặc kênh của nó), bất kỳ thông điệp nào mà nó không được thừa nhận dường như vẫn chưa được biết đến mãi mãi.khi nào kênh AMQP/RabbitMQ không có kết nối chết?

Tôi đã thấy một số tham chiếu (ví dụ: this question) nói rằng kênh sẽ chết khi không có kết nối và các thư còn lại chưa được gửi sẽ được gửi lại. Đó không phải là hành vi tôi thấy - thay vào đó tôi nhận được danh sách ngày càng tăng về các kênh được đánh dấu IDLE và danh sách các kết nối đang phát triển được đánh dấu đang chạy nhưng không có hoạt động.

Có một số cấu hình cần thiết để nhận thấy rằng kết nối được chết một lần quá trình này đã bị giết?

EDIT: Tôi đã chạy máy chủ thỏmq bên trong VirtualBox VM, điều này dường như không quản lý các kết nối gửi đến chết một cách chính xác trên NAT. Điều này hoạt động tốt với máy chủ mq chạy trực tiếp trên máy chủ vật lý.

+1

FYI: Tôi đã gặp phải vấn đề tương tự khi hàng đợi độc quyền không được làm sạch lên nhà môi giới một cách kịp thời sau khi người tiêu dùng độc quyền chết. Điều này ngăn cản các thành phần này với các tên xác định bắt đầu. Nó đã được giải quyết bằng cách thiết lập 'ConnectionFactory.RequestedHeartbeat' thành một giá trị nhỏ (giây) – drstevens

Trả lời

3

Trả lời để đóng. Điều này hóa ra không phải là một vấn đề thực sự.

Tôi đã chạy máy chủ thỏmq bên trong VirtualBox VM, điều này dường như không quản lý các kết nối gửi đến chết một cách chính xác trên NAT. Điều này hoạt động tốt với máy chủ mq chạy trực tiếp trên máy chủ vật lý.

4

AMQP sử dụng Hàng đợi và trao đổi. Bạn xuất bản trên một trao đổi và bạn ràng buộc hàng đợi để nhận được tin nhắn từ trao đổi (bạn có thể thấy một short explanation trên blog của tôi. Khi bạn tạo một hàng đợi, bạn có thể đặt nó để tự động xóa cũng như bao nhiêu thời gian nó sẽ không sử dụng trước khi nó tự động . xóa Dưới đây là một trích dẫn từ các quickref RabbitMQ:

queue.declare (viết tắt reserved-1, hàng đợi tên hàng đợi, cắn thụ động, cắn bền, chút độc quyền, chút tự động xóa, không- chờ không, chờ đợi, bảng đối số) ➔ declaration-ok

Hỗ trợ: đầy đủ Khai báo hàng đợi, tạo nếu cần thiết

Phương pháp này tạo hoặc kiểm tra hàng đợi. Khi tạo một hàng đợi mới client có thể chỉ định các thuộc tính khác nhau mà kiểm soát độ bền của hàng đợi và nội dung của nó, và mức độ chia sẻ cho hàng đợi.

RabbitMQ thực hiện các tiện ích mở rộng cho đặc điểm AMQP cho phép người tạo hàng đợi kiểm soát các khía cạnh khác nhau trong hành vi của nó.

Thông báo mỗi hàng đợi TTL Phần mở rộng này xác định thời lượng một tin nhắn được xuất bản lên hàng đợi có thể hoạt động trước khi máy chủ hủy bỏ. Thời gian sống được định cấu hình với đối số x-message-ttl cho tham số đối số của phương pháp này.

Hàng đợi hết hạn Hàng đợi có thể được khai báo với thời gian thuê tùy chọn. Thời gian thuê xác định khoảng thời gian một hàng đợi có thể vẫn không được sử dụng trước khi máy chủ tự động xóa . Thời gian thuê được cung cấp dưới dạng đối sốx-hết hạn trong tham số đối số cho phương thức này.

gương Queues Chúng tôi đã phát triển active/active sẵn sàng cao cho hàng đợi. Điều này hoạt động bằng cách cho phép các hàng đợi được nhân đôi trên các nút khác trong một cụm RabbitMQ. Kết quả là cần một nút của một cụm thất bại, hàng đợi có thể tự động chuyển sang một trong những gương và tiếp tục hoạt động, không có không có các dịch vụ.Để tạo một hàng đợi được nhân đôi , bạn cung cấp đối số chính sách x-ha trong tham số cho phương thức này.

+0

Tôi không muốn hàng đợi bị xóa, tôi muốn nó tồn tại lâu dài. Nhưng tôi cũng muốn những thông điệp chưa được trả lời (được tiêu thụ bởi các quá trình đã chết trước khi thừa nhận) để được gửi lại. Đó là các kết nối/kênh chết cần xóa, không phải là tin nhắn. –

+2

ok bây giờ tôi đã có bạn - bạn cần phải tạo ra trường hợp ConnectionParameters và thiết lập một nhịp tim (setRequestedHeardbeat) với một giá trị hợp lý (1 nhịp tim bỏ lỡ sẽ đóng kênh) Sau đó vượt qua đó để constructor ConnectionFactory –

+0

@Arnon Rotem-Gal-Oz, thiết lập 'RequestedHeartbeat' đã giải quyết vấn đề tương tự của tôi được biểu hiện bằng các hàng đợi độc quyền không được làm sạch kịp thời với nhà môi giới. Điều này ngăn chặn các thành phần tuyên bố hàng đợi độc quyền với các tên xác định bắt đầu. – drstevens

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