Dağıtılmış uygulamaların yapı taşları. Sıfır yaklaşım

Dağıtılmış uygulamaların yapı taşları. Sıfır yaklaşım

Dünya yerinde durmuyor. İlerleme yeni teknolojik zorluklar yaratır. Değişen ihtiyaçlara uygun olarak bilgi sistemleri mimarisinin de gelişmesi gerekmektedir. Bugün olay odaklı mimari, eşzamanlılık, eşzamanlılık, eşzamansızlık ve tüm bunlarla Erlang'da nasıl huzur içinde yaşayabileceğinizden bahsedeceğiz.

Giriş

Tasarlanan sistemin boyutuna ve gereksinimlerine bağlı olarak biz geliştiriciler, sistemdeki bilgi alışverişi yöntemini seçiyoruz. Çoğu durumda, hizmetlerin etkileşimini düzenlemek için, örneğin RabbitMQ veya kafka'ya dayalı bir komisyoncu ile bir şema çalışma seçeneği olabilir. Ama bazen olayların akışı, SLA ve sistem üzerindeki kontrol düzeyi öyle oluyor ki hazır mesajlaşmalar bize uygun olmuyor. Elbette taşıma katmanı ve küme oluşumunun sorumluluğunu üstlenerek, örneğin ZeroMQ veya nanomsg kullanarak sistemi biraz karmaşıklaştırabilirsiniz. Ancak sistem, standart bir Erlang kümesinin yeterli verimine ve yeteneklerine sahipse, o zaman ek bir varlık ekleme konusu, ayrıntılı bir çalışma ve ekonomik gerekçe gerektirir.

Reaktif dağıtılmış uygulamaların konusu oldukça geniştir. Yazının formatına uygun olarak bugünkü tartışmanın konusu yalnızca Erlang/İksir üzerine inşa edilen homojen ortamlar olacaktır. Erlang/OTP ekosistemi, reaktif bir mimariyi en az çabayla uygulamanıza olanak tanır. Ancak her durumda bir mesajlaşma katmanına ihtiyacımız olacak.

Teorik temel

Tasarım, hedeflerin ve kısıtlamaların tanımlanmasıyla başlar. Ana amaç, kalkınma adına kalkınma alanında olmak değildir. Temelinde çeşitli düzeylerde modern uygulamalar yaratabileceğimiz ve en önemlisi geliştirebileceğimiz güvenli ve ölçeklenebilir bir araç edinmemiz gerekiyor: küçük bir hedef kitleye hizmet veren tek sunuculu uygulamalardan başlayıp daha sonra 50'ye kadar kümeye dönüşebilen uygulamalar. -60 düğüm, küme federasyonlarıyla biter. Bu nedenle asıl amaç, nihai sistemin geliştirme ve sahip olma maliyetini azaltarak karı maksimuma çıkarmaktır.

Nihai sistem için 4 ana gereksinimi vurgulayalım:

  • Сolay odaklı.
    Sistem her zaman olay akışından geçmeye ve gerekli aksiyonları almaya hazırdır;
  • Мölçeklenebilirlik.
    Bireysel bloklar hem dikey hem de yatay olarak ölçeklendirilebilir. Sistemin tamamı sonsuz yatay büyüme kapasitesine sahip olmalıdır;
  • Оhata toleransı.
    Tüm düzeyler ve tüm hizmetler, arızalardan otomatik olarak kurtulabilmelidir;
  • Гgarantili yanıt süresi.
    Zaman değerlidir ve kullanıcıların çok uzun süre beklememesi gerekir.

"Yapabilen küçük motor" hakkındaki eski peri masalını hatırlıyor musunuz? Tasarlanan sistemin prototip aşamasından başarılı bir şekilde çıkabilmesi ve ilerici olabilmesi için temelinin minimum gereksinimleri karşılaması gerekir. SMOG.

Bir altyapı aracı ve tüm hizmetlerin temeli olarak mesajlaşmaya bir nokta daha ekleniyor: programcılar için kullanım kolaylığı.

Olay odaklı

Bir uygulamanın tek bir sunucudan kümeye büyümesi için mimarisinin gevşek bağlantıyı desteklemesi gerekir. Asenkron model bu gereksinimi karşılar. Burada gönderen ve alıcı, mesajın bilgi yüküne önem verir ve sistem içindeki iletim ve yönlendirme konusunda endişelenmezler.

ölçeklenebilirlik

Ölçeklenebilirlik ve sistem verimliliği yan yanadır. Uygulama bileşenleri mevcut tüm kaynakları kullanabilmelidir. Kapasiteyi ne kadar verimli kullanırsak ve işleme yöntemlerimiz ne kadar optimum olursa, ekipmana o kadar az para harcarız.

Erlang, tek bir makinede oldukça rekabetçi bir ortam yaratıyor. Eşzamanlılık ve paralellik arasındaki denge, Erlang VM'nin kullanabileceği işletim sistemi iş parçacıklarının sayısı ve bu iş parçacıklarını kullanan zamanlayıcıların sayısı seçilerek ayarlanabilir.
Erlang işlemleri durumu paylaşmaz ve engellemesiz modda çalışır. Bu, geleneksel engelleme tabanlı uygulamalara göre nispeten düşük gecikme süresi ve daha yüksek verim sağlar. Erlang'ın zamanlayıcısı, CPU ve IO'nun adil bir şekilde tahsis edilmesini sağlar ve engellemenin olmaması, uygulamanın en yoğun yükler veya arızalar sırasında bile yanıt vermesine olanak tanır.

