NET Core 3.1 Microsoft cache saçma sonuçlar dönüyor

Katılım
9 Haziran 2016
Mesajlar
1.535
Makaleler
2
Çözümler
42
Daha fazla  
Cinsiyet
Erkek
Sitemiz için Microsoft ın-Memory caching kullanmaktayım. Postmanager (postlar için iş katmanım) üzerinde getbyıd, getall, getbycategoryıd'nin sonucu bir Update, add, remove eventine kadar cacheleniyor. Maksimum cache süremiz ise 15 dakika.

Sorun burada başlıyor ki, ımemorycache Interface'ini singleton olarak çözsek bile site her istekte farklı veri dönüyor.

Örneğin:
"Title" özelliğiniz değeri "örnek başlık" idi ve biz bunu "example title" olarak değiştirdik. Bu esnada Update metodu çalıştığı için önbellek temizlendi. Siteye art arda istek gönderdiğimiz zaman ise "title" bazen "örnek başlık" bazen "example title" olarak dönüyor. Bu da ciddi can sıkıntısına sebep oluyor.

Kodlar
Update metodu.

1657232072202.png


Cache aspect.

1657232129414.png


Cache remove aspect.

1657232180410.png


@bitwise
 
Son düzenleyen: Moderatör:
Hic Microsoft in-memory cache kullanmadim, sorularim var.
1) Invocation.success ise pattern'e gore cache'den key remove ediyorsunuz. Ilk request cache'den, ikincisi key remove edildigi icin source'dan geliyor olabilir mi?
2) Cache gercekten singleton mu? Birinci instance'da var digerinde yok ve source'dan aliyor olabilir mi? Suradaki gibi kurguluyorsunuz degil mi -> builder.Services.AddSingleton<MyMemoryCache>(); Cache in-memory in ASP.NET Core
3) Istekleri admin olmayan kullanici ile atiyorsunuz degil mi? Admin bypass ediyor.
4) Neden update sonrasi tum key'leri siliyorsunuz? Sadece update edileni silmeniz gerekmez mi?

Soyle basit bir senaryo ile test edince ne sonuc aliyorsunuz? ( Kod zimbirtisi calismiyor, bodos yaziyorum )

value = if ( cache.contains(key) ) cache.retrieve(key) else source.retrieve(key)
cache.set(key,value,15min)
// LRU, her defasinda set ediyor
// remove aspect yok
// admin check yok
// tercihen cache hit ve miss senaryolarini loglayarak takip edin

Ben sorunun key remove etme seklinizde oldugunu dusunuyorum.

Cache cok hizli oldugu icin contains ve retrieve ayni anda kullanmak OK'dir diye dusunuyorum. Aslinda cache.retrieve(key, defaultVal) seklinde kullanmak daha dogru.

Cache thread-safe'dir diye dusunuyorum ama siz race-condition introduce etmis olabilirsiniz.
Log yazarak remove ve set arasindaki siralamayi karsilastirabilirsiniz.

Normalde Cache'e evictionPolicy ve fallBackPolicy belirledikten sonra aslinda data yonetimini ona birakmaniz gerekiyor. Siz update sirasinda cache guncellemiyorsunuz ( key siliyorsunuz ), data cektikten sonra set ediyorsunuz.

Normal kullanim su sekilde olmali:

Cache cache = CacheBuilder.eviction ( 15min ). source( dataSource );

function getById(id){
return cache.retrieve(id) // yoksa dataSource'dan alir ve set eder.
}

function store(object){
key = dataSource.save(object)
cache.set(object).
}
 
Son düzenleme:
1) Invocation.success ise pattern'e gore cache'den key remove ediyorsunuz. Ilk request cache'den, ikincisi key remove edildigi icin source'dan geliyor olabilir mi?
Sanırım hayır. GetById metodu ile CacheRemoveAspect ilişkili değil. Yani Update olayından sonra GetById metoduna ait önbellek temizleniyor. Başarılı bir istekte cache silinmiyor.

2) Cache gercekten singleton mu? Birinci instance'da var digerinde yok ve source'dan aliyor olabilir mi? Suradaki gibi kurguluyorsunuz degil mi -> builder.Services.AddSingleton<MyMemoryCache>(); Cache in-memory in ASP.NET Core
Bu şekilde.

3) Istekleri admin olmayan kullanici ile atiyorsunuz degil mi? Admin bypass ediyor.
Admin olmayan kullanıcı.

4) Neden update sonrasi tum key'leri siliyorsunuz? Sadece update edileni silmeniz gerekmez mi?
Bunu ben de düşündüm fakat tam olarak nasıl uygulayacağımı bulamadım maalesef. Site sahibi aciliyet gördüğü için fazla da uğraşmamıştım ama şimdi bakacağım.

value = if ( cache.contains(key) ) cache.retrieve(key) else source.retrieve(key)
cache.set(key,value,15min)
Aynı şekilde sıkıntılı veri geliyordu. En azından problemi site sahibi panelden yaşamasın diye Admin olunca önbelleği iptal ettim. Bir de yazarlar yazı yazarken güncelleme problemi olmasın diye.

Umarım sorularınıza doğru cevap verebilmişimdir, çok fazla tecrübeli değilim bu konuda.

Ayrıca cevap verdiğiniz için çok teşekkür ederim.
 

Technopat Haberler

Yeni konular

Geri
Yukarı