E-Ticaret Sitesinde Stok Gösterimi: Redis ve Cron Job ile Performans Artışı

Merhaba,

E-ticaret sitelerinde ürünlerin mağaza stoklarını göstermek, müşteri memnuniyetini artırmanın ve satışları optimize etmenin önemli bir yoludur. Ancak, doğrudan ERP (Kurumsal Kaynak Planlama) sistemine yapılan sık istekler, yüksek talep anlarında ERP'nin kilitlenmesine neden olabilir. Özellikle bir ürünün mağaza stoklarını hesaplamak ERP'de 5 saniye sürebiliyorsa, bu ciddi bir performans sorununa yol açabilir.

Bu makalede, Redis, LastUpdateDate ve cron job kullanarak bu sorunu nasıl aşabileceğinizi ve performansı nasıl iyileştirebileceğinizi örnek .NET Core kodlarıyla anlatacağız.

Sorunun Tanımı

  • ERP Yükü: Doğrudan ERP'ye yapılan yoğun istekler sistemi yavaşlatır veya kilitlenmesine neden olabilir.
  • Yavaş Yanıt Süreleri: Kullanıcı deneyimini olumsuz etkileyen uzun sayfa yükleme süreleri.
  • Satış Kaybı: Yavaş veya erişilemeyen sayfalar nedeniyle müşteri kaybı.

Çözüm Yaklaşımı

  1. Redis ile Önbellekleme:
    • Verileri bellek içinde tutarak hızlı erişim sağlar.
  2. LastUpdateDate Alanının Kullanımı:
    • Veri tazeliğini kontrol etmek için kullanılır.
  3. Cron Job ile Otomatik Güncelleme:
    • Sık değişen ürünlerin stoklarını periyodik olarak günceller.

Uygulama Adımları

1. Redis Kurulumu ve Entegrasyonu

Öncelikle, Redis'i projenize ekleyin.

.NET Core için Redis Paketinin Yüklenmesi:

Install-Package StackExchange.Redis

 

Redis Bağlantısını Oluşturma:

using StackExchange.Redis;

ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");
IDatabase db = redis.GetDatabase();


2. LastUpdateDate Alanının Eklenmesi

Ürün modelinize LastUpdateDate alanını ekleyin.

public class ProductStock
{
    public int ProductId { get; set; }
    public int StockQuantity { get; set; }
    public DateTime LastUpdateDate { get; set; }
}


3. Stok Bilgisi Alma ve Önbellekleme

Stok Bilgisi Getirme Metodu:

public ProductStock GetProductStock(int productId)
{
    string cacheKey = $"product_stock_{productId}";
    var cachedData = db.StringGet(cacheKey);

    if (cachedData.HasValue)
    {
        var productStock = JsonConvert.DeserializeObject<ProductStock>(cachedData);
        // Eğer veri 5 dakikadan daha yeni ise, önbellekten veriyi döndür
        if ((DateTime.Now - productStock.LastUpdateDate).TotalMinutes < 5)
        {
            return productStock;
        }
    }

    // ERP'den veri al ve önbelleği güncelle
    var updatedStock = GetStockFromERP(productId);
    updatedStock.LastUpdateDate = DateTime.Now;

    // Redis'e kaydet
    db.StringSet(cacheKey, JsonConvert.SerializeObject(updatedStock));

    return updatedStock;
}


ERP'den Stok Bilgisi Alma Metodu (Simülasyon):

public ProductStock GetStockFromERP(int productId)
{
    // ERP'ye bağlanıp stok bilgisini alır (simülasyon için bekleme ekliyoruz)
    Thread.Sleep(5000); // 5 saniye bekleme

    // Örnek veri döndürme
    return new ProductStock
    {
        ProductId = productId,
        StockQuantity = new Random().Next(1, 100),
        LastUpdateDate = DateTime.Now
    };
}


4. Cron Job ile Sık Değişen Ürünlerin Güncellenmesi

Sık değişen ürünlerin stok bilgilerini periyodik olarak güncellemek için bir cron job ayarlayın.

Hangfire Kullanarak Cron Job Oluşturma:

Öncelikle Hangfire paketini yükleyin.

Install-Package Hangfire
Install-Package Hangfire.AspNetCore


Startup.cs Dosyasında Konfigürasyon:

public void ConfigureServices(IServiceCollection services)
{
    services.AddHangfire(x => x.UseSqlServerStorage("YourConnectionString"));
    services.AddHangfireServer();
}


Periyodik Görev Tanımlama:

public void Configure(IApplicationBuilder app, IBackgroundJobClient backgroundJobs)
{
    app.UseHangfireDashboard();
    app.UseHangfireServer();

    // Her 5 dakikada bir çalışacak şekilde ayarlar
    RecurringJob.AddOrUpdate(() => UpdateFrequentProductStocks(), Cron.MinuteInterval(5));
}


Stok Güncelleme Metodu:

public void UpdateFrequentProductStocks()
{
    var frequentProductIds = GetFrequentProductIds();

    foreach (var productId in frequentProductIds)
    {
        var updatedStock = GetStockFromERP(productId);
        updatedStock.LastUpdateDate = DateTime.Now;

        string cacheKey = $"product_stock_{productId}";
        db.StringSet(cacheKey, JsonConvert.SerializeObject(updatedStock));
    }
}


Sık Değişen Ürünleri Alma Metodu:

public List<int> GetFrequentProductIds()
{
    // Veritabanından veya başka bir kaynaktan sık değişen ürünleri alır
    return new List<int> { 1, 2, 3, 4, 5 };
}

Sonuç

Bu yöntemle, doğrudan ERP'ye yapılan isteklerin sayısını azaltarak performansı artırabilirsiniz. Redis ile önbellekleme ve LastUpdateDate alanının kullanımı sayesinde, kullanıcılar hızlı ve güncel stok bilgilerine erişebilir.

Cron job ile sık değişen ürünlerin stok bilgilerini otomatik olarak güncelleyerek, stok bilgilerinin güncelliğini koruyabilirsiniz.

Uygulama Önerileri

  • Süreleri İş Modelinize Göre Ayarlayın: 5 dakikalık güncelleme süresini ihtiyaçlarınıza göre ayarlayabilirsiniz.
  • Hata Yönetimi: ERP'den veri alınamadığı durumlar için hata yakalama mekanizmaları ekleyin.
  • Güvenlik: Redis bağlantınızı ve verilerinizi güvenli hale getirin.
  • Ölçeklenebilirlik: Uygulamanızı yatayda ölçeklendirmeyi düşünün.