Gereksinimler ve Ön Hazırlık
Başarılı bir senkronizasyon altyapısı kurmak için geliştirme ortamınızın güncel olması gerekir. Aşağıdaki araçların sisteminizde kurulu olduğundan emin olun:
- .NET 9 SDK veya üzeri: Modern asenkron programlama yetenekleri için gereklidir.
- Visual Studio 2022 veya JetBrains Rider: Güçlü hata ayıklama (debugging) araçları için.
- Entity Framework Core: Veritabanı işlemlerini yönetmek için.
- Polly Kütüphanesi: Ağ kesintilerine karşı "Retry" (tekrar deneme) mekanizmaları kurmak için.
Projenizi oluştururken dotnet new webapi -n VeriSenkronizasyonProjesi komutunu kullanarak temel yapıyı başlatabilirsiniz. Bağımlılık yönetimi için NuGet üzerinden Microsoft.Extensions.Http.Polly paketini projenize eklemeyi unutmayın.
HttpClient ile Temel Veri Çekme İşlemi
Veri senkronizasyonunun ilk adımı, uzak sunucudan veriyi güvenli bir şekilde almaktır. C# içerisinde HttpClient sınıfı, API istekleri için standart yöntemdir. Ancak, kaynak tüketimini optimize etmek için IHttpClientFactory kullanılması önerilir.
public async Task VerileriGetirAsync(HttpClient client)
{
var response = await client.GetAsync("api/urunler");
response.EnsureSuccessStatusCode();
var json = await response.Content.ReadAsStringAsync();
return JsonSerializer.Deserialize(json, new JsonSerializerOptions
{
PropertyNameCaseInsensitive = true
});
}
Bu kod bloğu, uzak API'den ürün listesini çeker. EnsureSuccessStatusCode metodu, HTTP 200 dışındaki hatalarda istisna fırlatarak hatalı veri akışını engeller.
Senkronizasyon Stratejileri ve Karşılaştırma
Veri senkronizasyonu yaparken hangi yöntemi seçeceğiniz, sisteminizin gereksinimlerine bağlıdır. Aşağıdaki tablo, yaygın senkronizasyon yöntemlerini özetlemektedir.
| Yöntem | Avantaj | Dezavantaj |
|---|---|---|
| Tam Senkronizasyon | Basit uygulama | Ağ trafiğini çok tüketir |
| Artımlı (Delta) | Hızlı ve verimli | Karmaşık mantık gerektirir |
| Olay Tabanlı | Gerçek zamanlı | Altyapı maliyeti yüksek |
Artımlı (Delta) Senkronizasyon Uygulaması
Tüm veriyi her seferinde çekmek yerine, sadece değişen verileri almak performansı ciddi oranda artırır. Bunun için sunucu tarafında bir SonGuncellemeTarihi alanı tutulmalıdır.
public async Task DeltaSenkronizasyon(DateTime sonSyncZamani)
{
var url = $"api/urunler/degisenler?tarih={sonSyncZamani:O}";
var response = await _httpClient.GetAsync(url);
if (response.IsSuccessStatusCode)
{
return await response.Content.ReadFromJsonAsync();
}
return new List();
}
Burada :O formatı (Round-trip), tarih bilgisinin ISO 8601 standardında gönderilmesini sağlar. Bu, sunucu ve istemci arasındaki saat dilimi farklarından kaynaklanan hataları önler.
Hata Yönetimi ve Polly ile Dayanıklılık
Ağ hataları kaçınılmazdır. Bir API isteği başarısız olduğunda, sistemin hemen pes etmemesi gerekir. Polly kütüphanesi, "Exponential Backoff" (üstel bekleme) stratejisi ile tekrar deneme yapmamızı sağlar.
var retryPolicy = HttpPolicyExtensions
.HandleTransientHttpError()
.WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));
await retryPolicy.ExecuteAsync(async () => {
await VerileriGetirAsync(client);
});
Bu yapı, ilk başarısızlıkta 2 saniye, ikincisinde 4 saniye, üçüncüsünde 8 saniye bekleyerek sunucu üzerindeki yükü azaltır ve geçici ağ sorunlarının aşılmasını sağlar.
Kritik Güvenlik Uyarısı: API üzerinden veri alırken her zaman TLS 1.3 kullanın. Hassas verileri asla URL parametrelerinde göndermeyin. API anahtarlarınızı
appsettings.jsoniçinde değil,User SecretsveyaAzure Key Vaultgibi güvenli depolama alanlarında saklayın.
Veritabanı ile Eşleme ve Çakışma Yönetimi
Uzak API'den gelen veriyi yerel veritabanına işlerken "Upsert" (Update veya Insert) mantığını kullanmalısınız. Eğer kayıt varsa güncellenmeli, yoksa eklenmelidir.
public async Task VeriyiKaydet(List yeniVeriler)
{
foreach (var item in yeniVeriler)
{
var mevcut = await _context.Urunler.FindAsync(item.Id);
if (mevcut != null)
{
_context.Entry(mevcut).CurrentValues.SetValues(item);
}
else
{
await _context.Urunler.AddAsync(item);
}
}
await _context.SaveChangesAsync();
}
Bu yaklaşım, veritabanı bütünlüğünü korur. Ancak büyük veri setlerinde BulkUpdate kütüphanelerini kullanarak performansı optimize etmeniz önerilir.
Sıkça Sorulan Sorular
Senkronizasyon sırasında veri çakışması (conflict) nasıl çözülür?
Genellikle "Son Güncelleyen Kazanır" (Last Write Wins) stratejisi veya versiyon numaraları (ETag) kullanarak çakışmaları yönetebilirsiniz. ETag, verinin bir sürümünü temsil eder ve güncelleme sırasında eşleşmezse hata döndürür.
API isteği çok yavaşsa ne yapmalıyım?
İsteklere bir CancellationToken ekleyerek belirli bir süreden sonra isteği iptal edebilir ve kullanıcıya zaman aşımı uyarısı verebilirsiniz.
Tüm veriyi bir kerede çekmek neden kötüdür?
Bellek (RAM) tüketimini artırır ve ağ bant genişliğini gereksiz yere doldurur. Büyük veri setlerinde "Pagination" (sayfalandırma) kullanmak zorunludur.
Yerel veritabanı ile uzak API arasında veri tutarlılığını nasıl garanti ederim?
İşlem sonunda bir "Checksum" (sağlama toplamı) karşılaştırması yaparak verilerin birebir aynı olup olmadığını kontrol edebilirsiniz.
Hangi durumlarda BackgroundService (arka plan servisi) kullanmalıyım?
Senkronizasyon işlemi kullanıcı etkileşimi gerektirmiyorsa ve belirli aralıklarla (cron job gibi) çalışması gerekiyorsa, .NET BackgroundService sınıfı en doğru tercihtir.
Yasal Uyarı: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Üretim ortamında (production) kullanmadan önce mutlaka birim testlerini yazın ve güvenlik açıklarına karşı (SQL Injection, XSS) statik kod analizi araçlarını kullanın.
Senkronizasyon Süreçlerinde Performans Optimizasyonu ve İleri İpuçları
Büyük ölçekli veri setleri ile çalışırken, senkronizasyon işleminin uygulama performansını olumsuz etkilememesi kritik öneme sahiptir. Özellikle binlerce kaydın işlendiği senaryolarda, bellek yönetimi ve ağ trafiği optimizasyonu için aşağıdaki stratejileri uygulayabilirsiniz.
Stream Kullanımı ile Bellek Tasarrufu
Verileri string olarak okumak yerine Stream kullanarak doğrudan deserialize etmek, büyük JSON dosyalarında bellek tüketimini (RAM) dramatik şekilde düşürür. System.Text.Json kütüphanesi bu konuda oldukça verimlidir.
public async Task GetLargeDataAsync(string url)
{
using var client = new HttpClient();
using var response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead);
response.EnsureSuccessStatusCode();
using var stream = await response.Content.ReadAsStreamAsync();
return await JsonSerializer.DeserializeAsync(stream);
}
Paralel İşleme ve Batch (Toplu) Kayıt
Veritabanına her kayıt için ayrı bir INSERT sorgusu göndermek yerine, verileri belirli gruplar (batch) halinde işlemek veritabanı üzerindeki yükü azaltır. Entity Framework Core kullanıyorsanız, AddRangeAsync metodunu kullanarak toplu işlem yapabilirsiniz.
Senkronizasyon İşlemleri İçin Test Stratejileri
Veri senkronizasyonu gibi kritik süreçlerde, API'den gelen verinin yapısının değişmesi veya ağ kesintileri ciddi veri kayıplarına yol açabilir. Bu nedenle, entegrasyon testleri yazmak zorunludur.
Mock API ile Entegrasyon Testi
Gerçek API'ye bağımlı kalmadan test yapmak için WireMock.Net veya Moq kütüphanelerini kullanarak API yanıtlarını simüle edebilirsiniz. Bu, hata durumlarını (500 Internal Server Error, 429 Too Many Requests) tetikleyerek kodunuzun dayanıklılığını test etmenizi sağlar.
// Örnek bir birim test senaryosu
[Fact]
public async Task SyncService_Should_Handle_Api_Error_Gracefully()
{
// Arrange: Hatalı bir yanıt simüle et
var handlerMock = new Mock();
handlerMock.Protected()
.Setup("SendAsync", ItExpr.IsAny(), ItExpr.IsAny())
.ReturnsAsync(new HttpResponseMessage { StatusCode = HttpStatusCode.ServiceUnavailable });
var client = new HttpClient(handlerMock.Object);
var service = new SyncService(client);
// Act & Assert
await Assert.ThrowsAsync(() => service.ExecuteSyncAsync());
}
Hata Ayıklama ve İzlenebilirlik (Observability)
Senkronizasyonun neden başarısız olduğunu anlamak için sadece hata mesajlarını değil, işlemin hangi aşamada kaldığını da loglamalısınız. Correlation ID kullanarak, API isteğinden veritabanı kaydına kadar olan süreci takip edebilirsiniz.
- Log Seviyeleri: Başarılı senkronizasyonları
Information, hata durumlarınıError, gecikmeleri iseWarningseviyesinde loglayın. - Metrics: Senkronizasyonun ne kadar sürdüğünü ölçmek için
System.Diagnostics.Activitykullanarak işlem süresini izleyin. - State Tracking: Senkronizasyonun en son ne zaman başarılı olduğunu bir "Checkpoint" tablosunda saklayın.
Sonuç
C# ile Rest API üzerinden veri senkronizasyonu, doğru araçlar ve stratejilerle yönetildiğinde oldukça güvenli ve sürdürülebilir bir süreçtir. Bu rehberde; HttpClient ile veri çekme, Polly ile dayanıklılık sağlama ve veritabanı üzerinde Upsert mantığını uygulama adımlarını öğrendiniz. Bir sonraki adım olarak, bu işlemi bir Worker Service içerisine alarak periyodik olarak çalışacak şekilde yapılandırabilir ve hata loglarını Serilog ile merkezi bir noktada toplayabilirsiniz.


Yorumlar (0)
Yorum Yaz