Yazılım Mimarisi ve Sistem Tasarımı: Büyük Resim ve Kaynak Kılavuzu

Merhaba meslektaşları.

Bugün, modern yazılım sistemleri tasarlamanın ilkelerini nispeten küçük bir ciltte özetlemeyi üstlenen Tuğberk Uğurlu'nun bir makalesinin çevirisini incelemelerinize sunuyoruz. Yazar kendisi hakkında özetle şunları söylüyor:

Yazılım Mimarisi ve Sistem Tasarımı: Büyük Resim ve Kaynak Kılavuzu
2019 yılı itibariyle mimari desenler + tasarım desenleri gibi devasa bir konuyu bir habro makalesinde ele almak kesinlikle imkansız olduğundan, yalnızca Sayın Uruglu'nun metnini değil, aynı zamanda nezaketle dahil ettiği sayısız bağlantıyı da öneriyoruz. Eğer beğenirseniz, dağıtılmış sistemlerin tasarımı hakkında daha ileri düzeyde uzmanlaşmış bir metin yayınlayacağız.

Yazılım Mimarisi ve Sistem Tasarımı: Büyük Resim ve Kaynak Kılavuzu

Fotoğraf Isaac Smith Unsplash'tan

Sıfırdan bir yazılım sistemi tasarlamak gibi zorluklarla hiç karşılaşmadıysanız, o zaman böyle bir işe başladığınızda bazen nereden başlayacağınız bile belli olmaz. Tam olarak ne tasarlayacağınıza dair az çok emin bir fikre sahip olmak için önce sınırları çizmeniz, sonra kolları sıvayıp o sınırlar içinde çalışmanız gerektiğine inanıyorum. Başlangıç ​​noktası olarak bir ürün veya hizmeti (ideal olarak gerçekten beğendiğiniz bir ürünü) alıp onu nasıl uygulayacağınızı öğrenebilirsiniz. Bu ürünün ne kadar basit göründüğüne ve aslında ne kadar karmaşıklık içerdiğine şaşıracaksınız. Unutma: basit - genellikle karmaşıkve bu sorun değil.

Sanırım bir sistem tasarlamaya başlayan herkese verebileceğim en iyi tavsiye şudur: Herhangi bir varsayımda bulunmayın! En başından itibaren bu sistem hakkında bilinen gerçekleri ve sistemle ilgili beklentileri belirtmeniz gerekiyor. Tasarımınıza başlamanıza yardımcı olacak bazı iyi sorular şunlardır:

  • Çözmeye çalıştığımız sorun nedir?
  • Sistemimizle etkileşime girecek en yüksek kullanıcı sayısı nedir?
  • Hangi veri yazma ve okuma kalıplarını kullanacağız?
  • Beklenen başarısızlık durumları nelerdir, bunlarla nasıl başa çıkacağız?
  • Sistem tutarlılığı ve kullanılabilirliğine ilişkin beklentiler nelerdir?
  • Çalışırken harici doğrulama ve düzenlemeyle ilgili gereksinimleri dikkate almanız gerekiyor mu?
  • Ne tür hassas verileri saklayacağız?

Bunlar hem bana, hem de profesyonel faaliyet yıllarım boyunca katıldığım ekiplere faydalı olan sorulardan sadece birkaçı. Bu soruların (ve çalışmanız gereken bağlamla ilgili diğer soruların) yanıtlarını biliyorsanız, o zaman yavaş yavaş sorunun teknik ayrıntılarına inebilirsiniz.

Başlangıç ​​seviyesini ayarlayın

Burada “taban çizgisi” ile neyi kastediyorum? Aslında günümüzde yazılım sektöründeki sorunların çoğu, mevcut yöntem ve teknolojiler kullanılarak “çözülebilmektedir”. Buna göre, bu manzarayı seyrederek, sizden önce başka birinin çözmesi gereken sorunlarla karşılaştığınızda belli bir avantaj elde edersiniz. Programların iş ve kullanıcı sorunlarını çözmek için yazıldığını unutmayın, bu nedenle sorunu en basit ve basit (kullanıcının bakış açısından) şekilde çözmeye çalışıyoruz. Bunu hatırlamak neden önemlidir? Belki koordinat sisteminizde her soruna özgün çözümler aramayı seviyorsunuz, çünkü “Her yerde kalıpları takip edersem nasıl bir programcıyım?” diye düşünüyorsunuz? Aslında, buradaki sanat nerede ve ne yapılacağına karar vermektir. Elbette her birimiz zaman zaman kendine özgü sorunlarla uğraşmak zorunda kalıyoruz ve bunların her biri gerçekten zorlu. Bununla birlikte, başlangıç ​​seviyemiz açıkça tanımlanmışsa, enerjimizi neye harcayacağımızı biliriz: önümüzdeki sorunu çözmek için hazır seçenekler aramak veya onu daha fazla inceleyerek daha derin bir anlayış kazanmak.

