2010-03-02 42 views
6

Tôi cần thiết lập hàng đợi công việc/tin nhắn với tùy chọn đặt độ trễ cho tác vụ sao cho công việc miễn phí không được nhân viên miễn phí tiếp nhận, nhưng sau một thời gian nhất định (có thể thay đổi từ nhiệm vụ này sang tác vụ khác). Tôi nhìn vào một vài giải pháp xếp hàng linux (rabbitmq, gearman, memcacheq), nhưng không ai trong số họ dường như cung cấp tính năng này ra khỏi hộp.Hàng đợi công việc/tin nhắn có thể mở rộng đơn giản với độ trễ

Bất kỳ ý tưởng nào về cách tôi có thể đạt được điều này?

Cảm ơn!

Trả lời

11

Tôi đã sử dụng BeanstalkD để có hiệu ứng tuyệt vời, bằng cách sử dụng tùy chọn trễ khi chèn công việc mới để chờ vài giây cho đến khi mặt hàng đó có sẵn để được đặt trước.

Nếu bạn đang trì hoãn lâu hơn (hơn 30 giây), hoặc công việc có phần quan trọng để thực hiện (abeit later), thì nó cũng có hệ thống ghi nhị phân để bất kỳ sự cố daemon nào vẫn có hồ sơ của công việc. Điều đó nói rằng, tôi đã đặt hàng trăm ngàn công việc trực tiếp thông qua các trường hợp Beanstalkd và những công nhân mà tôi đã viết luôn có nhiều vấn đề hơn so với máy chủ.

+0

Cảm ơn bạn đã phản hồi, tôi đã nhìn vào beanstalkd trong vài ngày qua và có vẻ tuyệt vời. Và bạn nói đúng, công việc logic và quản lý là khó khăn :) – idevelop

1

Bạn có thể sử dụng nhà môi giới AMQP (như RabbitMQ) và tôi có một "đại lý" (ví dụ: quy trình python được xây dựng bằng pyton-amqplib) nằm trên sàn trao đổi chặn các thông điệp cụ thể (cụ thể routing_key); khi bộ hẹn giờ đã trôi qua, hãy gửi lại tin nhắn trên trao đổi với routing_key khác.

Tôi nhận thấy điều này có nghĩa là "dịch/ánh xạ" routing keys nhưng nó hoạt động. Làm việc với RabbitMQ và python-amqplib rất đơn giản.

+1

Tôi đã nghĩ về điều này, nhưng nếu nhân viên chờ đợi bị giết trong khi chờ đợi hẹn giờ trôi qua, thông báo sẽ không bao giờ được thêm vào hàng đợi. Có lẽ tôi có thể khắc phục điều này bằng cách có hàng đợi thứ hai, cố định và đại lý có nhiều bộ hẹn giờ nội bộ. Tuy nhiên, nó có vẻ giống như một giải pháp xấu. – idevelop

+0

Vâng, đối phó với chế độ thất bại này là một phần của trò chơi. Tôi sẽ ngạc nhiên nếu các chức năng bạn đang yêu cầu được chủ đạo trong AMQP môi giới ra khỏi đó kể từ khi nó đi ngược lại mục tiêu chính: giảm thiểu độ trễ. – jldupont

+0

Cảm ơn bạn đã trả lời. Tôi nghĩ tôi sẽ thử dùng beanstalkd, có vẻ ok, và hỗ trợ "chậm trễ" mà tôi đã nói đến. – idevelop

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