.Net 7 ve Yenilikleri (Output Caching Middleware)
Geliştirdiğimiz sistemlerde kullanıcıdan bazı bilgiler alıp bazı sorumlulukları yerine getiren yüzlerce uç nokta yani endpoint
bulunmaktadır. Yoğun yük altında çalışan sistemlerde bu uç noktaların en önemli başarı kriterleri sistemin herhangi bir T
anında tutarlı bir cevap üretmesi ve bu cevabı üretirken harcadığı zamansal maliyetidir. Geliştirdiğimiz bu uç noktaların zamansal olarak daha performanslı çalışabilmesi için bazı ek geliştirmeler yapabiliriz. Bu geliştirmeler içerisinde elbette akla ilk gelen; arka tarafta yürütülen veri tabanı operasyonları olacaktır. Bu operasyonlar optimize edildiği zaman elbette bir performans artışı sağlanacaktır. Ancak bazı uç noktalarda sürekli bu operasyonların çalışmasını istemeyebiliriz. Bu noktada hayatımıza Cache
kavramı giriyor.
Distributed veya Single instance çalışan yapılarda farklı Cache
teknolojileri kullanılabilir. En popüler olanlar arasında Redis
ve Memory Cache
yer almaktadır.
Eğer Cache
konusu ile ilgili detaylı bilgiye sahip değilseniz bu linke tıklayarak Cache
ile ilgili temel bilgileri öğrenebilirsiniz. Ek olarak yıllar önce oluşturduğum EasyCache
isimli kütüphaneyi de keşfedebilirsiniz.
Yazının bu aşamasından itibaren Cache
ile ilgili temel bilgileri bildiğinizi varsayarak .Net 7 Preview 6 ile birlikte hayatımıza giren Output Cache Middleware
yapısından bahsedeceğim.
Hadi öğrenelim. 🥸
Output Cache Middleware
direkt olarak endpointlerin döndürdüğü response değerlerini cachlemek üzerine kurulmuş bir mantığa sahiptir.
Daha önceki .Net sürümlerine hakim olan geliştiriciler bu noktada ortak bir soru sorabilir. “Response Cache özniteliğinden ne farkı var?”
ResponseCache
attribute Output Cache Middleware
yapısında olduğu gibi uç noktanın döndürdüğü response nesnesini cachelemek üzerine odaklanmıştır. Ancak ResponseCacheAttribute
üzerinde unutmamamız gereken çok önemli bir uyarı vardır. Döndürülen response nesnesi, response kodundan bağımsız olarak tarayıcı tarafından önbelleğe alınacaktır.
Yani ResponseCacheAttribute
eklediğimiz bir endpoint herhangi bir senaryoda BadRequest
gibi bir cevap döndüğünde artık cache expire olana kadar bu cevap alınıyordu. Bu sorunu çözmek için bir middleware oluşturmak ve response kodunu kontrol ederek sorunu çözebiliyoruz. Örnek kod parçasını aşağıda bulabilirsiniz.
Output Cache Middleware
bu sorunu bizim için handle ediyor. Döndürülen response başarısız ise cache aktif olmuyor.
ResponseCacheAttribute
ve Output Cache Middleware
arasında bulunan bariz farklardan birini aktardım sadece. Derinlemesine bir dalış yaparsak çok daha farklı senaryolar bulabiliriz. Bu yazının konusu Output Cache Middleware
olduğu için aralarındaki farkları burada noktalıyorum. Hadi Output Cache Middleware
yapısını daha yakından tanıyalım.
Output Cache Middleware
.Net 7 ile gelen bir yenilik olduğu için. Bilgisayarınızda .Net 7 SDK’nın kurulu olması gerekiyor.
Output Cache Middleware
yapısının aktif olması için IServiceCollection
üzerinde bulunan AddOutputCache
ve IApplicationBuilder
üzerinde bulunan UseOutputCache
extension methodlarını kullanmanız gerekiyor. Örnek Program.cs
yapısını aşağıda görebilirsiniz.
Makale boyunca Output Cache Middleware
özelliğini tanırken players
listesi döndüren bazı endpointler kullanacağız. İlk örneğimiz players
listesini döndüren bir endpointin çıktısını cachlemek olacaktır.
Özellik 1-Herhangi bir endpointe cache layer ekleme
Özellik 2-Query String Parametrelerine göre Cache
Bu özelliği kullanmak için OutputCachePolicyBuilder
üzerinde bulunan VaryByQuery
extension metodunu kullanacağız.
Özellik 3-Request Header Parametrelerine göre Cache
Bu özelliği kullanmak için OutputCachePolicyBuilder
üzerinde bulunan VaryByHeader
extension metodunu kullanacağız.
Özellik 4-Cache Expiration
Herhangi bir ayarlama yapmazsanız default olarak 1 dakikalık bir expire değeriniz olacaktır. Bu özelliği kullanmak için OutputCachePolicyBuilder
üzerinde bulunan Expire
extension metodunu kullanacağız.
Özellik 5-Default Expiration Time
Her endpoint için ayrı bir expiration time
ayarlamak istemiyorsanız ve default değeri değiştirmek istiyorsanız IServiceCollection
üzerinde bulunan AddOutputCache
extension metoduna OutputCacheOptions
değerlerini geçebilirsiniz.
Özellik 6-Cache Purge
Cache
senaryolarında en önemli konulardan biri verinin ne hangi olaylardan sonra purge
olacağıdır. Aksi takdirde güncel olmayan veriler üzerinde işlem yapmak zorunda kalırsınız.
Bu özelliği kullanabilmek için OutputCachePolicyBuilder
üzerinde bulunan Tag
extension metodunu kullanacağız. Bu metod yardımıyla endpointleri belirli bir tag
altında toplayıp purge
senaryolarında ilgili tag
bilgisini kullanarak purge
senaryosunu tetikleyeceğiz.
Artık uygulamanızın herhangi bir IOutputCacheStore
arayüzünü Dependency Injection
ile alarak purge
senaryosunu tetikleyebilirsiniz. Purge
senaryosunu tetiklemek için EvictByTagAsync
metodunu kullanabilirsiniz.
Yazının bu aşamasına kadar OutputCacheMiddleware
yapısını basit örneklerle yakından tanımaya çalıştık. Hadi gelin örneklerimizi biraz daha karmaşıklaştıralım.
Özellik 7-Route Groups ile Cache
Her endpoint için CacheOutput
extension metodunu kullanmak hem kod tekrarı hem de yönetimi zor olacaktır. RouteGroups
özelliği ile aynı grupta bulunan tüm endpointlere CacheOutput
özelliğini ekleyebilirsiniz.
Özellik 8-Disable Cache
Gruplanan endpointlerde bazen istinalar çıkabilir. OutputCachePolicyBuilder
üzerinde bulunan NoCache
extension metodunu kullanarak ilgili endpointin cachelenmesini önleyebilirsiniz.
Özellik 9-Output Cache With Controllers
Şimdiye kadar bu özelliği minimal APIs üzerinde kullandık ancak isterseniz OutputCache
özniteliğini kullanarak controller seviyesinde de cache yapısını aktif edebilirsiniz.
.Net 7 ile hayatımıza girecek Output Cache Middleware
yapısı ile esnek ve kurgulanabilen bir cache yapısına kavuşacağız. Unutmayın her seferinden veri kaynağından veri çekmek yerine cache kullanarak endpointlerin performansını arttırabilirsiniz.
Daha fazla bilgi için Output Cache Middleware
ile ilgili Github ‘a bakabilirsiniz.
Geliştirdiğiniz endpointler performanslı çalışsın. Cache sizi korusun. 🙏
Add Output Caching middleware · Issue #41955 · dotnet/aspnetcore (github.com)