Sanırım sizi, eğer bir uzman bazı harika yazılım sistemlerinin mimari bileşeninin ne olduğunu kendinden emin bir şekilde anlarsa, o zaman bu bilginin bir mimarın sanatında ustalaşmak ve bu alanda sağlam bir temel geliştirmek için vazgeçilmez olacağına sizi ikna edebildim.

Tamam, peki nereden başlamalı? sen Donna Martina GitHub'da adında bir depo var sistem-tasarım-primeriBüyük ölçekli sistemlerin nasıl tasarlanacağını öğrenebileceğiniz ve bu konuyla ilgili röportajlara hazırlanabileceğiniz. Depoda örneklerin yer aldığı bir bölüm var gerçek mimarilerözellikle sistemlerinin tasarımına nasıl yaklaştıklarının dikkate alındığı durumlarda bazı tanınmış şirketlerörneğin Twitter, Uber vb.

Ancak bu malzemeye geçmeden önce pratikte karşılaştığımız en önemli mimari zorluklara daha yakından bakalım. Bu önemlidir, çünkü inatçı ve çok yönlü bir sorunun BİRÇOK yönünü belirtmeniz ve ardından onu belirli bir sistemde yürürlükte olan düzenlemeler çerçevesinde çözmeniz gerekir. Jackson Gabbardeski bir Facebook çalışanı şunları yazdı: Sistem tasarımı röportajları hakkında 50 dakikalık videoYüzlerce başvuru sahibini tarama konusundaki kendi deneyimini paylaştı. Video ağırlıklı olarak büyük sistem tasarımına ve böyle bir pozisyon için aday ararken önemli olan başarı kriterlerine odaklansa da, sistemleri tasarlarken en önemli şeylerin ne olduğu konusunda kapsamlı bir kaynak olarak hizmet vermeye devam edecektir. ben de öneririm özet bu video.

Veri depolama ve alma hakkında bilgi edinin

Genellikle verilerinizi uzun vadede nasıl saklayacağınıza ve alacağınıza ilişkin kararınızın sistem performansı üzerinde kritik bir etkisi vardır. Bu nedenle öncelikle sisteminizin beklenen yazma ve okuma özelliklerini anlamalısınız. Daha sonra bu göstergeleri değerlendirebilmeniz ve yapılan değerlendirmelere göre seçimler yapabilmeniz gerekiyor. Ancak, yalnızca mevcut veri depolama modellerini anlarsanız bu çalışmanın üstesinden etkili bir şekilde gelebilirsiniz. Prensip olarak bu, aşağıdakilerle ilgili sağlam bilgi anlamına gelir: veritabanı seçimi.

Veritabanları son derece ölçeklenebilir ve dayanıklı veri yapıları olarak düşünülebilir. Bu nedenle, belirli bir veritabanını seçerken veri yapıları bilgisi sizin için çok faydalı olmalıdır. Örneğin, Redis çeşitli değer türlerini destekleyen bir veri yapısı sunucusudur. Listeler ve kümeler gibi veri yapılarıyla çalışmanıza ve iyi bilinen algoritmaları kullanarak verileri okumanıza olanak tanır; LRU, bu tür çalışmaları dayanıklı ve oldukça erişilebilir bir tarzda organize etmek.

Yazılım Mimarisi ve Sistem Tasarımı: Büyük Resim ve Kaynak Kılavuzu

Fotoğraf samuel zeller Unsplash'tan

Çeşitli veri depolama modellerini yeterince anladıktan sonra veri tutarlılığı ve kullanılabilirliği çalışmalarına geçin. Her şeyden önce şunu anlamalısın CAP teoremi en azından genel anlamda ve daha sonra yerleşik kalıplara daha yakından bakarak bu bilgiyi cilalayın. tutarlılık и kullanılabilirlik. Bu şekilde, alana ilişkin bir anlayış geliştirecek ve veri okuma ve yazmanın aslında her birinin kendine özgü zorlukları olan çok farklı iki sorun olduğunu anlayacaksınız. Birkaç tutarlılık ve kullanılabilirlik modeliyle donanmış olarak, uygulamalarınıza sorunsuz veri akışı sağlarken sistem performansını önemli ölçüde artırabilirsiniz.

