2015-08-17 19 views
6

Tôi có một API có thể được thu nhỏ theo chiều ngang. API sẽ xác nhận các yêu cầu của máy khách và nó cần gửi công việc tới một hệ thống thứ cấp. Hệ thống thứ cấp cần xử lý công việc trên cơ sở đầu tiên đến trước được phục vụ trước, một hàng đợi. Cũng vì hệ thống thứ cấp đang truy cập các tài nguyên có thể được chia sẻ chỉ một thể hiện của nó có thể hoạt động tại một thời điểm nhất định. Hệ thống thứ cấp cần phải có một cơ chế thất bại. Nếu trường hợp thứ nhất của hệ thống thứ cấp đi xuống một thể hiện khác cần phải thay thế nó.RabbitMQ người tiêu dùng hoạt động duy nhất với người tiêu dùng chuyển đổi thụ động

Tôi đã nghĩ đến việc sử dụng RabbitMQ làm cơ chế xếp hàng và có nhiều người tiêu dùng kết nối nhưng chỉ có một người tiêu dùng đang hoạt động sẽ xử lý công việc. Một trong những trường hợp khác sẽ mất công việc xử lý tin nhắn nếu người tiêu dùng hoạt động trước đó không xác nhận tin nhắn. Điều này có thể xảy ra với RabbitMQ không?

Cũng có thể xác nhận thư chỉ sau khi công việc đã được hoàn thành?

Cảm ơn bạn.

+0

Xin lỗi để hồi sinh một câu hỏi cũ ở đây nhưng tôi có chính xác tình huống này quá và tự hỏi nếu bạn đã bao giờ tìm thấy một giải pháp cho vấn đề này? Karl – Stono

Trả lời

0

trong trường hợp này, tôi đề xuất sao chép thư trên hàng đợi, ví dụ: nếu u có 3 người tiêu dùng cho một tin nhắn, nó là thích hợp hơn để xây dựng 3 hàng đợi và bằng cách trao đổi trùng lặp các tin nhắn trên 3queue này.



Cũng có thể xác nhận thư chỉ sau khi công việc đã hoàn thành?
có bạn có thể di chuyển mã ACK trong mã của bạn, trong trường hợp của bạn sau khi soạn thảo thư.

+0

Cảm ơn bạn đã trả lời. Bởi có 3 người tiêu dùng tất cả trong số họ sẽ xử lý tin nhắn. Tôi muốn có một người tiêu dùng thực hiện việc xử lý và những người khác để xử lý nếu người tiêu dùng chính giảm xuống. – indit

+0

tôi không hiểu. chỉ có 1 tác phẩm và 2 tác phẩm khác chỉ thức dậy "1" đi xuống? đúng? –

1

Điều này không thể trực tiếp với RabbitMQ, theo cách bạn muốn.

Bạn có thể có nhiều người tiêu dùng cho một hàng đợi. Tuy nhiên, RabbitMQ sẽ gửi tin nhắn đến bất kỳ người tiêu dùng nào có sẵn để làm việc. Nói cách khác, nếu bạn có 3 người tiêu dùng và bạn gửi 3 tin nhắn đến hàng đợi, mỗi người trong số những người tiêu dùng đó có thể sẽ nhận được 1 tin nhắn.

Nếu bạn thực sự cần chuyển đổi dự phòng/thụ động cho người tiêu dùng, bạn sẽ cần sử dụng một hệ thống khác để quản lý và theo dõi các trường hợp của người tiêu dùng.

Về xác nhận công việc đang thực hiện: có. Đặt hàng đợi của bạn vào chế độ xác nhận bằng cách đặt no_ack thành true. Điều này sẽ yêu cầu bạn phải thừa nhận từng thông điệp từ người tiêu dùng. Bạn có thể giữ tin nhắn cho đến khi hoàn thành công việc và sau đó xác nhận thông báo khi tác phẩm hoàn tất.

Xem ví dụ worker queue trong tài liệu RabbitMQ để biết ví dụ về sử dụng xác nhận và thảo luận ngắn gọn về thông báo vòng xoay gửi đến người tiêu dùng.

+0

Cảm ơn Derick. Một thay thế tôi đã suy nghĩ của việc thiết lập prefetch_count để 1. Khi tôi hiểu điều này sẽ cung cấp tin nhắn cho người tiêu dùng và chờ đợi cho đến khi một ack được gửi đến giao hàng thông điệp tiếp theo trong hàng đợi. Điều này sẽ đảm bảo rằng tại một thời điểm nhất định chỉ có 1 tin nhắn được xử lý trên tất cả người tiêu dùng? – indit

+0

số lần tìm nạp trước sẽ giới hạn số lượng tin nhắn chưa được nhận biết trong một kênh nhất định (người tiêu dùng, về cơ bản). nếu bạn có 3 trường hợp người tiêu dùng và mỗi người trong số họ có tìm nạp trước 1, bạn sẽ có tối đa 3 thư đang được xử lý –

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