2010-09-21 38 views
12

Tôi có thứ gì đó giống như hàng đợi công việc trên RabbitMQ và, theo yêu cầu hủy công việc, tôi muốn rút lại các tác vụ chưa bắt đầu xử lý (thư của họ chưa được ack'd), tương ứng để rút lại các tin nhắn này từ các hàng đợi mà chúng đã được định tuyến đến.Cách rút lại tin nhắn trong RabbitMQ?

Tôi chưa tìm thấy chức năng này trong AMQP hoặc trong API RabbitMQ; có lẽ tôi đã không tìm kiếm đủ tốt? Hoặc tôi sẽ phải sử dụng một cách giải quyết (nó không khó, nhưng vẫn còn)?

Trả lời

2

Ít nhất hai cách để đạt được mục tiêu của bạn:

+2

Không, điều này giải quyết một vấn đề khác. Tôi không cần phải từ chối một thông điệp ở phía người tiêu dùng, tôi muốn hủy giao hàng của nó từ phía nhà sản xuất, để thông điệp không đến được với người tiêu dùng như thể nó chưa bao giờ tồn tại. Trong vấn đề của tôi, người tiêu dùng không thể quyết định liệu một tin nhắn có nên bị từ chối hay không. – jkff

+4

Nếu thông báo thành công được xuất bản và bạn cần phải loại bỏ chúng khỏi hàng đợi đã biết, sau đó đăng ký ot nó và tiêu thụ chúng trong nhà sản xuất. –

4

RabbitMQ không cho phép bạn sửa đổi hoặc xóa thư sau khi chúng được đặt hàng. Đối với điều đó, bạn muốn có một số loại cơ sở dữ liệu để giữ trạng thái của mỗi công việc và sử dụng RabbitMQ để thông báo cho các bên quan tâm về những thay đổi ở trạng thái đó.

Với khối lượng thấp, bạn có thể gộp nó cùng với hàng đợi cho mỗi công việc. Tạo hàng đợi, đăng mô tả công việc lên hàng đợi, thông báo tên của hàng đợi cho người lao động. Nếu công việc cần phải được hủy bỏ trước khi nó được xử lý, xóa hàng đợi của công việc; khi các công nhân đến lấy mô tả công việc, họ sẽ nhận thấy hàng đợi đã biến mất.

Nhẹ cân và thường tốt hơn là sử dụng redis hoặc cửa hàng khóa/giá trị khác để giữ trạng thái công việc (với hồ sơ bị xóa hoặc vắng mặt có nghĩa là công việc bị hủy hoặc không tồn tại) và sử dụng rabbitmq để thông báo về mới/đã xóa/thay đổi bản ghi trong kho khóa/giá trị.

1

Bạn cần đăng ký tất cả các hàng đợi mà thư đã được định tuyến và sử dụng chúng với mã định dạng. Ví dụ: nếu bạn xuất bản để trao đổi chủ đề bằng "kiểm tra" làm khóa định tuyến và có 3 hàng liên tục đăng ký "thử nghiệm", bạn sẽ cần phải tiêu thụ ba hàng đợi đó. Nó có thể là tốt hơn để thêm một hàng đợi mà quá trình tiêu dùng của bạn cũng sẽ lắng nghe quá, và nói với họ để bỏ qua những tin nhắn.

Một giải pháp thay thế, vì bạn đang sử dụng RabbitMQ, là viết một plugin trao đổi tùy chỉnh sẽ chấp nhận một số hướng dẫn của ban nhạc để xóa tất cả các hàng đợi. Ví dụ, bạn có thể có trao đổi đó đọc một tiêu đề tin nhắn đặc biệt mà nói với nó để xóa tất cả các hàng đợi mà thông điệp này được mệnh. Điều này đòi hỏi phải viết mã Erlang, nhưng có 4 loại trao đổi khác nhau được triển khai, do đó bạn chỉ cần sao chép mã tương tự nhất và viết mã cho bahaviours mới. Nếu bạn chỉ sử dụng tiêu đề tùy chỉnh cho điều này, thì nội dung của thư có thể là thông điệp bình thường cho người tiêu dùng.

Tóm lại:

1) nhà xuất bản cần tiêu thụ những thông điệp riêng của mình 2) nhà xuất bản có thể gửi một thông điệp đặc biệt trong một hàng đợi đặc biệt để nói với người tiêu dùng để bỏ qua thông điệp 3) nhà xuất bản có thể gửi một thông điệp đặc biệt cho một trao đổi tùy chỉnh sẽ xóa bất kỳ tin nhắn hiện có nào từ hàng đợi trước khi gửi thông điệp đặc biệt này đến người tiêu dùng.

7

Tôi sẽ giải quyết tình huống này bằng cách yêu cầu nhân viên kiểm tra một số loại nguồn dữ liệu có thẩm quyền để xác định xem công việc có nên tiến hành hay không. Ví dụ, nhân viên sẽ kiểm tra trạng thái công việc trong cơ sở dữ liệu để xem công việc đã bị hủy chưa.

Đối với trường hợp tốc độ xử lý có thể nhanh hơn tốc độ cửa hàng có thẩm quyền có thể được cập nhật và đọc, lưu trữ dữ liệu kém đảm bảo tốc độ cho các đặc điểm khác có thể hữu ích.

Ví dụ về điều này sẽ là sử dụng Redis làm cửa hàng để hủy xử lý thư thay vì một DB quan hệ như MySQL. Redis là rất nhanh, nhưng đảm bảo ít hơn về dữ liệu nó giữ, trong khi MySQL là chậm hơn nhiều, nhưng cung cấp đảm bảo nhiều hơn về dữ liệu nó giữ.

Cuối cùng, khái niệm kiểm tra với một nguồn khác có hay không xử lý thư giống nhau, nhưng cách bạn triển khai phụ thuộc vào kịch bản cụ thể của bạn.

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