Sparround

Cache və offline-first strategiyalar

Cache strategiyaları müsahibədə "tətbiqin interneti zəif olanda necə davranır?" sualının arxasında dayanır:

  • Cache-then-network (stale-while-revalidate) — əvvəl cache göstər, paralel yenilə, gələndə əvəz et. Ən yaxşı UX; balans ekranında "köhnəlik" göstəricisi ilə.
  • Network-first, cache fallback — əvvəl şəbəkə, alınmasa cache. Kritik dəqiqlik tələb edən yerlərdə.
  • Cache-only / Network-only — xüsusi hallar (offline rejim / ödəniş əməliyyatı).

Qatlar üzrə cache:

  • HTTP cache (OkHttp)Cache-Control header-lərinə əsaslanır; server dəstəyi lazımdır.
  • Yaddaş cache-i — sessiya boyu, ən sürətli.
  • DB cache (Room) — offline-first-ün onurğası: DB single source of truth, şəbəkə DB-ni yeniləyir.

İnvalidasiya ən çətin hissədir: TTL (vaxt əsaslı), event əsaslı (istifadəçi köçürmə etdi → balans cache-i köhnəldi), versiya əsaslı (ETag/If-None-Match → 304).

kotlin
class TransactionRepository @Inject constructor(
    private val api: TransactionApi,
    private val dao: TransactionDao
) {
    // UI həmişə DB-yə baxır — offline-da da işləyir
    fun observeTransactions(accountId: String): Flow<List<Transaction>> =
        dao.observeByAccount(accountId).map { list -> list.map { it.toDomain() } }

    // Yeniləmə DB-ni yazır; Flow avtomatik yeni datanı ötürür
    suspend fun refresh(accountId: String): RefreshResult = try {
        val remote = api.getTransactions(accountId)
        dao.upsertAll(remote.map { it.toEntity() })
        RefreshResult.Success
    } catch (e: IOException) {
        RefreshResult.Offline   // UI: "son yenilənmə 14:32" göstərir
    }
}

Offline-first repository: DB oxu, şəbəkə yenilə

Bank tətbiqində sərhədlər: balans və tranzaksiya tarixçəsi cache-lənir (köhnəlik göstəricisi ilə), amma ödəniş əməliyyatı heç vaxt cache-dən "uğurlu" göstərilmir və offline növbəyə avtomatik qoyulmur — istifadəçi təsdiqi olmadan təkrar icra double-charge riskidir. Sensitive cavablar üçün Cache-Control: no-store server tərəfdən gəlməlidir; gəlmirsə, interceptor-lə məcbur et.

🛠 Tapşırıq

Əvvəlki iki tapşırığı birləşdir: Retrofit + Room ilə offline-first repository yaz.

  • observeX() yalnız DB-dən oxusun, refresh() şəbəkədən çəkib DB-yə yazsın.
  • Uçuş rejimini aç, tətbiqi yenidən başlat — məlumat hələ də görünməlidir.
  • UI-a "son yenilənmə HH:mm" göstəricisi əlavə et və 5 dəqiqədən köhnə olanda xəbərdarlıq göstər.

Bitdi sayılır: internet yoxkən ekran boş qalmırsa və istifadəçi datanın köhnə olduğunu görürsə.

📚 Mənbələr və sənədlər