İş ilanlarında başvuru sahibinin "ölçeklenebilir" uygulamalar yazma deneyimine sahip olduğunu görmeye devam ediyorum. Bir uygulamayı ölçeklenebilir yapan nedir ve kodumun milyonlarca kullanıcıya ölçeklenebileceğini nasıl bilebilirim?
Sanırım bu soruyu ifade etmenin daha iyi bir yolu: Kodumu ölçeklenebilirlikle nasıl yazabilirim? Böylece kod, sonradan düşünülenin aksine get-go'dan ölçeklendirilebilir. Belli tasarım yöntemleri var mı? Yoksa sadece iş için doğru algoritmaları seçmek midir?
Ölçeklenebilirliğin iki yönü vardır:
Birincisi için, herhangi bir keyfi sınırlama olmadığına dikkat etmeniz gerekir. Bunlar çok küçük tamsayı boyutları veya sabit/sınırlı uzunluklu yapılar nedeniyle. Bu yapılar altta yatan OS ile ilişkili olabilir. Örneğin, daha fazla iş parçacığı veya işlem kullanarak ölçeklendirmeye çalışırsanız, bir noktada işletim sisteminin sınırlarına ulaşırsınız. Bu nedenle şu anda yüksek ölçeklenebilirlik için oluşturulan sunucular eşzamansız olaylara dayalı eşzamanlılık yapıyor. Bu sorun ünlü C10K belgede .
İkincisi daha zor. Akılda iki şeyle programlama gerektirir: veriler paralel olarak işlenir ve veriler fiziksel olarak dağıtılabilir. Düğümler arasındaki iletişim sınırlandırılmalıdır. Pratikte bu genellikle ACID'nin bazı kısımlarını feda etmek anlamına gelir (tam ACID'ye ve aynı zamanda ölçeklendirme yeteneğine sahip olamayacağınız 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, yalnızca birleştirme yapma yeteneğinden arınmış olarak değişir. anahtar/değer depoları ultra ölçeklenebilir, ancak bu bir fiyat olarak gelir. Temel olarak yalnızca birincil anahtarda sorgulama yapabilirsiniz. Ancak bunun çözümü var, harita azaltma . Kümülatif karmaşıklık bakış açısına bakarsanız çok yetersiz görünebilir, ancak bunun büyük ölçüde paralel çalıştığını aklınızda bulundurmanız gerekir.
Gerçek hayattaki örneklerle ölçeklenebilirlik hakkında daha fazla bilgi edinmek istiyorsanız HighScalability.com blog adresine bakın.
Ölçeklenebilirlik, bazı değişkenlere dayalı olarak verim cinsinden ölçülür. Örneğin, X kullanıcısıyla saniye başına istek sayısı. Ölçeklenebilirliği tanımlamanın en basit yolu:
Yük arttıkça verimlilik ölçüsü.
Ölçeklenebilirlik için tasarımda anlamanız gereken ilk şey, uygulamanız için hangi ölçümün en önemli olduğudur? Ölçeklendirilebilirliğin temel bir bileşeni olan çeşitli ölçüm yöntemleri verimlilik vardır:
Kullanılabilecek daha fazla verimlilik ölçümü vardır, ancak bunlar web tabanlı sistemler veya toplu işleme sistemleri için yaygındır.
Ölçeklenebilirliğin bir sonraki yönü, yük arttıkça verimliliğinize ne olduğunu ölçmektir. Yükü arttırmanın yaygın yolları:
Ölçeklenebilir bir uygulamanın amacı, yük sorunuyla uğraşırken verimliliği korumak veya artırmaktır. Kısacası, yanıtlama süresi çok uzun sürüyorsa, yükü eşit olarak 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 o "tatlı nokta" da çalışmasını sağlar.
Uygulamanızın ölçeklendirmek için özel olarak tasarlanması gerekecektir. Bu, oturum verilerine dikkat etmeniz, istekleri doğru sunucuya yönlendirmeniz ve uygulamanın ölçeklendirme yeteneğini sınırlayan darboğazları azaltmanız gerektiği anlamına gelir.
Temel olarak kullanıcı sayısını artırdığınızda ve/veya daha büyük bir veri kümesini işlediğinizde ve/veya arayüzünüzü daha fazla dilde sunduğunuzda performans darboğazlarından kaçınmak istersiniz.
Temel olarak veritabanı şemanıza, 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, sorunları oluşturmaya başladıklarında tanımlamak için performans izlemeyi ayarlamak istersiniz.
Ölçeklenebilir Web Siteleri Oluşturma (Amazon bağlantısı) okuduğumda bu ipuçlarını aldım.
Bu yardımcı olur umarım!
Uygulamaların gerçekten ölçeklenebilir olabilmesinin tek yolu, geçilemeyen (veya yalnızca çok pahalı) herhangi bir kısıtlamaya sahip olmamaktır.
Tipik bir örnek, mevcut işlemci döngüleriniz bittiğinde ne olur? Programınız çok işlenmişse, birden çok çekirdekli bir kutuda çalışabilirsiniz, ancak daha büyük bir kutu satın alamazsanız ne olur? Uygulamanız artık büyüyemez ve bu nedenle ölçeklenebilir değildir.
Gerçekten ölçeklenebilir herhangi bir uygulama, saydam bir şekilde birden çok bilgisayara yayılabilmeli ve bunu fark edilir bir artış olmadan yapmalıdır. Bu kolay değildir ve Google'ın bu kadar başarılı olmasının nedenlerinden biridir.
Büyük ölçekli uygulamaları desteklemeyle gelen benzersiz sorunlar vardır. İş ilanı, bu ortamda çalışan ve bu tür sorunları çözmek zorunda olan adayları arıyor.
Üst düzey bir uygulamadan, bu kod parçasının çok küçük bir dönemde binlerce kez çalıştırılması istenirse ne olacağı sorusunu sürekli olarak sorarak ölçeklenebilir hale getirilir. Bu, bellek ayak izlerinizi yönetmek, toplamların ve verilerin önbelleğe alınmasını kullanmak, kendileri ölçeklendirilebilir veri kaynaklarını kullanmak vb. Anlamına gelir.
Arama için DB'de 100 satır ve aynı anda kullanan 10 kullanıcı olduğunda iyi performans gösteren bir arama özelliği oluşturuyorsanız. 100 kullanıcı aynı anda kullanırken ne kadar iyi performans gösterir ve aramak için 100K satır vardır.
Ne olursa olsun aynı şeyi yaparsa, o zaman çok iyi. kullanıcı/veri miktarıyla orantılı bir performans sergiliyorsa (yani 10x daha fazla veri = = 10x daha uzun işlenir) bu iyi. Daha fazla veriyi çok daha düşük performans gösteriyorsa (10x mod verisi == 10x ^ 10 daha uzun işlemek için), o zaman iyi ölçeklenmez.
Örneklerim gerçekten Big O notasyonunda gösterilmelidir, ancak şu anda Big O'daki örnekleri yazmak için yeterince iyi bilmiyorum.
Kukla verileri DB'nize 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.