Bir uygulamayı ölçeklendirilebilir yapan nedir?


37

İş ilanlarında, başvuru sahibinin "ölçeklendirilebilir" başvuru yazma tecrübesi olması gerektiğini görmeye devam ediyorum. Bir uygulamayı ölçeklendirilebilir yapan şey nedir ve kodumun milyonlarca kullanıcıya ölçeklenebileceğini nasıl bilebilirim?


Bu soruyu daha iyi ifade etmenin bir yolu olduğunu düşünüyorum: Kodumu ölçeklenebilirlikle nasıl yazabilirim? Böylece, kod daha sonradan olduğu gibi, başlangıçtan itibaren ölçeklenebilir. Bazı tasarım metodolojileri var mı? Yoksa iş için doğru algoritmaları seçmek meselesi mi?

Yanıtlar:


24

İki ölçeklenebilirlik yönü vardır:

  • dikey (aka yukarı ölçeklendirme): daha hızlı CPU, daha fazla RAM, daha fazla disk alanı;
  • Yatay (aka ölçeklendirme): CPU'da daha fazla çekirdek, daha fazla CPU, daha fazla sunucu;

İlki, herhangi bir keyfi sınırlamanızın bulunmamasına dikkat etmek zorundasınız. Bunlar ya çok küçük tamsayılı boyutlardan ya da sabit / sınırlı uzunluklu yapılardan kaynaklanmaktadır. Bu yapılar altta yatan işletim sistemleriyle ilişkili olabilir. Örneğin, daha fazla iş parçacığı veya işlem kullanarak ölçeklendirmeye çalışırsanız, bir noktada işletim sistemi sınırlarına ulaşacaksınız. Bu nedenle şu anda sunucular yüksek ölçeklenebilirlik için inşa edilmiştir ve zaman uyumsuz olaylara dayalı eşzamanlılık yapmaktadır. Bu sorun ünlü C10K belgesinde açıklanmıştır .

İkincisi daha zor. Akılda iki şey ile programlama gerektirir: veri paralel olarak işlenecek ve veri fiziksel olarak dağıtılmış olabilir. Düğümler arasındaki iletişim sınırlı olmalıdır. Pratikte bu genellikle ACID'nin bazı kısımlarının feda edilmesi anlamına gelir (aynı anda tam ACID'ye sahip olamayacağınız ve ölçeklendirme kabiliyetiniz olmadığı kanıtlanmıştır). Bu paradigmada veri depolama için en bilinen çözüm NoSQL çözümleridir. Çok basit anahtar-değer mağazalarından, RDBMS benzeri sistemlere, sadece birleşme yapma kabiliyetine sahipler. Anahtar-değer depolar ultra ölçeklenebilir, ama bu bir bedeli olarak gelir. Temelde yalnızca birincil anahtarda sorgulayabilirsiniz. Ancak bunun çözümü var, harita azalması.. Kümülatif karmaşıklık bakış açısına bakarsanız çok yetersiz görünebilir, ancak akılda tutmanız gerekir, bunun büyük ölçüde paralel çalıştığını aklınızda bulundurun.

Gerçek hayattan örneklerle ölçeklenebilirlik hakkında daha fazla okumak istiyorsanız, HighScalability.com bloguna bakın .


Ölçeği belirtmek için +1. Daha fazla kaynak eklemek karar vericilere çok hızlı ve çekici gelir (bazı hex-core satın alın ve belleği ikiye katlayın!). Ancak uygulama üzerlerine baskı uygulayamıyorsa, daha büyük bir probleminiz var.
jqa

14

Ölçeklenebilirlik, bazı değişkenlere bağlı olarak verimlilik cinsinden ölçülür. Örneğin, X kullanıcılı istek / saniye sayısı . Ölçeklenebilirliği tanımlamanın en basit yolu şudur:

Yük arttıkça bir verimlilik ölçüsü .

Ölçeklenebilirlik için tasarım yaparken anlamanız gereken ilk şey, uygulamanız için hangi ölçümün en önemli olduğu? Ölçeklenebilirliğin kilit bir bileşeni olan verimliliği ölçmenin birkaç yolu vardır :

  • Saniyede eşzamanlı istek
  • İstek başına ortalama yanıt süresi
  • Saniyede / dakikada işlenen kayıt sayısı

Kullanılabilecek daha fazla verimlilik ölçümü vardır, ancak bunlar web tabanlı sistemler veya toplu işleme sistemleri için ortaktır.

