Loading...

.NET ile Cache (Couchbase)


Bu blog yazısı, .NET uygulamalarında performans ve ölçeklenebilirliği artırmak için Couchbase Server'ın hem bir önbellek hem de esnek bir NoSQL veri deposu olarak kullanımını inceliyor. Couchbase, veritabanı yükünü azaltma, dağıtılmış ortamlarda tutarlılık sağlama ve yatay ölçeklenebilirlik gibi güçlü faydalar sunar. Makale, ASP.NET Core Web API ile Couchbase entegrasyonuna dair basit bir örnekle, bu hibrit çözümün nasıl yapılandırılacağını ve kullanılacağını göstermektedir.

.NET ile Couchbase Cache Kullanımı: NoSQL ve Dağıtılmış Önbellekleme Gücü (Cache Serisi Bölüm 3)

Performans ve ölçeklenebilirlik, modern yazılım mimarilerinin temel taşlarıdır. .NET'te Cache Kullanımı serimizin önceki bölümlerinde bellek içi (in-memory) ve Redis gibi dağıtılmış önbellekleme çözümlerini inceledik. Bu bölümde ise, sadece hızlı bir önbellek olmakla kalmayıp aynı zamanda esnek bir NoSQL veri deposu olarak da öne çıkan Couchbase Server'ı ele alacağız.

Couchbase Server, özellikle yüksek trafikli ve veri yoğun ortamlarda, uygulamaların performansını artırmak ve sunucu yükünü azaltmak için güçlü bir çözüm sunar. Bu blog yazısında, Couchbase'in ne olduğunu, neden hem önbellek hem de veri deposu olarak kullanılabileceğini, sağladığı faydaları, yaygın kullanım alanlarını ve özellikle ASP.NET Core Web API uygulamalarınızda Couchbase'i nasıl uygulayabileceğinize dair basit bir örnekle açıklayacağız.

Couchbase Server Nedir?

Couchbase Server, açık kaynaklı, bellek öncelikli (memory-first), dağıtılmış bir NoSQL doküman veritabanıdır. Genellikle hem ana veri depolama birimi hem de ultra hızlı bir cache olarak kullanılır. Couchbase, anahtar-değer depolamanın basitliğini MongoDB'nin doküman tabanlı esnekliğiyle birleştirir. Verileri JSON dokümanları olarak depolar, bu da esnek şema gerektiren uygulamalar için idealdir. Dağıtılmış bir sistem olarak, yatay ölçeklenebilirliği ve yüksek kullanılabilirliği doğal olarak destekler.

Neden Couchbase Cache Kullanmalısınız? Faydaları ve Gerekliliği

Couchbase'in hem bir NoSQL veritabanı hem de güçlü bir cache olarak kullanılması, birçok önemli fayda sağlar:

  • Performans ve Hız: Verileri bellek öncelikli olarak depoladığı için, Couchbase inanılmaz derecede hızlı okuma ve yazma işlemleri sunar. Bu, özellikle sık erişilen veriler için uygulama yanıt sürelerini önemli ölçüde azaltır.

  • Tek Bir Platformda Veritabanı ve Önbellek: Verileri hem kalıcı olarak depolayabilen hem de önbellek olarak kullanabilen tek bir sistem olması, mimariyi basitleştirir ve veri senkronizasyonu karmaşıklığını azaltır.

  • Dağıtılmış Ortamlarda Tutarlılık ve Yüksek Erişilebilirlik: Couchbase, verileri birden fazla düğümde (node) çoğaltarak (replication) yüksek kullanılabilirlik ve otomatik yük devretme (failover) sağlar. Bu, sunucu kesintilerinde bile verilerinize erişilebilir olmasını garanti eder.

  • Esnek Şema (JSON Dokümanları): Verileri JSON dokümanları olarak depolaması, hızla değişen veya şema gereksinimleri farklılaşan uygulamalar için büyük esneklik sunar.

  • Ölçeklenebilirlik: Veritabanı ve önbellek katmanını tek bir platformda yatay olarak ölçeklendirmek kolaydır. Yeni düğümler ekleyerek kapasiteyi ve performansı artırabilirsiniz.

  • Çapraz Veri Merkezi Çoğaltma (XDCR): Küresel olarak dağıtılmış uygulamalar için veri merkezleri arasında veri çoğaltmayı destekler, felaket kurtarma ve coğrafi dağıtım senaryolarında önemlidir.

  • N1QL Sorgu Dili: SQL benzeri güçlü bir sorgu dili olan N1QL (Non-First Normal Form Query Language) ile JSON dokümanları üzerinde karmaşık sorgular yapabilirsiniz.

