Emre Kızıldaş
Published in

Emre Kızıldaş

EF Core İle Bütünsel Bağlantı Dayanıklılığını Nasıl Sağlarız?

Photo by Artem Kniaz on Unsplash

Merhaba, bugün EF Core içerisinde bağlantılarımızın dayanıklılığından bahsedeceğiz. Yakın zamanda popülaritesini artıran mikro hizmetler (microservices) yaklaşımı ile birlikte gelen operasyon yüklerinden birisi de verilerimizin tutarlılığını sağlamak oldu.

Yazımızda ele alacağız örnek proje; ürünler ve bu ürünlere ait katalogların listelendiği bir Web API olacak. Bir ürünün fiyatı değiştiğinde bu fiyatı veritabanına kaydeden ve aynı zamanda yapılan bu değişikliği loglayan bir yapı tasarlayacağız.

EF Core ile birlikte çokça kullanılan bağlantı dayanıklılığı yöntemlerinden birisi hata alındığında tekrar denemesini sağlayan RetryOnFailure metodudur.

Aşağıdaki örnekte, bir SQL Server kullanılarak oluşturulan veritabanı modelinin hata alması durumunda nasıl bir yol izleyeceğini bulabilirsiniz.

public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<PicnicContext>(
options => options.UseSqlServer(
"<connection string>",
providerOptions => providerOptions.EnableRetryOnFailure()));
}

EnableRetryOnFailure metodu ile birlikte maksimum deneme sayısını, deneme sırasında bekleyebileceği maksimum süreyi de belirleyebiliriz.

sqlOptions.EnableRetryOnFailure(maxRetryCount: 15, maxRetryDelay: TimeSpan.FromSeconds(30), errorNumbersToAdd: null)

Bu durum sadece veritabanına eklenen verilerin çok daha dayanıklı bir yapıda kaydedilmesini sağlamaktadır.

Peki veri kaydederken yapılan diğer olayların tutarlılığı?

Örneğin, bir ürünün fiyatının güncellendiğinde bu durumu veritabanına kaydeden ve bir olay fırlatan bir yapı düşünün. Veya benzer şekilde, ürünün fiyatı güncellendiğinde, kategorisinin ortalama fiyatının yeniden hesaplandığı bir yapı da düşünebilirsiniz.

Bu durumda veritabanına eklenen verinin dayanıklılığı RetryOnFailure ile sağlanmış olsada olayı bir kuyruğa kaydetmenin güvenirliliğini nasıl sağlayacağız? İşte burada devreye özelleştirilmiş bağlantı dayanıklılığı metodları giriyor.

Yine EF Core tarafından sağlanan “ExecutionStrategy” metodu yardımıyla bir transactionun uçtan uca sağlamlığını sağlayabiliriz. Yani hem veritabanına veri eklendiğini hem de bir olayın kuyruğa eklendiğini garanti altına alabiliriz.

Yukarıdaki sınıfın örnek olarak kullanımına aşağıdaki kod parçacığından ulaşabilirsiniz.

Bu örnekte, aşağıdaki gibi bir olay kaydedilmektedir:

var priceChangedEvent = new ProductPriceChangedIntegrationEvent(catalogItem.Id, productToUpdate.Price, oldPrice);

Bakıldığında; bir ürünün fiyatı güncellendiğinde bu durum veritabanına kaydedilip sonrasında ise olay fırlatılmaktadır. Bu olayı dinleyen farklı bir servis ise işlemlerine devam edecektir.

Bu durumda veritabanı kayıt işlemi ve olay fırlatma işlemi tek bir transaction olarak birlikte değerlendirilir. Bu sayede başlangıçta kurduğumuz RetryOnFailure metodu bu bağlantı için de geçerli olacaktır.

Yani veritabanı kaydı sırasında veya olay fırlatma sırasında bir hata olduğunda; ilgili transaction bütün olarak değerlendirilir, işlemin her ikisi de yeniden tetiklenir. Bu örnek üzerinde, 15 kez denemeden sonra hata tekrarlanıyorsa da Exception fırlatılır ve bu sefer devreye exception handle yapınız girecektir.

Yazımızın burada sonuna gelirken, yazının maksadının detaylı bir anlatımdan ziyade yapıya dikkat çekmek olduğunu belirtmek istedim. Sizler kendi projelerinizde bu yapıyı özelleştirerek kullanabilirsiniz.

--

--

Çeşitli yazılım dillerinde ve platformlarında projeler oluşturmak üzere paylaşımlarda bulunduğum kişisel blog.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store