Eşzamansız arası iletişimi ele almak için en iyi uygulama?


10

Kısa bir süre önce kredi kartı işlemlerini yürütmek için bir proje tamamlandı. Karşılaştığım zorluklardan biri, bildirim mesajlarının gecikmesi / olası başarısızlığını ele almaktı. En karmaşık örnek şuydu:

  • ödeme talebini gönderen harici bir sistem
  • sistemim bu isteği ödeme ağ geçidine yönelik bir isteğe dönüştürüyor
  • kullanıcıyı ağ geçidine gönderme
  • kullanıcının ödeme yapmasını beklemek
  • kullanıcı sistemime geri dönüyor ancak sistem başarı / hata bildirimi alana kadar bekletiliyor
  • Arızaya bağlı olarak kullanıcıyı harici sisteme geri gönderme

Bildirimin gönderilmemesi durumunda ağ geçidinin bildirimi birkaç saat boyunca her 15 dakikada bir göndermeye çalışması daha zordu.

Bekleyen işlemlerin bir veritabanı kaydını kullanarak çözdüm ve daha sonra geri dönüşten başarı ve başarısızlığı ve bildirim ve işlem işleme için zamanlanmış bir gecikme dinleyicisini tespit ettim ...

Oldukça zor!

Ama bu daha önce milyarlarca kez çözülmüş olmalı, peki en iyi uygulama nedir?

Geleceğimin tüm bu sistemler arasındaki işlemleri yazacağını ve zaman gecikmelerini ve olası ağ hatalarını yönettiğini görebiliyorum, bu yüzden en iyi uygulamaları takip etmek istiyorum.

Kitap / makale önerileri harika olurdu.

Şimdiden teşekkürler!

Yanıtlar:


13

Dağıtılmış sistemler oluştururken, 'eşzamanlı' sistem ile 'eşzamansız' sistem arasındaki fark şudur: Eşzamanlı bir sistemin hesaplama ve mesaj teslim sürelerinde üst sınırları olduğu bilinmektedir. Yani: belirli olayların bilinen bu üst sınırlara sahip olmadığı bir asenkron sisteminiz var. Nasıl hallediyorsun?

  1. Bu eşzamansız işlemlerin olasılıkla üst sınırları varsa, sisteminizin kısmen eşzamanlı bir sistem gibi davranmasını sağlamak için zaman aşımlarını kullanabilirsiniz . Ödeme ağ geçidinin 98. persentil yanıt süresi 5 saniyeyse, 5 saniyelik bir zaman aşımı isteklerinizin% 98'ini başarılı kılacak ve diğer% 2'si başarısız olacaktır. Bu, bu işlemin başarılı veya başarısız olmasının ne kadar süreceği konusunda bilinen bir üst sınırınız olduğu anlamına gelir. Bu olasılıklı arıza tespiti , asenkron sistemleri senkron sistemlere dönüştürmek için kritik bir araçtır.

  2. Sistem arızası durumunda sistem durumunuzu kurtarabilmeniz için bu olayların kalıcı bir kaydını tutun . Ödeme ağ geçidi işleyiciniz bu olayları geçici bellekte tutuyorsa ve kilitleniyorsa, vidalanmış olursunuz.

  3. Her karmaşık işlem, esasen sistem içindeki mesajların (olayların) gönderilmesine ve alınmasına dayanan bir dizi durum dönüşümüdür. Görünüşe göre "beklemedeki işlemlerin kaydını" kullanarak bunu gayri resmi olarak modelleyiyorsunuz, ancak daha ileri gitmenizi öneririm: Yönetmeniz gereken her işlem için, onu tanımlayan resmi bir durum makinesi oluşturun ve mevcut durumunun kalıcı bir kaydını tutun . Bu durum makinelerinin anlaşılması kolay, test edilmesi kolay olduğunu ve hem sizin hem de kullanıcılarınız için bu işlemlere çok ihtiyaç duyulan görünürlük sağladığını göreceksiniz.

Sisteminiz ne kadar zaman uyumsuzsa, bu karmaşık durum dönüşümlerini yönetirken o kadar resmi ve açık olmanız gerekir. Zaman aşımları, dayanıklı olay günlüğü ve durum makineleri burada en iyi uygulamadır. Erlang OTP'nin bu nedenle uygulama davranışının çoğunu durum makinesi modeline dayandırmasının nedeni budur.

Referans olarak, Güvenilir ve Güvenli Dağıtılmış Programlamaya Giriş'ten daha iyi bir şey bulamadım . Hem ilk hem de eşzamansız sistemleri ilk prensiplerden anlamanız için güçlü bir algoritmik temel sağlayacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.