Corant
Blog'a Dön

Offline-First Mimari: İnternetsiz de Çalışan Mobil Uygulamalar Nasıl Tasarlanır?

Mobil10 dakikalık okuma

Metroda, asansörde, kırsal bir bölgede veya sadece zayıf bir bağlantıda… Kullanıcılarınız her zaman kesintisiz internete sahip değildir. İnternet koptuğu anda beyaz ekrana düşen veya "bağlantı yok" hatası veren bir uygulama, kullanıcı güvenini hızla kaybeder. Offline-first mimari tam da bu sorunu çözer: Uygulamayı, internet bir istisna değil de opsiyonel bir iyileştirme olarak varsayacak şekilde tasarlamak. Bu yazıda offline-first yaklaşımın temel bileşenlerini ve tasarım kararlarını inceliyoruz.

Offline-First Ne Demek, Neden Önemli?

Geleneksel mimaride uygulama, her veri için sunucuya gider ve yanıt gelene kadar bekler. Offline-first mimaride ise yerel veritabanı asıl kaynaktır (source of truth); uygulama önce yerel veriyle çalışır, ağ bağlantısı olduğunda ise arka planda sunucuyla senkronize olur. Kullanıcı için sonuç, anında yanıt veren ve bağlantıdan bağımsız çalışan akıcı bir deneyimdir.

Bu yaklaşım sadece bağlantısız senaryolar için değil, algılanan performans için de önemlidir. Yerel veriden okuyan bir ekran, ağ gecikmesini bekleyen bir ekrandan her zaman daha hızlı hissedilir.

Yerel Depolama Seçenekleri

Offline-first mimarinin kalbi, doğru yerel depolama katmanını seçmektir. İhtiyacınıza göre farklı seçenekler öne çıkar.

  • SQLite tabanlı çözümler: İlişkisel veri ve karmaşık sorgular için güçlü; Drift, Room gibi katmanlarla kullanılır.
  • Anahtar-değer depoları: Basit ayarlar ve küçük veriler için hızlı ve pratik.
  • Nesne veritabanları: Realm, ObjectBox gibi çözümler yüksek performanslı yerel senkronizasyon sunar.
  • Güvenli depolama: Token ve hassas veriler için şifreli keychain/keystore kullanılmalıdır.

Senkronizasyon Stratejisi

Offline-first mimarinin en zor kısmı senkronizasyondur. Kullanıcı çevrimdışıyken yaptığı değişiklikler bir gönderim kuyruğuna (outbox) alınır ve bağlantı geldiğinde sunucuya iletilir. Sunucudaki değişiklikler ise delta senkronizasyon ile, yani sadece son senkronizasyondan bu yana değişenler çekilerek indirilir; bu, veri trafiğini ve pil tüketimini azaltır.

Senkronizasyonu tetikleyen mekanizmalar önemlidir: Ağ durumu değiştiğinde, uygulama öne geldiğinde veya belirli aralıklarla arka plan görevleri (WorkManager, BackgroundTasks) ile senkronizasyon yapılabilir. Başarısız istekler için üstel geri çekilme (exponential backoff) ile yeniden deneme mantığı kurulmalıdır.

Çakışma Çözümü (Conflict Resolution)

Aynı veri hem çevrimdışıyken cihazda hem de başka bir yerde sunucuda değiştiğinde ne olur? Bu çakışmaların nasıl çözüleceğini baştan tasarlamak gerekir. En yaygın stratejiler şunlardır:

  • Last-write-wins: En son yazılan kazanır; basittir ama veri kaybı riski taşır.
  • Alan bazlı birleştirme: Farklı alanlardaki değişiklikler akıllıca birleştirilir.
  • Sunucu otoritesi: Kritik verilerde sunucunun kararı esas alınır.
  • Kullanıcıya sorma: Çakışma önemliyse kullanıcıya seçim sunulur.

Her varlık (entity) için hangi stratejinin uygun olduğunu belirlemek, veri bütünlüğü açısından hayatidir. Zaman damgaları ve sürüm numaraları (versioning), çakışmaları tespit etmenin temelidir.

Kullanıcı Deneyimi: Durumu Şeffaf Göstermek

Offline-first bir uygulama, kullanıcıya ne olup bittiğini dürüstçe göstermelidir. Henüz senkronize olmamış bir öğe için "gönderiliyor" durumu, başarısız bir senkronizasyon için tekrar dene seçeneği ve genel bağlantı durumu göstergesi, kullanıcının güvenini korur.

Optimistik güncelleme (optimistic UI) burada güçlü bir tekniktir: Kullanıcı bir işlem yaptığında sonucu anında gösterirsiniz, senkronizasyon arka planda gerçekleşir. İşlem başarısız olursa nazikçe geri alır ve bilgilendirirsiniz. Bu, uygulamayı hızlı ve güvenilir hissettirir.

Offline-first mimari, ek bir mühendislik yatırımı gerektirir; ama karşılığında bağlantı koşullarından bağımsız, hızlı ve dayanıklı bir kullanıcı deneyimi sunar. Özellikle saha ekipleri, lojistik, sağlık ve seyahat gibi bağlantının garanti olmadığı alanlarda bu yaklaşım tercih değil, zorunluluktur. Corant olarak bu tür projelerde senkronizasyon ve çakışma stratejisini tasarımın merkezine alıyor, kullanıcının uygulamayı her koşulda güvenle kullanabilmesini sağlıyoruz.