Küme düzeyinde bertaraf sorunu da mevcuttur. Kümedeki tüm makinelerin eşit şekilde yüklenmesi ve ağın aşırı yüklenmemesi önemlidir. Bir durum hayal edelim: Kullanıcı trafiği gelen dengeleyicilere (haproxy, nginx, vb.) ulaşır, işleme isteklerini mevcut arka uç kümesi arasında mümkün olduğunca eşit bir şekilde dağıtırlar. Uygulama altyapısı içerisinde, gerekli arayüzü uygulayan hizmet yalnızca son aşamadır ve ilk talebe yanıt vermek için bir dizi başka hizmet talep etmesi gerekecektir. Dahili istekler ayrıca yönlendirme ve dengeleme gerektirir.
Veri akışlarını etkili bir şekilde yönetmek için mesajlaşma, geliştiricilere yönlendirme ve yük dengelemeyi yönetebilecek bir arayüz sağlamalıdır. Bu sayede geliştiriciler mikro hizmet modellerini (toplayıcı, proxy, zincir, şube vb.) kullanarak hem standart sorunları hem de nadiren ortaya çıkan sorunları çözebilecekler.

İş açısından bakıldığında ölçeklenebilirlik, risk yönetimi araçlarından biridir. Önemli olan, ekipmanı en iyi şekilde kullanarak müşteri isteklerini karşılamaktır:

  • İlerlemenin bir sonucu olarak ekipmanın gücü arttığında. Kusurlu yazılım nedeniyle boşta kalmayacak. Erlang dikey olarak iyi ölçeklenir ve her zaman tüm CPU çekirdeklerini ve kullanılabilir belleği kullanabilecektir;
  • Bulut ortamlarda mevcut veya tahmin edilen yüke göre ekipman miktarını yönetebiliyor ve SLA garantisi verebiliyoruz.

hata toleransı

İki aksiyomu ele alalım: "Başarısızlıklar kabul edilemez" ve "Başarısızlıklar her zaman olacaktır." Bir işletme için yazılım hatası, para kaybı ve daha da kötüsü itibar kaybı anlamına gelir. Olası kayıplar ile hataya dayanıklı yazılım geliştirmenin maliyeti arasında denge kurularak çoğu zaman bir uzlaşma bulunabilir.

Kısa vadede, hata toleransını içeren bir mimari, kullanıma hazır kümeleme çözümlerinin satın alınmasında tasarruf sağlar. Pahalıdırlar ve ayrıca hataları vardır.
Uzun vadede, hataya dayanıklı bir mimari, geliştirmenin tüm aşamalarında kendini defalarca amorti eder.
Kod tabanı içindeki mesajlaşma, geliştirme aşamasında sistem içindeki bileşenlerin etkileşimini ayrıntılı olarak hesaplamanıza olanak tanır. Bu, arızalara müdahale etme ve arızaları yönetme görevini basitleştirir, çünkü tüm kritik bileşenler arızalarla ilgilenir ve ortaya çıkan sistem, tasarım gereği bir arıza sonrasında otomatik olarak nasıl normale dönüleceğini bilir.

Cevaplanabilirlik

Başarısızlıklardan bağımsız olarak uygulamanın isteklere yanıt vermesi ve SLA'yı karşılaması gerekir. Gerçek şu ki insanlar beklemek istemiyor, dolayısıyla işletmelerin buna göre uyum sağlaması gerekiyor. Giderek daha fazla uygulamanın son derece duyarlı olması bekleniyor.
Duyarlı uygulamalar neredeyse gerçek zamanlı olarak çalışır. Erlang VM, yumuşak gerçek zamanlı modda çalışır. Hisse senedi ticareti, tıp ve endüstriyel ekipman kontrolü gibi bazı alanlar için gerçek zamanlı mod önemlidir.
Duyarlı sistemler kullanıcı deneyimini iyileştirir ve işletmeye fayda sağlar.

Ön özet

Bu makaleyi planlarken, bir mesajlaşma aracısı oluşturma ve buna dayalı karmaşık sistemler oluşturma deneyimimi paylaşmak istedim. Ancak teorik ve motivasyonel kısmın oldukça kapsamlı olduğu ortaya çıktı.
Yazının ikinci bölümünde değişim noktalarının uygulanmasındaki nüanslardan, mesajlaşma kalıplarından ve uygulamalarından bahsedeceğim.
Üçüncü bölümde hizmetlerin organizasyonu, yönlendirme ve dengeleme ile ilgili genel konuları ele alacağız. Sistemlerin ölçeklenebilirliğinin ve hata toleransının pratik yönünden bahsedelim.

İlk bölümün sonu.

Fotoğraf @lucabravo.

Kaynak: habr.com

Yorum ekle