Yaygın Couchbase Kullanım Alanları

Couchbase'in hibrit yapısı, onu birçok farklı senaryo için ideal kılar:

  • Gelişmiş Önbellekleme: Yüksek performans gerektiren web siteleri ve API'lerde sıkça okunan verilerin ultra hızlı önbelleğe alınması.

  • Oturum Yönetimi: Ölçeklenebilir, yüksek performanslı ve dayanıklı oturum verileri depolama.

  • Kullanıcı Profilleri ve Kişiselleştirme: Dinamik olarak değişen kullanıcı verilerinin ve tercihlerin hızlı bir şekilde depolanması ve erişilmesi.

  • Gerçek Zamanlı Analitik: Oyunlardaki lider tabloları veya anlık analiz verileri gibi gerçek zamanlı veriler için hızlı erişim.

  • Kataloglar ve Envanter Sistemleri: Ürün katalogları gibi sık güncellenen ve sorgulanan büyük veri kümeleri.

  • Nesne Depolama: Uygulama tarafından yönetilen anahtar-değer veya doküman tabanlı nesnelerin depolanması.

ASP.NET Core Web API ile Couchbase Kullanımı

ASP.NET Core uygulamalarınızda Couchbase kullanmak için Couchbase .NET SDK'sını kullanırız. Bu SDK, Couchbase kümeleriyle etkileşimi kolaylaştırır.

İşte basit bir ASP.NET Core Web API uygulamasında Couchbase'i nasıl kullanacağınıza dair bir örnek:

1. NuGet Paketini Yükleme:

Öncelikle, projenize Couchbase.Extensions.Caching.Distributed NuGet paketini eklemeniz gerekir. Bu paket, IDistributedCache arayüzünü Couchbase ile kullanmanızı sağlar. Ayrıca temel Couchbase SDK'sı da bağımlılık olarak gelecektir.

Install-Package Couchbase.Extensions.Caching.Distributed

2. Servis Konfigürasyonu (Program.cs):

Couchbase cache servisini Program.cs dosyanızda yapılandırmanız gerekir. Burada Couchbase kümenizin bağlantı bilgilerini ve kullanılacak kovayı (bucket) belirtirsiniz.

using Couchbase.Extensions.Caching.Distributed;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Text.Json; // JSON serileştirme için
using System.Threading.Tasks;

var builder = WebApplication.CreateBuilder(args);

// Controller'ları ekle
builder.Services.AddControllers();
// Swagger/OpenAPI desteği ekle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

// Couchbase Cache servisini ekle
builder.Services.AddCouchbaseDistributedCache(options =>
{
    // appsettings.json'dan Couchbase bağlantı bilgilerini oku
    builder.Configuration.GetSection("Couchbase").Bind(options);
});

var app = builder.Build();

// HTTP İstek İşleme Hattını Yapılandırma
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();

app.Run();

3. appsettings.json'a Couchbase Bağlantı Dizesi Ekleme:

appsettings.json dosyanıza Couchbase kümenizin bağlantı bilgilerini ekleyin. BucketName ve Password değerlerini kendi kurulumunuza göre değiştirin.

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "Couchbase": {
    "Servers": [ "couchbase://localhost" ], // Couchbase kümenizin adresi
    "BucketName": "MyCacheBucket", // Kullanılacak kovanın adı
    "Username": "admin", // Kova erişim kullanıcı adı
    "Password": "password" // Kova erişim şifresi
  }
}

