Verileri önbelleğe almalı mıyım yoksa veritabanına mı vurmalıyım?


10

Herhangi bir önbellekleme mekanizması ile çalışmadım ve aşağıdaki senaryo için seçeneklerimin .net dünyasında neler olduğunu merak ediyordum.

Temel olarak, bir Kategori (düşünme klasörü) kimliğini geçen bir REST Hizmetimiz vardır ve bu kategoride çok sayıda alt kategori olabilir ve alt kategorilerin her biri hakkında bilgi içeren 1000 medya taşıyıcısına (düşünme dosyası referans nesneleri) sahip olabilir. NAS veya SAN sunucusunda olabilecek bir dosya (bu durumda dosyalar videodur). Bu kategoriler arasındaki ilişki, bazı izin kuralları ve alt kategorilerle ilgili meta verilerle birlikte bir veritabanında saklanır.

Yani bir UI perspektifinden, her bir alt klasöre tıklayarak (Windows explorer'u düşünün) kullanıcı tarafından yönlendirilen tembel bir ağaç kontrolümüz var. Video dosyasının URL'sine geldikten sonra videoyu izleyebilirler.

Kullanıcı sayısı 1000'lere, alt kategoriler ve videolar ise sistem büyüdükçe 10000'lere ulaşabilir.

Soru şu ki, her bir talebin veritabanına isabet ettiği yerde çalışma şeklimizi sürdürmeli miyiz yoksa verileri önbelleğe almayı mı düşünmeliyiz?

IIS 6/7 ve Asp.net'i kullanıyoruz.


4
Sisteminizi gerçekçi bir yük altında profillediniz mi? Can veri önbelleğe alınacak? Mantıklı olur mu?

Yanıtlar:


13

İlk olarak, kodun veri sağlayıcınızın kolayca değiştirilebileceği şekilde bölümlendiğinden emin olun. Burada arayüz ayrımı ve diğer SOLID ilkelerinden bahsediyoruz.

Sonra aşağıdakilerin cevabını bilmeniz gerekir:

1) Veriler sık ​​sık değişecek mi? 2) Uygulama, bu güncellemeleri almak için REST hizmetinizi sık sık yoklıyor mu? 3) Veritabanı başka bir amaçla mı kullanılıyor? 4) Güncel performans sorunlarının farkında mısınız? 5) Veriler uygulamanız tarafından güncelleniyor mu ve bu güncellemelerin uygulamaya yansıması gerekiyor mu?

İlginç olan şey, veritabanını kullanarak, teknik olarak zaten verileri önbelleğe almanızdır. Bir veritabanı bunu yapar. Bir çok Ar-Ge, veri alımında veritabanını olabildiğince hızlı hale getiriyor. Örneğin, sık kullanılan veriler için kendi bellek önbelleğini kullanır.

Öyleyse kendinize sorun önbellek sağlayıcılarını değiştirerek ne kazanmayı umuyorsunuz? Ve ele alınması gereken mevcut sınırlamalar nelerdir?

Şu anda herhangi bir yavaşlama yaşamıyorsanız, sadece "hayır, değiştirmeye gerek yok" derim.

Bu gerçekten büyük bir konu. Verilerin coğrafi olarak dağıtılması gerektiğinde önbellekler gerçekten iyi sonuç verir, ancak yönetim açısından büyük bir ek yük vardır.

Şu anda aynı türden kararlar aldığım bir proje yapıyorum.

Şimdiye kadar benim çözüm sadece veritabanını kullanmak ve her istemciden yoklama istekleri ile çok vurmak. Kulağa yucky geliyor, ama (testte) ihtiyacım olandan çok daha fazla ölçekleniyor, kod çok basit.

Bununla birlikte, kodum, ana uygulamanın veri sağlayıcısını veritabanı kodundan soyutlayan bir tür havuz deseni kullanıyor. GemFire ​​gibi bir önbellek sağlayıcısında takas etmek istersem, bunu yapmak için oldukça küçük bir kod gerekir.


Teşekkürler Ian. Bu aşamada bir veri tabanımız var ama daha çok dikkat edilmesi gereken şeyler hakkında eğitici bir soruydu.
JD01

18

Thorbjørn'un yorumlarına göre gerçekten yeterli bilgi yok.

Önbellekleme, yanlış yapıldığında, sizin ve kullanıcılarınızın çok fazla kedere neden olabilir. Uygulamanızı aşırı karmaşıklaştırmadan önce önbelleğe alma konusunda endişelenmeniz gerektiğinden emin olun.

Bu nedenle, gerçekten önbelleğe almanız gerektiğini belirten bilgi yokluğunda önbellekleme.

[Optimizasyonun genel kuralı: Bir şey yapmam gerekip gerekmediğini sormanız gerekiyorsa, cevap hayırdır] *
* Cevabın evet olduğu çoğu yerde bu bir soru değil, bir ifade olacaktır.


Genel kuralı seviyorum, iyi dedi :)
Ian

@ dan-mcgrath Her girişe tam olarak 2 kez sadece 5 dakika içinde erişecek ve daha sonra asla giriş yapmayacaksam girişleri önbelleğe almak iyi bir fikir mi?
nishantbhardwaj2002
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.