Photo by Tommy Lisbin on Unsplash

.Net 7 ve Yenilikleri (Output Caching Middleware)

Furkan Güngör
Devops Türkiye☁️ 🐧 🐳 ☸️
5 min readAug 16, 2022

--

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)

Output Caching in ASP.NET Core 7 | OD114 — YouTube

--

--

Furkan Güngör
Devops Türkiye☁️ 🐧 🐳 ☸️

Solution Developer — I want to change the world, give me the source code.