Ölçeklenebilirliğin bir sonraki yönü, yük arttıkça verimliliğinize ne olduğunu ölçmektir. Yükün artmasının yaygın yolları:

  • Sunucuya isabet eden daha fazla kullanıcı (yani daha fazla web trafiği)
  • Veritabanında daha fazla veri (yani sorgular daha uzun sürer veya işlemler daha uzun sürer)
  • RAID'deki sabit sürücü arızası (depolama performansı / güvenilirliği etkilenir)
  • Ağ doygunluğu

Ölçeklenebilir bir uygulamanın amacı, yükleme problemiyle uğraşırken verimi korumak veya arttırmaktır. Kısacası, yanıt süresi çok uzun sürüyorsa, yükü eşit bir şekilde dağıtmak için başka bir sunucu ekleyebilir miyiz? Bu yaklaşım, bir sunucunun yapması gereken iş miktarını azaltır ve sunucuların verimlilik için bu "tatlı noktada" çalışmasını sağlar.

Uygulamanızın ölçeklendirmek için özel olarak tasarlanması gerekir. Bu, uygulamanın ölçeklenebilme yeteneğini sınırlayan darboğazları azaltarak oturum verilerine, istekleri doğru sunucuya yönlendirme konusunda dikkatli olmanız gerektiği anlamına gelir.


5

Temel olarak, kullanıcı sayısını artırdığınızda ve / veya daha büyük bir veri kümesini işlerken performans darboğazlarından kaçınmak ve / veya arayüzünüzü daha fazla dilde vb.

Temel olarak veritabanı şemasına, algoritmalarınıza ve yazılım geliştirme sürecinize bir göz atın ve gelecekteki sorunları tahmin etmeye çalışın. Ayrıca, kurulmaya başladıklarında sorunları tanımlamak için performans izlemeyi de kurmak istersiniz.

Ölçeklenebilir Web Siteleri Oluşturma'yı (amazon bağlantısı) okuduğumda bu ipuçlarını aldım .

Bu yardımcı olur umarım!


3

Uygulamaların gerçekten ölçeklendirilebilmesinin tek yolu, geçirilemeyecek herhangi bir kısıtlamanın olmamasıdır (ya da yalnızca çok pahalı).

Tipik bir örnek, mevcut cpu çevrimleriniz bittiğinde ne olur? Programınız çoklu işlem görmüşse, birden fazla çekirdeği olan bir kutuda çalıştırabilirsiniz, ancak artık daha büyük bir kutu satın alamazsanız ne olur? Uygulamanız artık büyüyemiyor ve bu nedenle ölçeklenebilir değil.

Gerçekten ölçeklenebilir herhangi bir uygulama, birden fazla bilgisayara şeffaf biçimde yayılabilir ve fark edilebilir herhangi bir çarpma olmadan bunu yapabilir. Bu kolay değil ve Google’ın bu kadar başarılı olmasının sebeplerinden biri.


1

Büyük ölçekli uygulamaları desteklemenin kendine has sorunları var. İş ilanı, o ortamda çalışmış ve bu tür sorunları çözmek zorunda kalan adayları arıyor.

Yüksek düzeyde bir uygulamadan, bu kod parçasının çok küçük bir sürede binlerce kez çalıştırılması istenirse ne olacağını sormak suretiyle sürekli olarak soru sorulabilir. Bu, bellek ayak izlerinizi yönetmek, toplamları ve verileri önbelleğe almak, kendileri ölçeklenebilir veri kaynaklarını kullanmak, vb. Anlamına gelir.


1

DB'de arama yapmak için 100 satır ve her seferinde 10 kullanıcı olduğunda iyi performans gösteren bir arama özelliği oluşturuyorsanız. 100 kullanıcı aynı anda kullandığında ne kadar iyi performans gösterdi ve bakacak 100K satır var.

Ne olursa olsun aynı şeyi yaparsa, o zaman çok iyi. eğer kullanıcı / veri miktarıyla orantılı olarak çalışırsa (işlemek için 10 kat daha fazla == 10 kat daha uzun) bu iyi. Çok daha düşük verilere sahipse (10x mod verisi == 10x ^ 10 daha uzun), o zaman iyi ölçeklenemez.

Örneklerim gerçekten Büyük O notalarında gösterilmeli ancak şu anda Büyük O'daki örnekleri yazmanın yeterince iyi olduğunu bilmiyorum.

DB'ye sahte veriler dökerek daha fazla veri simüle edebilirsiniz ve Apache AB gibi daha fazla kullanıcıyı simüle etmek için araçlar vardı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.