Bir işin Amazon Basit Kuyruk Hizmeti (SQS) kuyruğundan kaybolmasını önlemek, yeniden denemeden sonra, SQS kullanımının ve yeniden denemelerinin nasıl çalıştığının mekaniğini anlamayı, görünürlük zaman aşımı ayarları, hata işleme ve ölü harf kuyruğu konfigürasyonları için en iyi uygulamaların uygulanmasıyla birleştirilir. Bu açıklama, bir SQS kuyruğundaki işlerin görünürlüğünü, yanlışlıkla kaybetmeden geri çekilmeden korumak için gereken temel ilkeleri, yapılandırma tekniklerini ve kalıpları kapsar.
SQS mesajı yaşam döngüsü ve görünürlük zaman aşımını anlamak
Bir SQS kuyruğundan bir tüketici tarafından (AWS Lambda işlevi veya başka bir işleme hizmeti gibi) bir mesaj alındığında, mesaj hemen silinmez. Bunun yerine, görünürlük zaman aşımı olarak bilinen bir süre için diğer tüketiciler için görünmez hale gelir. Bir SQS kuyruğu için varsayılan görünürlük zaman aşımı 30 saniyedir, ancak en fazla 12 saate kadar yapılandırılabilir. Mesaj, görünürlük zaman aşımı süresi içinde tüketici tarafından silinmezse, tekrar görünür hale gelir ve başka bir tüketici veya aynı tüketici tarafından işlenmeye hazır hale gelir. Bu mekanizma, birden fazla tüketicinin aynı mesajı aynı anda işlemesini önler.
İşin kaybolmasını önlemek için, görünürlük zaman aşımını uygun şekilde yönetmek, işin aktif olarak işlenirken görünmez kalması, ancak iş başarısız olursa veya zaman aşımına izin vererek tekrar görünür hale gelmesi şarttır.
Yeniden işlemek için görünürlük zaman aşımını yönetme
Bir mesajın yeniden denetlendikten sonra kazara kuyruktan kaybolmamasını sağlamak için aşağıdaki yaklaşımları göz önünde bulundurun:
- Uygun görünürlük zaman aşımını ayarlayın: Görünürlük zaman aşımı süresini, mesajın en uzun beklenen işleme süresi için gereken süreyi eşleştirecek veya aşacak şekilde ayarlayın. İşleme görünürlük zaman aşımından daha uzun sürerse, mesaj tekrar ortaya çıkacak ve potansiyel yinelenen işleme veya erken çıkarılmaya neden olacaktır.
- Görünürlük zaman aşımını programlı olarak genişletin: Mesaj işleme beklenenden daha uzun sürerse, `ChangeMessageVisity` API'sını kullanarak işleme sırasında görünürlük zaman aşımını genişletin. Bu yaklaşım, özellikle işlem süresinin önceden belirlenemeyeceği uzun süredir devam eden görevler için kullanışlıdır. Bu, işlem devam ederken mesajın görünmez tutmak için tekrar tekrar yapılabilir.
- Yeniden Çekme Mantığı için Yaklaşık Müzik: SQS İzler Bir mesajın kaç kez alındığını ve `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` Bu sayım, belirli sayıda başarısız denemeden sonra, yeniden deneme veya mesajları ölü harf kuyruğuna taşıma arasındaki gecikmeleri artırmak gibi yeniden deneme mantığını uygulamak için kullanılabilir.
Hata İşleme ve Lambda ve SQ ile yeniden deneme
SQS AWS Lambda ile entegre edildiğinde, Lambda hizmeti kuyruktaki mesajları otomatik olarak yok eder ve işlevi çağırır. Lambda'nın yerleşik yeniden deneme mekanizması, otomatik yeniden denemeleri yönetmek için SQS'nin görünürlük zaman aşımıyla etkileşime girer:
- Bir lambda işlevi bir mesajı başarıyla işlerse, mesajı kuyruktan siler.
- Lambda işlevi mesajı işleyemezse (örneğin, bir istisna atar), mesaj silinmez ve görünürlük zaman aşımı süresi dolduktan sonra tekrar görünür hale gelir.
Yeniden deneme işlemini geliştirmek için:
- Lambda yürütme içinde yeniden deneyin: `` Madirlik '' (python) veya yerleşik yeniden deneme mantığı gibi yeniden deneme kütüphanelerini kullanarak Lambda işlevinin kendisinin yeniden deneme mantığını uygulayın. Bu, genel lambda çağırma bitmeden önce aynı parti içinde tek tek mesajları yeniden denemeye izin verir.
- Toplu işlemdeki kısmi arızaları işaretleyin: Lambda mesajların gruplarını işlediğinde, hangi mesajların başarısız olduğunu bildirebilir, böylece yalnızca bu mesajların yeniden tasarrufu yapılır ve tüm partiyi gereksiz yere yeniden denemekten kaçınır.
- Hibrit yaklaşım: Verimliliği en üst düzeye çıkarmak ve gereksiz arızaları azaltmak için Lambda Dahili Gerekalıkları SQS yeniden düzenlemeleriyle birleştirin.
Dead-Letter kuyruklarını kullanarak (DLQ'lar)
Bir mesaj tekrar tekrar işleyemediğinde (yapılandırılmış deneme sayısından sonra), mesaj kaybını önlemek için ölü harf kuyruğuna (DLQ) taşımak kritik öneme sahiptir:
- SQS'de DLQ'ları yapılandırın: DLQ, SQS'nin maksimum alma sayısını (işleme denemesi sayısı) aşan mesajları hareket ettirdiği ayrı bir kuyruktur.
- Bu, sorunlu mesajlara bunları kaybetmeden inceleme veya manuel müdahale sağlar.
- Birden fazla arızadan sonra mesajların kalıcı olarak kaybolmamasını veya kaybolmamasını sağlar.
Backroff ile Gelişmiş Yeniden Deneme Stratejileri
Basit bir yeniden deneme yaklaşımı, mesaj işlemeyi sabit aralıklarla yeniden kullanır, ancak bu, tekrarlanan derhal yeniden denemeler nedeniyle tıkanıklığa ve artan maliyete neden olabilir. Kaybolmayı önlemek ve retritleri optimize etmek için gelişmiş stratejiler şunları içerir:
- Üstel Backoff: Yeniden deneme sayımına dayanarak görünürlük zaman aşımını dinamik olarak manipüle ederek yapılabilen yeniden denemeler arasındaki gecikmeyi artırın.
- Özel yeniden deneme sayıları ve görünürlük zaman aşımları: Mesaj yeniden denetlemelerini (örneğin, DynamODB), özellikle `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` ''
- Mesaj görünürlüğünü dinamik olarak değiştirin: Yeniden görme zaman aşımını programlı olarak değiştirerek, yeniden deneme veya geri çekim mantığına göre, mesaj her arızadan daha uzun süre gizli kalır ve bekleme süreleri boyunca yeniden denemeleri azaltır.
Güvenilir yeniden deneme uygulamak için örnek yaklaşım
1. Mesajı kuyruktan alın.
2. Mesajı Lambda veya Tüketici Uygulaması içindeki dahili yeniden denemelerle işleyin.
3. Dahili yeniden denemeden sonra bile işlem başarısız olursa:
- Görünürlük zaman aşımını hesaplanan bir yedekleme süresine artırmak için `changeMessageVisibility 'kullanın.
- İsteğe bağlı olarak, özel karmaşık yeniden deneme stratejilerini uygulamak için harici bir veri deposundaki (Dynamodb gibi) yeniden deneme girişimlerini kaydedin.
4. Maksimum yeniden deneme sayısına ulaşıldıktan sonra, SQS mesajı DLQ'ya taşıyalım.
5. İşleme başarılı olursa, mesajı kuyruktan açıkça silin.
6. Başarısız mesajları manuel olarak işlemek için DLQ'larda izleme ve uyarılar kullanın.
Mesaj kaybını önlemek için hususlar
- Uygun silinme sağlayın: İşleme başarılı olduktan sonra yalnızca mesajları silin. Erken silme, mesajların kaybolmasına neden olur.
- Lambda zaman aşımını kullanın: Lambda yürütme bir mesajı silmeden önce zamanlar çıkarsa, mesaj tekrar görünür olur. Lambda zaman aşımı yapılandırması ile uyumlu görünürlük zaman aşımlarını tutun.
- IdemPotent İşleme: İleti işlemenin, aynı mesaj birden çok kez işlenmesi durumunda olumsuz etkilere neden olmayacak şekilde ileti işlemenin idempotent olduğundan emin olun.
- İzleme Mesajı Tutma Süresi: SQS, yeniden denetleme durumuna bakılmaksızın, işlenmemiş mesajların silindiği bir tutma süresi (varsayılan 4 gün, maksimum 14 gün) vardır.
- Görünürlük Zaman aşımı vs Gecikme Kuyrukları: Görünürlük zaman aşımı işleme sırasında uygulanırken, gecikme kuyrukları yeni mesajların ilk teslimatını erteleyin.
Mesajı uzun ömürlülüğü korumak için ek teknikler
- Daha ince taneli yeniden deneme kontrolü gerekiyorsa, mesaj gövdesi veya öznitelikler içinde manuel yeniden deneme sayaçlarını uygulayın.
- Arıza olaylarını otomatik olarak yakalamak için AWS lambda hedeflerini kullanın.
- Ölü harf kuyruklarını yalnızca başarısız işleme yapan mesajlar için değil, aynı zamanda sessiz kaybolmayı önlemek için manuel doğrulama için de kullanın.
- Kısmi arıza raporlama ile toplu işlem tasarımı, sadece başarısız mesajların tüm parti yerine geri yüklenmesi, işleme süresini tasarrufu ve işlenmemiş mesajları kaybetme şansını azaltması için tasarlayın.
- Yüksek arıza oranlarını veya mesaj terk edilmesini tespit etmek için AWS CloudWatch ile izleme ve uyarılar kullanın.