4. Cache Kullanımı (Örnek Bir Web API Controller'ı):

Bir controller içinde IDistributedCache arayüzünü enjekte ederek cache işlemlerini gerçekleştirebilirsiniz. Bu örnek, sahte bir ürün listesini Couchbase'e önbelleğe alıp okuyacak bir API endpoint'i içerir.

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Distributed;
using System.Text.Json;
using System.Threading.Tasks;
using System.Collections.Generic;

namespace MyWebApp.Controllers
{
    [ApiController]
    [Route("api/[controller]")]
    public class ProductsController : ControllerBase
    {
        private readonly IDistributedCache _cache;

        public ProductsController(IDistributedCache cache)
        {
            _cache = cache;
        }

        [HttpGet("get-cached-products")]
        public async Task<IActionResult> GetCachedProducts()
        {
            string cacheKey = "AllProducts";
            string cachedProductsJson = await _cache.GetStringAsync(cacheKey);

            List<Product> products;

            if (string.IsNullOrEmpty(cachedProductsJson))
            {
                // Cache'te yoksa, veritabanından veya harici bir kaynaktan çek
                // Bu kısım normalde bir veritabanı çağrısı veya API isteği olur.
                // Simülasyon için 2 saniye bekletiyoruz.
                await Task.Delay(2000);
                products = new List<Product>
                {
                    new Product { Id = 1, Name = "Laptop", Price = 1500, Category = "Electronics" },
                    new Product { Id = 2, Name = "Desk Chair", Price = 300, Category = "Furniture" },
                    new Product { Id = 3, Name = "External SSD", Price = 100, Category = "Electronics" }
                };

                // Veriyi JSON'a serileştir ve Couchbase'e ekle
                cachedProductsJson = JsonSerializer.Serialize(products);
                
                var options = new DistributedCacheEntryOptions()
                                .SetAbsoluteExpiration(TimeSpan.FromMinutes(10)) // 10 dakika sonra kesin olarak kaldır
                                .SetSlidingExpiration(TimeSpan.FromMinutes(2)); // 2 dakika içinde erişilmezse kaldır

                await _cache.SetStringAsync(cacheKey, cachedProductsJson, options);

                return Ok(new { Source = "Database/API", Data = products, Status = "Fetched and Cached" });
            }
            else
            {
                // Cache'te varsa, doğrudan cache'ten oku ve JSON'dan deserialize et
                products = JsonSerializer.Deserialize<List<Product>>(cachedProductsJson);
                return Ok(new { Source = "Couchbase Cache", Data = products, Status = "From Cache" });
            }
        }

        // Örnek bir ürün modeli
        public class Product
        {
            public int Id { get; set; }
            public string Name { get; set; }
            public decimal Price { get; set; }
            public string Category { get; set; }
        }
    }
}

Bu örnekte:

  • AddCouchbaseDistributedCache ile Couchbase servisini ekliyoruz.

  • IDistributedCache arayüzünü controller'a enjekte ediyoruz.

  • GetStringAsync ile Couchbase'ten veri okumaya çalışıyoruz.

  • Eğer veri yoksa, simüle edilmiş bir veri kaynağında 2 saniye bekleyip veriyi oluşturuyoruz.

  • JsonSerializer.Serialize kullanarak veriyi JSON formatına dönüştürüyoruz.

  • SetStringAsync ile veriyi belirli süreler (kesin son kullanma ve kayan son kullanma) ile Couchbase'e yazıyoruz.

  • JsonSerializer.Deserialize ile Couchbase'ten gelen JSON veriyi tekrar nesneye dönüştürüyoruz.

Sonuç

Couchbase Server, .NET uygulamalarınıza sadece hızlı bir önbellek değil, aynı zamanda esnek ve ölçeklenebilir bir NoSQL veri deposu olarak da önemli avantajlar sunar. Dağıtılmış yapısı, yüksek erişilebilirliği ve JSON doküman desteği sayesinde, yüksek performans ve veri tutarlılığı gerektiren modern web uygulamaları için mükemmel bir seçimdir. Özellikle veritabanı ve önbellek katmanlarını tek bir platformda birleştirmek isteyen geliştiriciler için Couchbase, güçlü bir alternatiftir.

Bu blog yazısı, .NET'te Cache Kullanımı serimizin önemli bir parçasını oluşturdu. Uygulamanızın performansını ve ölçeklenebilirliğini bir üst seviyeye taşımak istiyorsanız, Couchbase'i keşfetmeye başlayın ve serimizin diğer bölümlerini takip etmeyi unutmayın!