2009-03-18 18 views
6

O anda gönderilmesi gereken tüm e-postalar için veritabanını her dakika kontrol eden bir uygulama var. Bunu her dakika bir cron işi ile çalıştırılacak bir komisyon görevi yapmayı düşünüyordum. Buna daha iyi bir çözüm olur muydu?Her dakikada çalışan bir posta sunucusuna yönelik en iyi ray çözümü

Okuduğum kadarıyla, bu ideal değil çünkü tırmık, rayların çevresini her dakika yüklemeli ve bu da pahalılaşır.

Düşünceler?

Teşekkürler.

cevap

11
  1. backgroundrb'u kullanabilirsiniz. Bununla birlikte, bu, ana Rails uygulamasından uzaklaşacak ve backgroundrb'a özel bir Ruby örneğini oluşturacaktır.
  2. Ayrıca, ana uygulamanıza, uygulamanızın gerçekleştirmesi gereken çeşitli ev işleriyle ilgili çeşitli eylemlerle birlikte bir SystemController (veya eşdeğeri) tanımlayabilirsiniz. crontab'dan wget veya curl'u kullanarak "prod" edebilirsiniz, avantajı, ana uygulamanızla kaynakları paylaşmasıdır. Ne kadar paranoya ya da siz olduğunuza ya da bu tür bir denetleyiciyi muhtemelen dış dünyaya gösterecek DOS'a (ya da diğer saldırı türlerine) karşı ne kadar savunmasız olduğuna bağlı olarak, bu denetleyicinin URL'sine geri döngü dışındaki adreslerden erişimi engelleyebilirsiniz (ideal olarak ters vekaleten alternatif denetleyici kendisi.)
0

Ben Vlad önerdi ne (# 2), yalnızca yerel istekleri ile gelen onur ve yeterince paranoyak aynı zamanda belirli bir sorgu dizesi tacked gerektirecek değilim url'ye.

Bu şekilde ayarlanmış birkaç periyodik eylem var.

1

biri gerçekten basit yöntem .. yapan bir senaryo olması sürekli Raylar çevreyi respawning değil demektir ..which

while true do 
    check_and_send_messages() 
    sleep 60 
end 

olurdu.

Açıkçası birtakım kusurları vardır, ama aynı zamanda bazı faydaları vardır (1-Rake dakika başına, bu Rake görev daha az bir dakika alır senin ile, örneğin, Rake bir kerede birden fazla kez yayınlanmaya başlayacak)

Ayrıca Railscasts Rake in Background, Starling and Workling yeralan olayların ve Custom Daemon

1

Bunun için sadece inşa şey aslında var çıkıyor (bunlar tam bu görevi nitelendiriyor) size bazı fikirler verebilir: ar_mailer. ar_mailer e-postaları DB'ye sıralar ve ar_mailer komutunu kullanarak periyodik olarak gönderir. Her dakika ar_mailer'i arayabilirsin.

Ar_mailer hakkında güzel olan şey, temel olarak e-postaları nasıl gönderdiğiniz açısından çok az değişiklik gerektirmesidir. Sadece ActiveMailer yerine ar_mailer'den miras almanız gerekiyor. Bu yöntemi kullanarak, arka planda sorgulama görevleri, forking işlemleri veya bunun gibi herhangi bir şeyle ilgili endişelenmenize gerek kalmayacak ve aslında posta gönderildiğinde silinen sıraya alınmış mesajlar içeren gerçek bir posta sunucusuna sahip olursunuz. Çok sayıda e-posta enmasyonu gönderen bir sisteminiz varsa bu özellik önemlidir. Sosyal bir ağ kurmak için ar_mailer kullandım - bu yüzden sağlamlığını kanıtlayabilirim.

Here's a good article that talks about ar_mailer in depth. Burada kendi çözümünüzü yuvarlama konusunda kuvvetli bir öneride bulunacağım. Eric bu problem için zamana karşı bir çözüm geliştirdi.

İlgili konular