2009-07-09 17 views
15

Genellikle bir programda veya bazı parametrelerle arka plan işlemi olarak çalıştırılması gereken bir kod var. Ortak unsur, gönderim işleminin dışında çalıştırılmaları, ancak Rails ortamına (ve muhtemelen iletilen parametrelere) erişmeleridir.Rails'de çalışan süreçleri düzenlemenin en iyi yolu nedir?

Bunu organize etmenin iyi bir yolu nedir ve neden? Belirli bir eklentiyi veya mücevheri kullanmayı seviyorsanız, neden uygun bulduğunuzu açıklayın - sadece kullandığınız bir eklentiyi listelemeyin.

cevap

5

Benim için, çok fazla ekstra altyapıyı korumak istememek önemli bir önceliktir, bu yüzden Rails dışında çalışan veritabanı destekli kuyrukları kullandım.

Benim durumumda, background_job ve delayed_job kullandım. background_job ile işçi cron ile çalıştırılmaya devam etti, bu nedenle bir yönetici yönetimi yoktu. delayed_job ile, Heroku kullanıyorum ve bunun için endişeleniyorum.

delayed_job ile arka plan çalışanınızın çalışması için çok sayıda argüman iletebilirsiniz.

Delayed::Job.enqueue(MyJob.new(param[:one], param[:two], param[:three]) 

ben cron üzerinden script/runner kullanarak bir yana, bir programa göre şeyler çalışan için iyi bir çözüm bulamadık (Ben daha kolay kod test etmek bulmaları nedeniyle bir Rake görevi üzerinde script/runner kullanmayı tercih).

Düzenli olarak planlanmış bir arka plan işlemine sahip olmak zorunda kalmadım. Bu nedenle, belirli bir Rails isteğine erişmek için çok fazla sorun yaşanmaması gerekiyordu.

Daha fazla özelliğe sahip başka, daha serin sistemler olduğunu biliyorum, ancak bu benim için iyi çalıştı ve yönetmek için çok sayıda yeni hizmet oluşturmamaya yardımcı olmam için bana yardımcı oluyor.

+0

Yehuda bu cevabı kabul ederken, diğer insanlar için en iyi olmak için en iyi olanı düşünmüyorum. Korkunç bir sysadmin olarak benim önceliklerim sysadmin görevlerini azaltmaktır :) Eğer daha fazla beceriniz varsa veya daha yüksek bir performans çözümüne ihtiyacınız varsa, her şeyden önce daha ezoterik kuyruk sistemlerinden birini deneyin. –

2

Talepleri alan ve ardından web hizmetlerini kullanarak birkaç dış sistemi arayacak bir sistemim var. Bu isteklerin bir kısmı bir kullanıcının beklemesi beklenebileceğinden daha uzun sürüyor ve bu istekleri işlemek için bir kurumsal kuyruk sistemi (activemq) kullanıyorum.

Bunu yapmak için ActiveMessaging eklentisini kullanıyorum. Bu, isteğinizi eşleştirip, istek verilerine erişim ile eşzamansız bir işlem için bir sıraya yerleştirmeme izin verir, ancak yanıtı beklemek istiyorsanız bir oylama hizmeti yazmanız gerekecektir.

Ryan Bates'in Starling and Workling numaralı tren garezini gördüm ve umut verici görünüyorlar ama kullanmadım.

0

Düzenli olarak planlanan görevler için yalnızca komisyon görevlerini kullanıyorum. Basit, kolay test edilmiş, kolayca anlaşılabilir ve Rails ortamı ile iyi entegre olur. Ardından, ihtiyaç duyduğunuz aralıkta bu komisyon görevlerini bir cron işi ile çalıştırmanız yeterlidir (bu işleri yönetmek için whenever kullanıyorum, çünkü biraz cron-okuma yazma bilmiyorum).

6

Asenkron işlerin çalıştırılması amacıyla bir veritabanına devam eden delayed_job ve background_job gibi mücevherleri gerçekten sevmiyorum. Sadece bana kirli görünüyor. Geçici şeyler bir veritabanına ait değil.

