2015-06-19 13 views
6

Azure WebJobs hakkında internet üzerinde bilgi ton okuduktan sonra dokümantasyon iş "e-posta göndererek", bloglar böyle "bir müşteri şarj" olarak eylemleri yapmak WebJobs kullanmak demek, diğer taraftan, İdempotent gerektiğini söylüyor .Sürekli Azure Web Jobs ne kadar iddialı ve e-posta gönderebilir?

This documentation bir sıra ile birden çok örneği üzerinde sürekli bir WebJob çalışan birden fazla kez çağrıldığını yol açacağını söylüyor. İnsanlar, müşterilerini iki kez şarj edebilecekleri veya iki kez e-posta gönderebilecekleri gerçeğini görmezden geliyor mu?

nasıl ölçekli bir web uygulaması üzerinde bir kuyruğa sahip bir WebJob çalıştırabilirsiniz emin olabilmesi ve mesajlar sadece bir kez işlenir?

cevap

1

Ben bir veritabanı, bir satır kilidi ve TransactionScope nesne ile bir güncelleştirme sorgusu kullanarak bunu. Sipariş tablosunda

, kendi WebJob içinde alıyor eylemin durumunu yönetmek için bir sütun oluşturun. ör. EmailSent.

QueueTrigger işlevinde bir işlem başlatılır, ardından ROWLOCK ile müşteri siparişinde bir UPDATE sorgusu yürütülür. Bu, EmailSent = 1 değerini WHERE EmailSent = 0 ile ayarlar. Eğer SqlCommand = 0 dönüş değeri ise, fonksiyondan çıkar. Başka bir WebJob e-postayı zaten gönderdi. Aksi takdirde, e-postayı gönderin ve başarıyla gönderilirse TransactionScope nesnesindeki Complete() öğesini çağırın. İstediğiniz Idempotency sağlamalıdır

.

Bu yardımcı olur umarım.

+1

Bunu son çözümüm olarak düşündüm. Ancak, başarısızlıklar nasıl yönetiliyor? Sunucudan biri hata olmadan tamamlanırsa ve e-posta gönderilmezse, diğer sunucu tamamlanmaz ve hata oluşur, arıza burada nasıl yönetilir? Tekrar tetikleyecek mi? Zehire git? ya da hatayı tamamen yoksaymak? Bunun Microsoft'un yarı bit özelliği olduğunu hissediyorum. Kilit SDK seviyesinde uygulanmalıdır. – jsgoupil

+0

Bu eski bir soru olduğunu biliyorum ama ek olarak bu tabloya bir zaman damgası ekleyebilir, böylece bu zaman damgası X dakikadan daha eskiyse, başarısız olduğunu varsayın ve bir sonraki iletinin işlenmesine izin vermek için temizleyin. o. Bunun SDK'da tam olarak uygulanmadığı konusunda haklısınız, ancak bu, her durum farklı olduğu için SDK'nın başa çıkabileceği bir şey değildir. Yani, bir SQL Server veritabanınız yoksa ne olur? Belli ki farklı bir çözümün olmalı. Ve SDK, kapsamın ne kadar iddialı olduğunu biliyor? Yine, bu duruma göre değişir. – Jaxidian