Son olarak, veri depolama sorunları hakkındaki konuşmayı bitirirken, önbelleğe alma konusuna da değinmeliyiz. İstemci ve sunucuda aynı anda mı çalışmalı? Önbelleğinizde hangi veriler olacak? Ve neden? Önbellek geçersiz kılmayı nasıl düzenlersiniz? Düzenli olarak, belirli aralıklarla mı yapılacak? Eğer öyleyse ne sıklıkta? Bu konuları çalışmaya başlamanızı öneririm sonraki bölüm yukarıda belirtilen sistem tasarımı astarı.

İletişim Kalıpları

Sistemler çeşitli bileşenlerden oluşur; bunlar aynı fiziksel düğümde çalışan farklı işlemler veya ağınızın farklı bölümlerinde çalışan farklı makineler olabilir. Ağınızdaki bu kaynaklardan bazıları özel olabilir, ancak diğerleri halka açık olmalı ve bunlara dışarıdan erişen tüketicilere açık olmalıdır.

Bu kaynakların birbirleriyle iletişiminin yanı sıra tüm sistem ile dış dünya arasındaki bilgi alışverişinin de sağlanması gerekmektedir. Sistem tasarımı bağlamında yine bir dizi yeni ve benzersiz zorlukla karşı karşıyayız. Bakalım nasıl faydalı olabilecekler eşzamansız görev akışlarıve ne pÇeşitli iletişim kalıpları mevcuttur.

Yazılım Mimarisi ve Sistem Tasarımı: Büyük Resim ve Kaynak Kılavuzu

Fotoğraf Tony Stoddard Unsplash'tan

Dış dünyayla iletişimi düzenlerken her zaman çok önemlidir. güvenlikhükmünün de ciddiye alınması ve aktif olarak takip edilmesi gerekmektedir.

Bağlantı dağıtımı

Bu konuyu ayrı bir bölüme koymanın herkese haklı görüneceğinden emin değilim. Yine de bu kavramı burada ayrıntılı olarak sunacağım ve bu bölümdeki materyalin en doğru şekilde “bağlantı dağıtımı” terimiyle tanımlanacağına inanıyorum.

Sistemler, birçok bileşenin doğru şekilde bağlanmasıyla oluşturulur ve birbirleriyle olan iletişimleri genellikle TCP ve UDP gibi yerleşik protokoller temelinde düzenlenir. Ancak bu protokoller, genellikle yüksek yük altında çalıştırılan ve aynı zamanda kullanıcı ihtiyaçlarına büyük ölçüde bağımlı olan modern sistemlerin tüm ihtiyaçlarını karşılamakta genellikle yetersiz kalmaktadır. Sistemdeki bu kadar yüksek yüklerle başa çıkabilmek için genellikle bağlantıları dağıtmanın yollarını bulmak gerekir.

Bu dağıtım iyi bilinenlere dayanmaktadır. Alan Adı Sistemi (DNS). Böyle bir sistem, yükün dağıtılmasına yardımcı olmak için ağırlıklı çevrimsel ve gecikmeye dayalı yöntemler gibi alan adı dönüşümlerine izin verir.

Yük dengeleme temel olarak önemlidir ve bugün uğraştığımız hemen hemen her büyük İnternet sistemi bir veya daha fazla yük dengeleyicinin arkasında yer almaktadır. Yük dengeleyiciler, istemci isteklerinin birden fazla kullanılabilir örnek arasında dağıtılmasına yardımcı olur. Yük dengeleyiciler hem donanım hem de yazılım olarak gelir, ancak pratikte daha çok yazılımla uğraşmak zorunda kalırsınız, örneğin HAProxy и ELB. Ters proxy'ler birinci ve ikinci arasında bir aralık olmasına rağmen kavramsal olarak yük dengeleyicilere çok benzer belirgin farklılıklar. İhtiyaçlarınıza göre bir sistem tasarlanırken bu farklılıklar dikkate alınmalıdır.

Şunu da bilmelisiniz içerik dağıtım ağları (CDN). CDN, coğrafi olarak belirli bir kullanıcıya daha yakın konumdaki düğümlerden bilgi sağlayan küresel olarak dağıtılmış bir proxy sunucu ağıdır. JavaScript, CSS ve HTML ile yazılmış statik dosyalarla çalışıyorsanız CDN'lerin kullanılması tercih edilir. Ayrıca günümüzde trafik yöneticileri sağlayan bulut hizmetleri de yaygındır; örneğin, Azure Trafik Yöneticisidinamik içerikle çalışırken size küresel dağıtım ve azaltılmış gecikme olanağı sağlar. Ancak bu tür hizmetler genellikle durum bilgisi olmayan web hizmetleriyle çalışmak zorunda olduğunuz durumlarda kullanışlıdır.

