2010-10-03 10 views
6

Aralıklı bir 3G (veya benzeri) bağlantı üzerinden "yüz" alanında birkaç yüz small systems yönetecek bir yazılım yazıyorum.Celery, birçok küçük ve dağıtık sistemle kullanım için uygun mu?

Ev tabanının sahadaki sistemlere iş göndermesi gerekir (örneğin, “durumunuzla ilgili rapor”, “yazılımınızı güncelleyin” vb.) Ve alandaki sistemlerin yeniden iş göndermeleri gerekir. Sunucu (örn. “bir hata tespit edildi”, “burada bazı veriler”, vb.).

Ben Celery bakarak biraz zaman geçirdim ve onu mükemmel bir uyum olması görünüyor: alanında sistemler için iş toplayabiliyorduk ana üs çalışan celeryd, bir celeryd için iş toplayabiliyorduk saha sistemleri üzerinde çalışan Sunucu ve bu işler istemciler kullanıma sunulduğunda değiştirilebilir.

Bu nedenle, Kereviz bu sorun için uygun mu? Özellikle: - bu bir sorun olacaktır

  • görevlerin çoğunluğu bireysel işçinin yönlendirilecektir (örneğin “‘system51’için‘get_status’işi göndermek”)?
  • Olumsuz ağ koşullarıyla (örneğin, bağlantılar ölüyor gibi) zarif bir şekilde mi çalışıyor?
  • Hangi işlevler yalnızca RabbitMQ arka uç olarak kullanılıyorsa kullanılabilir? (Alan sistemlerinde RabbitMQ kullanmamayı tercih ederim)
  • Celery, anlattığım gibi kullanırsam hayatımı zorlaştırabilecek başka bir neden var mı?

Teşekkürler!

(o Kereviz overkill önermek geçerli olacaktır, ama bu benim hayatı kolaylaştırmak olur başka nedenleri vardır, bu yüzden dikkate almak istiyorum) muhtemelen bir (Django) kuracak

cevap

12

görevlerin çoğunluğu bireysel işçiye yönlendirilecektir (örneğin “‘system51’için ‘get_status’işi göndermek”)?

Hiç de değil. Her çalışan için bir sıra oluşturun, ör.Her düğüm default denilen bir yuvarlak robin kuyruğuna dinler ve her düğüm düğüm ismiyle sonra kendi kuyruğunu seçti ki:

(a)$ celeryd -n a.example.com -Q default,a.example.com 
(b)$ celeryd -n b.example.com -Q default,b.example.com 
(c)$ celeryd -n c.example.com -Q default,c.example.com 

bir düğüme doğrudan bir görev Yönlendirme basittir:

$ get_status.apply_async(args, kwargs, queue="a.example.com") 

veya tarafından bir Router kullanarak yapılandırma:

# Always route "app.get_status" to "a.example.com" 
CELERY_ROUTES = {"app.get_status": {"queue": "a.example.com"}} 

incelikle olumsuz işler mu ağ koşulları (örneğin, bağlantı ölüsü gibi)?

İşçi, broker bağlantı hatalarından incelikle kurtarır. (RabbitMQ en azından ben tüm diğer backends hakkında emin değilim, ama bu test etmek ve yalnızca yapabilirsinizEND_SPAN istemci için bir liste ile ilgili istisnalar)

eklemeniz gerekir (düzeltmek kolaydır bağlantı aşağı ise görevi gönderme yeniden denemek veya RabbitMQ ile HA ayarlayabilirsiniz:? http://www.rabbitmq.com/pacemaker.html RabbitMQ bir arka uç olarak kullanılıyor eğer yalnızca hangi işlevler

(Daha doğrusu çalıştırmak istemediğiniz Saha sistemlerinde RabbitMQ )

Uzaktan kumanda komutları ve sadece "doğrudan" değişimleri desteklenir ("konu" veya "fanout" değil). Ancak bu, Kombu (http://github.com/ask/kombu)'da desteklenecektir.

RabbitMQ'yi kullanarak yeniden düşünürüm. Sence neden uygun değil? IMHO Böyle bir sistem için başka bir yere bakmayacağım, (sistem geçici ise ve mesajınızın kalıcılığını gerektirmiyorsa ZeroMQ hariç).

Tarif ettiğim gibi kullanırsam Kereser'in hayatımı zorlaştırabilmesinin başka bir sebebi var mı?

Yukarıda açıkladığınızdan hiçbir şey düşünemiyorum. Eşzamanlılık modeli çok işlemcili olduğundan bazı bellek gerektiriyor ( iş parçacığı havuzları ve olay havuzları için destek eklemeye çalışıyorum, bu da bazı durumlarda yardımcı olabilir).

o Kereviz overkill önermek geçerli olacaktır, ama orada diğer nedenler benim hayatı kolaylaştırmak olacağını, bu yüzden Bu durumda)

bunu dikkate istiyorum ben kelimeyi hafifçe kullandığınızı düşünün. Bu gerçekten ne kadar kod ve testler olmadan yazmanız gerektiğine dair 'a bağlıdır. Bence zaten mevcut bir genel çözümü geliştirmek için daha iyidir ve teorik olarak uygulama için iyi çalışması gerektiği gibi gibi geliyor.

+0

* Neden [RabbitMQ değil] iyi bir uyum olduğunu düşünüyorsunuz? * Çünkü benim Erlang + RabbitMQ foo'm zayıf ve alan sistemleri üzerinde + configure + oluşturmak için gereken bir şey daha olurdu. Zaten üzerinde Python + SQLite olacaktır. –

+0

* Ama bu Kombu'da desteklenecek (http://github.com/ask/kombu)* cool - Kombu'yu kontrol edeceğim. * Bu durumda overkill kelimesini hafifçe kullandığınızı düşünüyorum… * true - En çok StackOverflow üzerindeki en büyük evcil hayvan peronlarından biri olan “yanlış yapıyorsunuz, bunu başka bir şekilde yapmalısınız” cevabını ekledim. Harika, yardımlarınız için çok teşekkürler. –

+2

Size söz veriyorum, RabbitMQ'nun kurulumu ve bakımı gerçekten çok kolay. Yüklediğim ve unuttuğum bir şey. – asksol

1

istekleri kabul etmek için web servisi. Web servisi, istekleri doğrulama ve hatalı istekleri saptırma işini yapabilir. Sonra kereviz işi yapabilir.

Bu, uzak aygıtların işlerini yapıp yapmadıklarını görmek için web hizmetini yoklamasını gerektirir. Tam olarak ne yaptığınıza bağlı olarak bu uygun olabilir veya olmayabilir. bu bir sorun olacak -

+0

Bunu düşünürdüm, ancak mümkünse yoklamadan kaçınmayı tercih ederim; Bazı durumlarda yakın-gerçek zamanlı iletişimin olması çok güzel olurdu ve eğer 3D veri için KB tarafından ödeme yapıyorumsa yoklama pahalı olabilirdi. –