Büyük ölçeklenebilirlik gereksiniminiz olmadığında bile eşzamansız görevlerle uğraşmak için ileti kuyrukları hayranıyım. Gördüğüm gibi, mesaj kuyrukları karmaşık sistemler için ideal "lingua franca". Bir ileti kuyruğu ile, çoğu durumda, oluşturduğunuz şeyde yer alan teknolojiler veya dillerle ilgili hiçbir kısıtlama yoktur.Düşük eşzamanlılık mesaj kuyruğu kullanımının faydaları, entegrasyonun her zaman büyük bir acı olduğu bir “girişimci” ortamda muhtemelen en dikkat çekicidir. Ek olarak, eşzamansız iş akışınız birden çok adımı içerdiğinde mesaj sıraları idealdir. RabbitMQ benim kişisel favorim.

Örneğin, bir arama motoru oluşturmaya ediyoruz senaryoyu düşünün. İnsanlar dizine eklenecek URI'ları gönderebilir. Açıkçası, istekte bulunan sayfayı almak ve dizine eklemek istemezsiniz. Böylece bir ileti sırasının etrafında oluşturursunuz: Form gönderme hedefi, URI'yi alır, dizinlenecek mesaj sırasına atar. Bir sonraki kullanılabilir örümcek süreci sırayı URI'den çıkarır, sayfayı alır, tüm bağlantıları bulur, bilinmediklerinde her birini sıraya geri iter ve içeriği önbelleğe alır. Son olarak, önbelleğe alınan içerikle başa çıkmak için dizinleyici işlemi için ikinci bir sıraya yeni bir mesaj gönderilir. Dizinleyici işlemi, bu iletiyi sıradan çıkarır ve önbelleğe alınan içeriği dizinler. Elbette basitleştirilmiş - arama motorları çok iş, ama sen fikir edin.

Gerçek artalanlara gelince, açıkçası, kendi kütüphaneme (ChainGang) kısmi yapıyorum, fakat bu sadece Kernel.fork() etrafında bir kurgu. Bu size kurulum ve göz atma koduyla başa çıkmak için uygun bir yer sunuyor. Ayrıca henüz çok bitmedi. Daemon parçası, mesaj kuyruğundan çok daha az önemli.

Rails ortamı ile ilgili olarak, muhtemelen, bu, okuyucu için bir alıştırma olarak muhtemelen en iyisidir, çünkü bellek kullanımı uzun süreli süreçte önemli bir faktör olacak. Yapmak zorunda olmadığınız hiçbir şeyi yüklemek istemezsiniz. Bu arada, DataMapper'ın ActiveRecord'un poposunu kulağa doğru sürdüğü bir alan. Ortam başlatma iyi belgelenmiştir ve tüm kit ve caboodle'ı daha gerçekçi hale getiren çok daha az bağımlılık vardır.

Cron + komisyonu hakkında beğenmediğim tek şey, komisyonun standart çıktıya baskı yapmanın neredeyse garantisidir ve cron işleriniz çıktı aldığında cron aşırı derecede konuşkan olma eğilimindedir. Tüm cron görevlerimi uygun şekilde adlandırılmış bir dizine koymayı, sonra bunları saran bir komisyon görevi yapmayı, böylece bunları manuel olarak çalıştırmanın önemsiz olmasını seviyorum. Komisyonun bunu yapması utanç verici, çünkü bağımlılıklardan faydalanma seçeneğini tercih ederim. Her durumda, cronu cron ile çalıştırmak yerine doğrudan komut dosyalarına yönlendirirsiniz.

Şu anda yoğun asenkron işlemlere dayanan bir web uygulaması oluşturmanın tam ortasındayım ve şunu söylemeliyim ki, Rails'i kullanmayacağımı çok sevindim.

+0

Merak etme, ne kullanmaya karar verdiniz? En istekli olmak veya olağan bir uygulama daha anlamlı daha karmaşık olurdu daha ya mimarisine önemli ölçüde daha fazla zaman geçirmiş gibi –

+0

Sinatra, DataMapper, Xapian, RabbitMQ –

+0

geliyor. Düşünceler? –

İlgili konular