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ı
- Redis ile Önbellekleme:
- Verileri bellek içinde tutarak hızlı erişim sağlar.
LastUpdateDate
Alanının Kullanımı:- Veri tazeliğini kontrol etmek için kullanılır.
- 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.