2009-03-18 4 views
6

Tôi có một ứng dụng kiểm tra cơ sở dữ liệu mỗi phút cho bất kỳ email nào được cho là sẽ được gửi đi vào thời điểm đó. Tôi đã suy nghĩ về việc làm cho một nhiệm vụ rake này sẽ được chạy bởi một công việc cron mỗi phút. Sẽ có một giải pháp tốt hơn cho điều này?Giải pháp đường ray tốt nhất cho bưu phẩm chạy mỗi phút

Từ những gì tôi đã đọc, điều này không lý tưởng vì cào phải nạp toàn bộ môi trường đường ray mỗi phút và điều này trở nên đắt đỏ.

Suy nghĩ?

Cảm ơn.

Trả lời

11
  1. Bạn có thể sử dụng backgroundrb. Điều này, tuy nhiên, sẽ ăn bộ nhớ ra khỏi ứng dụng Rails chính của bạn vì nó sẽ sinh ra một cá thể Ruby độc quyền với backgroundrb.
  2. Bạn cũng có thể xác định SystemController (hoặc tương đương) trong ứng dụng chính của mình, với các hành động khác nhau tương ứng với các tác vụ gia đình khác nhau mà ứng dụng của bạn nên thực hiện. Bạn có thể "prod" từ crontab bằng cách sử dụng wget hoặc curl, lợi thế là nó chia sẻ tài nguyên với ứng dụng chính của bạn. Tùy thuộc vào cách hoang tưởng hoặc bạn đang có, hoặc về mức độ dễ bị tấn công của DOS (hoặc các loại tấn công khác), bạn có thể chọn chặn truy cập đến URL của bộ điều khiển này từ các địa chỉ khác với vòng lặp (lý tưởng trong proxy ngược của bạn, cách khác từ chính bộ điều khiển.)
0

Tôi làm những gì Vlad đề xuất (# 2), chỉ yêu cầu địa phương được vinh danh và tôi đủ hoang tưởng để yêu cầu chuỗi truy vấn cụ thể. vào url.

Tôi có một số hành động định kỳ được thiết lập theo cách này.

1

Một phương pháp thực sự đơn giản sẽ có một kịch bản mà không ..

while true do 
    check_and_send_messages() 
    sleep 60 
end 

đồi khế, đồi có nghĩa là bạn đang không ngừng respawning môi trường Rails.

Rõ ràng nó có nhiều lỗi khác nhau, nhưng cũng có một số lợi ích (ví dụ, với 1-Rake mỗi phút, nhiệm vụ Rake mất hơn một phút, Rake sẽ chạy nhiều lần cùng một lúc)

Ngoài ra, Railscasts tập phim Rake in Background, Starling and Workling, và Custom Daemon có thể cung cấp cho bạn một số ý tưởng (họ được mô tả chính xác những nhiệm vụ này)

1

hóa ra có một cái gì đó thực sự được xây dựng chỉ cho việc này: ar_mailer. ar_mailer xếp hàng các e-mail vào DB và sau đó gửi chúng ra định kỳ bằng lệnh ar_mailer. Bạn có thể gọi ar_mailer mỗi phút.

Điều tuyệt vời về ar_mailer là về cơ bản đòi hỏi rất ít thay đổi về cách bạn đã gửi e-mail. Bạn chỉ cần kế thừa từ ar_mailer thay vì ActiveMailer. Sử dụng phương pháp này, bạn sẽ không phải lo lắng về việc chạy các tác vụ cào trong nền, quy trình forking, hoặc bất cứ thứ gì như thế - và thực tế bạn nhận được một máy chủ thư thực với các thư được xếp hàng bị xóa khi thư thực sự được gửi. Tính năng này rất quan trọng nếu bạn có một hệ thống gửi số lượng lớn email enmass. Tôi đã sử dụng ar_mailer để xây dựng một mạng xã hội - vì vậy tôi có thể chứng thực sự mạnh mẽ của nó.

Here's a good article that talks about ar_mailer in depth. Tôi mạnh mẽ khuyên bạn nên chống lại giải pháp của riêng bạn ở đây vì Eric đã xây dựng một giải pháp thời gian thử nghiệm cho vấn đề này rất.