Vay canına, bu çok büyük bir olası cevap dizisi olan basit bir soru. Sorunuzun daha açık bir kısmı, veritabanınızla doğrudan mı yoksa bir web servisi aracılığıyla mı daha fazla arabirim oluşturabileceğinizi sorar. Bu cevap basit: veritabanını doğrudan sorgula. Web servisine göz atmak, bir güvenlik duvarının arkasında (büyük ve büyük) çalışan kod için tamamen gereksiz olan bir miktar gecikme ekler. Örneğin bir web servisi, bir istek almak, seriyi kaldırmak, DB'yi sorgulamak, yanıtı seri hale getirmek ve iade etmek için bazı bileşenler gerektirir. Bu nedenle, kodunuzun tümü bir güvenlik duvarının arkasında çalışıyorsa, sorununuzu kaydedin ve yalnızca DB'yi sorgulayın.
Ancak bir web sitesini ölçeklenebilir yapmak, başlangıçta gönderdiğiniz sorunun ötesine geçer. Bu yüzden bir teğete gidersem beni affet, ama özellikle Facebook'tan bahsettiğini düşünmenin yararlı olabileceğini düşündüm.
Brad Fitzpatrick (LiveJournal'in kurucusu ve şimdi Google'da) tarafından yapılan çalışmaları ve araçları okumanızı tavsiye ederim. Six Apart'da onunla çalıştığımda, ondan öğrendiğim şeylerden bazıları ve LiveJournal'ın bu denli ölçeklendirilebilir mimarisi hakkında.
Geniş olanların aksine dar veritabanı tabloları kullanın . Bu konuda büyüleyici olan, bu mimariyi neyin motive ettiğini, kolayca ve hızlı bir şekilde bir sistem yaratarak öğrenmesiydi.yükseltti. Geniş bir tablo veya her alanın veya özelliğin tablodaki bir sütun olduğu tabloları kullanırsanız, örneğin veritabanı şemasını yükseltme zamanı geldiğinde, örneğin yeni bir sütun eklenirse, sistemin tabloyu şema sırasında kilitlemesi gerekir. değişim uygulanır. Ölçekte çalışırken, bu veritabanı şemasında yapılan basit bir değişiklik büyük bir veritabanı kesintisine neden olabilir. Hangi açıkça berbat. Öte yandan dar bir tablo, bir nesneyle ilişkilendirilmiş olan her bir özelliği, veritabanında tek bir satır olarak saklar. Bu nedenle veritabanına yeni bir sütun eklemek istediğinizde tek yapmanız gereken kilitleme işlemi olmayan bir tabloya INSERT kayıtları koymaktır. Tamam, bu biraz arka plandır, hadi bu modelin LiveJournal gibi çalışan bir sistemde nasıl çevirdiğini görelim.
Diyelim ki son 10 günlük girişini bir kişinin bloguna yüklemek istiyorsunuz ve her günlük girişinin on özelliği olduğunu varsayalım. Klasik geniş bir tablo düzeninde, her özellik bir tablodaki bir sütunla ilişkilendirilir. Bir kullanıcı daha sonra ihtiyaç duyduğu tüm verileri almak için tabloyu bir kez sorgulayacaktır. Sorgu 10 satır döndürür ve her satır ihtiyaç duydukları tüm verilere sahip olur (örneğin, SELECT * FROM girdileri SİPARİŞ TARİHİ SINIR 10). Dar masa düzeninde ise işler biraz farklı. Bu örnekte aslında iki tablo vardır: ilk tablo (tablo A), örneğin girişin kimliği, yazarın kimliği, girişin tarihi vb. Tarafından aranacak basit kriterleri saklar. İkinci bir tablo (Tablo B) daha sonra bir girişle ilişkili tüm özellikleri saklar. Bu ikinci tablonun üç sütunu vardır: entry_id, anahtar ve değer. Tablo A'daki her satır için, Tablo B'de 10 satır olacaktır (her özellik için bir satır). Bu nedenle, son on girişi alıp görüntülemek için 11 sorguya ihtiyacınız olacak. İlk sorgu size giriş kimlikleri listesini verir ve sonraki on sorgu ilk sorguda döndürülen girişlerin her biri ile ilgili özellikleri getirir.
"Kutsal moly!" “Dünyadakiler nasıl daha ölçeklenebilir olabilir?” diyorsunuz. Tamamen karşı sezgisel bir hak? İlk senaryoda sadece bir veritabanı sorgumuz vardı, fakat ikinci "daha ölçeklenebilir" çözümde 11 veritabanı sorgusu var. Bu hiç mantıklı değil. Bu sorunun cevabı tamamen bir sonraki kurşuna dayanıyor.
Memcache'i liberal olarak kullanın. Farkında değilseniz, memcache dağıtık, durumsuz, düşük gecikmeli, ağ tabanlı bir önbellekleme sistemidir. Facebook, Google, Yahoo ve gezegendeki hemen hemen her popüler ve ölçeklenebilir web sitesi tarafından kullanılıyor. Bu, Brad Fitzpatrick tarafından dar bir masa veritabanı tasarımında yerleşik olan ek yükün mahsup edilmesine yardımcı olmak için kısmen icat edildi. Yukarıda # 1'de açıklananla aynı örneğe bir göz atalım, ancak bu sefer memcache'i tanıtalım.
Kullanıcı bir sayfayı ilk ziyaret ettiğinde ve önbellekte hiçbir şey olmadığında başlayalım. Sayfada görüntülemek istediğiniz 10 girişin kimliklerini döndüren tablo A'yı sorgulayarak başlayın. Bu girişlerin her biri için, daha sonra bu girişle ilişkili özellikleri almak üzere veritabanını sorgularsınız ve daha sonra bu özellikleri kullanmak, kodunuzun arayüzle bağlanabileceği bir nesneyi (örneğin bir nesneyi) oluşturur. Daha sonra bu nesneyi (veya o nesnenin seri hale getirilmiş bir formunu) memcache'de saklarsınız.
İkinci kez bir kişi aynı sayfayı yüklediğinde, aynı şekilde başlarsınız: Gireceğiniz girişlerin listesi için tablo A'yı sorgulayarak. Her giriş için önce memcache'e gidin ve "önbellekte #X girişiniz var mı?" Eğer öyleyse, memcache giriş nesnesini size geri verir. Değilse, özelliklerini almak, nesneyi oluşturmak ve memcache içinde saklamak için veritabanını tekrar sorgulamanız gerekir. Çoğu zaman, ikinci kez birileri aynı sayfayı ziyaret ettiğinde yalnızca bir veritabanı sorgusu vardır, diğer tüm veriler daha sonra doğrudan memcache'den çıkarılır.
Uygulamada, LiveJournal’ın çoğu için ortaya çıkan, sistem verilerinin çoğunun, özellikle de daha az değişken olan verilerin memcache’de önbelleğe alındığı ve dar tablo şemasını desteklemek için gereken veri tabanına yapılan ilave sorguların tamamen telafi edildiğidir.
Bu tasarım, tüm arkadaşlarınızla ilgili bir gönderi listesinin bir dere veya "duvar" içine yerleştirilmesiyle ilgili problemi çözmeyi çok daha kolay hale getirdi .
Ardından, veritabanınızı bölümlemeyi düşünün. Yukarıda tartışılan model bir başka problemi ortaya çıkardı ve bu da sizin dar masalarınız çok büyük / uzun olma eğiliminde. Ve bu tabloların sırası ne kadar fazla olursa diğer idari görevlerin zorlaşmasına neden olur. Bunu dengelemek için, kullanıcıların kümelerini tek bir veritabanında, başka bir kullanıcı kümesini ayrı bir veritabanında sunduğunu belirtmek için, tablolarınızın boyutunu bir şekilde bölümlere ayırarak tablolarınızın boyutunu yönetmek mantıklı olabilir. Bu, veritabanındaki yükü dağıtır ve sorguları verimli tutar.
Sonunda harika indekslere ihtiyacınız var. Sorgularınızın hızı büyük ölçüde veritabanınızın tablolarının ne kadar iyi dizine alındığına bağlı olacaktır. Bir dizinin ne olduğunu tartışmak için fazla zaman harcamam, bunun dışında bir samanlıkta iğneleri bulmayı daha verimli hale getirmenin dev kart katalog sistemi gibi bir şey olduğunu söylemekten başka. MySQL kullanıyorsanız, yerine getirmek için uzun süren sorguları izlemek için yavaş sorgu günlüğünü açmanızı öneririz. Radarınızda bir sorgu belirdiğinde (örneğin yavaş olduğu için), tabloyu hızlandırmak için hangi dizini eklemeniz gerektiğini öğrenin.
"Tüm bu harika geçmiş için teşekkür ederim, ama kutsal kabil, yazmam gereken çok fazla kod var."
Şart değil. Memcache ile arayüz oluşturmayı gerçekten kolaylaştıran birçok kütüphane yazılmıştır. Yine de diğer kütüphaneler yukarıda tarif edilen tüm süreci kodlamışlardır; Data :: Perl'deki ObjectDriver böyle bir kütüphanedir. Diğer dillere gelince, kendi araştırmanızı yapmanız gerekecektir.
Umarım bu cevabı faydalı bulmuşsunuzdur. Bulmadığımdan çok daha fazla bulduğum şey, bir sistemin ölçeklenebilirliğinin sıklıkla koda daha az ve daha az ve daha da çok, sağlam bir veri depolama ve yönetim stratejisi / teknik tasarımına inmesidir.