İş mantığından bahsedelim. İş mantığını, görev akışlarını ve bileşenlerin yapılandırılması

Böylece sistemin çeşitli altyapısal yönlerini tartışmayı başardık. Büyük olasılıkla, kullanıcı sisteminizin tüm bu unsurlarını düşünmüyor bile ve açıkçası onları hiç umursamıyor. Kullanıcı, sisteminizle etkileşim kurmanın nasıl bir şey olduğu, bunu yaparak neler başarılabileceği ve ayrıca sistemin kullanıcı komutlarını nasıl yürüttüğü, kullanıcı verileriyle ne ve nasıl yaptığı ile ilgilenir.

Bu yazının başlığından da anlaşılabileceği gibi yazılım mimarisi ve sistem tasarımından bahsedecektim. Bu nedenle yazılım bileşenlerinin nasıl oluşturulduğunu açıklayan yazılım tasarım modellerine değinmeyi planlamadım. Ancak, üzerinde düşündükçe, yazılım tasarım kalıpları ile mimari kalıplar arasındaki çizginin çok bulanık olduğu ve bu iki kavramın birbiriyle yakından ilişkili olduğu bana daha çok geliyor. Örneğin ele alalım Etkinlik Kaydı (olay kaynağı). Bu mimari modeli bir kez benimsediğinizde, sisteminizin neredeyse her yönünü etkileyecektir: verilerin uzun vadeli depolanması, sisteminizde benimsenen tutarlılık düzeyi, içindeki bileşenlerin şekli vb. Bu nedenle iş mantığıyla doğrudan alakalı bazı mimari kalıplardan bahsetmeye karar verdim. Her ne kadar bu makale kendisini basit bir listeyle sınırlamak zorunda olsa da, onu tanımanızı ve bu kalıplarla ilgili fikirler üzerinde düşünmenizi tavsiye ederim. İşte buradasın:

İşbirlikçi yaklaşımlar

Kendinizi bir projede sistem tasarım sürecinden tek sorumlu katılımcı olarak bulmanız son derece düşük bir ihtimal. Tam tersine, büyük olasılıkla hem görevinizin içinde hem de dışında çalışan meslektaşlarınızla etkileşimde bulunmak zorunda kalacaksınız. Bu durumda, seçilen teknoloji çözümlerini meslektaşlarınızla değerlendirmeniz, iş ihtiyaçlarını belirlemeniz ve görevleri en iyi şekilde nasıl paralel hale getirebileceğinizi anlamanız gerekebilir.

Yazılım Mimarisi ve Sistem Tasarımı: Büyük Resim ve Kaynak Kılavuzu

Fotoğraf kaleidico Unsplash'tan

İlk adım, ulaşmaya çalıştığınız iş hedefinin ne olduğu ve hangi hareketli parçalarla uğraşmanız gerektiği konusunda doğru ve ortak bir anlayış geliştirmektir. Grup modelleme teknikleri, özellikle fırtına olayları (olay fırtınası) bu süreci önemli ölçüde hızlandırmaya ve başarı şansınızı artırmaya yardımcı olur. Bu çalışma, taslak oluşturmadan önce veya sonra yapılabilir. hizmetlerinizin sınırlarıve ürün olgunlaştıkça derinleştirin. Burada elde edilecek tutarlılık düzeyine bağlı olarak şunları da formüle edebilirsiniz: ortak dil çalıştığınız sınırlı bağlam için. Sisteminizin mimarisi hakkında konuşmanız gerektiğinde faydalı bulabilirsiniz modeli C4, önerilen Simon Brownözellikle de sorunun ayrıntılarına ne kadar inmeniz gerektiğini, iletmek istediğiniz şeyleri görselleştirmeniz gerektiğini anlamanız gerektiğinde.

Muhtemelen bu konuda Etki Alanına Dayalı Tasarımdan daha az kullanışlı olmayan başka bir olgun teknoloji daha vardır. Ancak bir şekilde konu alanını anlamaya dönüyoruz, dolayısıyla alandaki bilgi ve deneyim Etki Alanı Odaklı Tasarım işinize yaramalı.

Kaynak: habr.com

Yorum ekle