'u kullanarak birden çok Kereviz görevini çalıştırın Ben, bazı ev yapımı kodları Celery ile değiştiriyorum, ancak geçerli davranışı çoğaltmada zor bir zaman geçiriyorum.Bir konu değişimi
- yeni bir kullanıcı oluşturarak, bir mesaj
user.created
yönlendirme anahtarlatasks
değişimi yayınlanmalıdır şu şekildedir: Benim olanı da budur. - İki Kereviz görevleri Bu mesajın, yani
send_user_activate_email
vecheck_spam
trigged edilmelidir.
Ben ignore_result=True
argümanı ile user_created
görevi tanımlayarak bu uygulamaya çalıştı artı send_user_activate_email
ve check_spam
için bir görev.
Yapılandırmamda aşağıdaki yolları ve sıra tanımlarını ekledim. İleti user_created
sırasına teslim edilirken, diğer iki sıraya teslim edilmez.
İdeal olarak, ileti yalnızca send_user_activate_email
ve check_spam
kuyruklarına teslim edilir. Vanilla RabbitMQ kullanıldığında, mesajlar sıraların bağlanabileceği bir exchange'e yayınlanır, ancak Kereviz doğrudan bir sıraya mesaj gönderir gibi görünür.
Kereviz'de yukarıda belirtilen davranışları nasıl uygularım?
sen tetiklemek için tek bir mesaj bekliyoruz gibi geliyorCELERY_QUEUES = {
'user_created': {'binding_key':'user.created', 'exchange': 'tasks', 'exchange_type': 'topic'},
'send_user_activate_email': {'binding_key':'user.created', 'exchange': 'tasks', 'exchange_type': 'topic'},
'check_spam': {'binding_key':'user.created', 'exchange': 'tasks', 'exchange_type': 'topic'},
}
CELERY_ROUTES = {
'user_created': {
'queue': 'user_created',
'routing_key': 'user.created',
'exchange': 'tasks',
'exchange_type': 'topic',
},
'send_user_activate_email': {
'queue': 'user_created',
'routing_key': 'user.created',
'exchange': 'tasks',
'exchange_type': 'topic',
},
'check_spam': {
'queue': 'user_created',
'routing_key': 'user.created',
'exchange': 'tasks',
'exchange_type': 'topic',
},
}
Ayrıntılı açıklamanız için teşekkür ederiz. Cevabınızdan ve belgelerinizden toplanan Kerecik, tek bir iletiye birden çok görev yanıtı vermek yerine, görevler arasında görev dağıtmak için routing_key'i kullanır. Bu, temel olarak, bir görevi tetikleyen ve görevi işleyen kodu sıkı bir şekilde birleştirmeye zorlar. Bu doğru mu? – joelcox
@joelcox, bence bu harika bir özet. Bu kuralın istisnaları, her bir öğe için bir sıradaki bir görevi yürüteceğine inandığım Map() ve Starmap() 'tır, ancak yalnızca tek bir ileti gönderir. Görevlerin birbirlerine yanıt vermesini istiyorsanız (devam etmek için metadata gerekecek şekilde bir başkasının başarılı olmasını beklemek gibi), ayrıca Chain(), Chord() 'a da bakabilirsiniz. –