Mobil inkişafda keş və məlumat sinxronizasiyası: bu nədir, hansı strategiyalar və necə işləyir

Müəllif: IT Sectr Dərc olunub: 2026-06-19 Oxuma vaxtı: 12 dəq

Mobil inkişafda məlumatlarla iş, keşləmə və sinxronizasiya tətbiqin performansını və etibarlılığını müəyyən edən üç əsas aspektdir. Google Android Architecture Guide-a görə, düzgün məlumat idarəetmə arxitekturası cavab sürətinə və istifadəçi təcrübəsinə birbaşa təsir edir. Repository nümunəsi bütün məlumat mənbələrinə vahid giriş nöqtəsi təmin edir.

Əsas Məqamlar

  • Repository — Remote və Local Data Source-un təfərrüatlarını gizlədən vahid məlumat mənbəyi
  • LRU Cache — limitə çatdıqda ən az istifadə edilmiş elementləri çıxaran keşləmə alqoritmi
  • Offline Queue — cihaz oflayn olduqda əməliyyatların gecikmiş icrası mexanizmi
  • Conflict Resolution — çoxsaylı cihazlar arasında sinxronizasiya zamanı münaqişələrin həlli strategiyası
  • Schema Migration — məlumat itkisi olmadan yerli verilənlər bazası strukturunun təhlükəsiz dəyişdirilməsi prosesi

Mobil Tətbiqlərdə Məlumatlarla İş: Repository Nümunəsi və Data Source

Repository nümunəsi — vahid depo sinfinin bütün məlumat əməliyyatlarını idarə etdiyi, uzaq REST API-ləri və yerli depolama Room və ya SwiftData-nı abstraktlaşdırdığı arxitektura yanaşmasıdır. Məlumatlarla işin bu üsulu tətbiqə əvvəlcə Memory Cache və ya Disk Cache-dən, sonra isə şəbəkədən məlumat almağa imkan verir, cavab müddətini azaldır. Mobil inkişafda Repository Google və Apple-ın tövsiyələri sayəsində de-fakto standarta çevrilmişdir.

Remote Data Source və Local Data Source

Remote Data Source HTTP sorğuları vasitəsilə serverdən cari məlumatı təmin edir. Local Data Source — Android-də Room və ya iOS-da SwiftData vasitəsilə tətbiq edilən cihazdakı yerli depolamadır. Depo hər iki mənbəni birləşdirir: əvvəlcə yerli keşi yoxlayır, məlumat olmadıqda isə uzaq API-dən sorğu edir. Məlumat idarəetmənin bu təşkili tətbiqə oflayn rejimdə işləməyə imkan verir və server yükünü azaldır.

Kotlin-də Repository Nümunəsi

kotlin
class UserRepository(
    private val remoteDataSource: UserRemoteDataSource,
    private val localDataSource: UserLocalDataSource
) {
    suspend fun getUsers(): List<User> {
        localDataSource.getCachedUsers()?.let { return it }
        val users = remoteDataSource.fetchUsers()
        localDataSource.cacheUsers(users)
        return users
    }
}

Swift-də Repository Nümunəsi

swift
class UserRepository {
    private let remote: UserRemoteDataSource
    private let local: UserLocalDataSource
    
    func getUsers() async throws -> [User] {
        if let cached = await local.getCached() { return cached }
        let users = try await remote.fetch()
        await local.save(users)
        return users
    }
}

Məlumat Keşləmə: LRU Cache, Disk Cache və Memory Cache

LRU Cache (Least Recently Used) — limitə çatdıqda ən uzun müddət ərzində giriş edilməmiş elementin silindiyi keşləmə alqoritmidir. Mobil tətbiqlərdə LRU Cache şəkillər, API cavabları və seriyalaşdırılmış obyektlər üçün istifadə olunur. Düzgün məlumat keşləmə şəbəkə sorğularının sayını azaldır və məzmun yükləməni sürətləndirir. Mobil tətbiqlərdə keş yüksək performans üçün vacib komponentdir.

Memory Cache vs Disk Cache

Memory Cache məlumatları RAM-da saxlayır — giriş son dərəcə sürətlidir, lakin tutum tətbiqin yığın ölçüsü ilə məhdudlaşır. Disk Cache məlumatları fayl sistemində saxlayır — daha yavaşdır, lakin daha çox saxlaya bilir və sessiyalar arasında qalıcıdır. Mobil inkişafda optimal strategiya iki səviyyəli keşdir: isti məlumatlar üçün Memory Cache və soyuq məlumatlar üçün Disk Cache. Məlumatlarla iş zamanı əvvəlcə yaddaşda birinci səviyyəli keş, sonra diskdə ikinci səviyyəli keş yoxlanılır.

LRU Cache Tətbiq Nümunəsi

kotlin
class MemoryCache<K, V>(
    private val maxSize: Int = 100
) {
    private val cache = LinkedHashMap<K, V>(0, 0.75f, true)

    fun get(key: K): V? = cache[key]

    fun put(key: K, value: V) {
        if (cache.size >= maxSize) {
            cache.remove(cache.keys.first())
        }
        cache[key] = value
    }
}

Keş Etibarsızlaşdırma Strategiyaları

TTL keşi (Time To Live) müəyyən vaxt intervalından sonra avtomatik olaraq girişi silir — API məlumatları üçün uyğundur. Hadisə əsaslı etibarsızlaşdırma dəyişikliklər haqqında push bildirişi alındıqda keşi təmizləyir. Mobil tətbiqlərdə keşləmə strategiyasının seçimi məlumat növündən asılıdır: şəkillər uzun müddət keşlənir, xəbər lenti isə tez-tez etibarsızlaşdırma tələb edir. Android-də Coil və iOS-da Kingfisher artıq şəkillərlə iş üçün LRU Cache-i inteqrasiya etmişdir.

Oflayn Növbə: Offline Queue və Sync Manager

Offline Queue — cihaz oflayn olduqda istifadəçi əməliyyatlarını (yaratma, yeniləmə, silmə) yerli verilənlər bazasında saxlayan məlumat strukturudur. Bağlantı bərpa edildikdə, Sync Manager bu əməliyyatları ardıcıl olaraq serverə tətbiq edir. Bu tip məlumat sinxronizasiyası müvəqqəti şəbəkə itkisi zamanı heç bir dəyişikliyin itirilməməsinə zəmanət verir. Mobil inkişafda Offline Queue qeyri-sabit bağlantısı olan tətbiqlər üçün kritik komponentdir.

Offline Queue Arxitekturası

Növbə Room və ya SwiftData-da bir cədvəl üzərində qurulur və sahələri: əməliyyat növü, JSON sorğu gövdəsi, vaxt damğası və status. Sync Manager — gözləməli əməliyyatları emal edən, serverə göndərən, statusu yeniləyən və uğurlu girişləri silən fon xidmətidir. Android-də WorkManager və ya iOS-da BGTaskScheduler vasitəsilə məlumat sinxronizasiyası cihaz yenidən başladıldıqdan sonra da davam edir. Düzgün məlumat idarəetmə ilə Offline Queue istifadəsi problemsiz istifadəçi təcrübəsi təmin edir.

Kotlin-də Offline Queue Nümunəsi

kotlin
@Entity
data class SyncOperation(
    @PrimaryKey val id: Long,
    val endpoint: String,
    val method: String,
    val body: String,
    val createdAt: Long
)

class SyncManager(
    private val dao: SyncOperationDao,
    private val api: ApiService
) {
    suspend fun syncPending() {
        dao.getPendingOperations().forEach { op ->
            try {
                api.execute(op.endpoint, op.method, op.body)
                dao.delete(op.id)
            } catch (e: Exception) {
                // retry on next cycle
            }
        }
    }
}

Təkrar Cəhd Siyasəti və Vaxt Aşımları

Təkrar cəhdlər arasında eksponensial geriləmə (1s, 2s, 4s, 8s) serveri izdihamdan qoruyur və sonsuz təkrar cəhdlərin qarşısını alır. 5 cəhd həddi növbənin daşmasının qarşısını alır. Server tərəfi idempotentlik dəstəyi ilə mobil tətbiqlərdə məlumat sinxronizasiyası təkrarların qarşısını alaraq təhlükəsiz təkrar cəhdlərə imkan verir. Bu, xüsusilə maliyyə əməliyyatları və sifarişlər üçün vacibdir.

Məlumat Sinxronizasiyası: Conflict Resolution və Schema Migration

Conflict Resolution — eyni məlumatların müxtəlif cihazlarda eyni anda dəyişdirildiyi hallar üçün strategiyalar toplusudur. Əsas məlumat sinxronizasiyası bir yanaşma seçməyi tələb edir: Last-Write-Wins (son yazı qalib gəlir), versiyalaşdırma (yüksək versiya qalib gəlir) və ya əl ilə həll. Mürəkkəb ssenarilərdə məlumatların riyazi yaxınlaşmasını təmin edən CRDT (Conflict-Free Replicated Data Types) istifadə olunur.

Münaqişə Həlli Strategiyaları

Last-Write-Wins tətbiqi ən sadədir, lakin istifadəçi dəyişikliklərini itirə bilər. Version Vector — hər bir yazı versiya nömrəsi və cihaz identifikatoru saxlayır; versiyalar uyğun gəlmədikdə münaqişə yaranır. CRDT ən etibarlı, lakin mürəkkəb strategiyadır: məlumatlar mərkəzləşdirilmiş koordinator olmadan riyazi olaraq vahid vəziyyətə yaxınlaşır. CRDT əsaslı mobil tətbiqlərdə məlumat sinxronizasiyası Google Docs-da birgə redaktə və Notion qeyd sinxronizasiyasında istifadə olunur.

Schema Migration: Təhlükəsiz Verilənlər Bazası Yeniləməsi

Tətbiq yeniləndikdə, yerli verilənlər bazası strukturu dəyişir: sütunlar, cədvəllər, indekslər əlavə olunur. Schema Migration — məlumat itkisi olmadan mövcud verilənlər bazasının yeni sxemə çevrilməsi prosesidir. Room köhnə və yeni versiya ilə Migration sinfi vasitəsilə miqrasiyaları dəstəkləyir. SwiftData dəyişiklikləri təsvir etmək üçün VersionedSchema istifadə edir. Tətbiq versiyaları arasında düzgün məlumat sinxronizasiyası miqrasiyaların idempotent şəkildə sınaqdan keçirilməsini tələb edir.

Room-da Schema Migration Nümunəsi

kotlin
val migration1to2 = object : Migration(1, 2) {
    override fun migrate(database: SupportSQLiteDatabase) {
        database.execSQL("ALTER TABLE users ADD COLUMN avatar_url TEXT")
    }
}

@Database(
    entities = [User::class],
    version = 2
)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}

Swift-də Conflict Resolution Nümunəsi

swift
enum ConflictStrategy {
    case lastWriteWins
    case versionVector
    case crdt
}

struct VersionedDocument {
    let id: String
    let version: Int
    let data: Data
    let editedBy: String
    
    func resolve(with remote: VersionedDocument) -> VersionedDocument {
        return version >= remote.version ? self : remote
    }
}

Yerli Depolama üçün Room və SwiftData

Room — Android-də yerli depolama üçün Google kitabxanası, SQLite üzərində qurulmuş və deklarativ sorğu təsvirləri üçün annotasiyalar təmin edir. SwiftData — iOS, macOS, watchOS və visionOS üçün Apple freymvorku, qısa Swift Macro sintaksisi ilə Core Data-nın varisidir. Hər iki alət cihazda məlumatlarla iş tapşırığını həll edir, lakin kod təşkili üçün fərqli yanaşmalarla. Mobil tətbiqlərdə keş çox vaxt məhz bu texnologiyalar üzərində qurulur.

Room: DAO, Entities və Type Converters

Room cədvəllər üçün @Entity annotasiyalarından və sorğular üçün @Dao-dan istifadə edir. DAO kompilə zamanı yoxlama ilə bütün SQL əməliyyatlarını inkapsulə edir — SQL sintaksis səhvlər işə salınmadan əvvəl aşkarlanır. Type Converter mürəkkəb tipləri (Date, List) SQLite primitivlərinə çevirir. Android tətbiqlərində müasir məlumat idarəetmə Room + Flow ətrafında qurulur, keş və ya yerli verilənlər bazası dəyişdikdə reaktiv UI yeniləmələri təmin edir.

SwiftData: @Model və @Query

SwiftData varlıqları təyin etmək üçün makro @Model-dən və məlumatları müşahidə etmək üçün @Query-dən istifadə edir. Freymvork avtomatik olaraq asılılıqları izləyir və dəyişikliklərdə interfeysi yeniləyir. Sxem miqrasiyası bütün versiyaları təsvir edən VersionedSchema istifadə edir. SwiftData və server arasında məlumat sinxronizasiyası @Query vasitəsilə yeniləmələrə abunə olan fərdi Sync Manager vasitəsilə tətbiq edilir.

SwiftData-da Model Nümunəsi

swift
@Model
final class UserModel {
    var id: String
    var name: String
    var email: String
    var updatedAt: Date
    
    init(id: String, name: String, email: String) {
        self.id = id
        self.name = name
        self.email = email
        self.updatedAt = Date()
    }
}

Room vs SwiftData Müqayisəsi

MeyarRoomSwiftData
PlatformaAndroidApple (iOS, macOS, visionOS)
ƏsasSQLiteSQLite (Core Data yığını)
SintaksisKotlin annotasiyalarıSwift Macro
MiqrasiyalarMigration sinfiVersionedSchema
ReaktivlikFlow / LiveData@Query property wrapper
Çarpaz platformaYalnız AndroidYalnız Apple

Tez-tez Verilən Suallar

LRU Cache nədir?

LRU Cache — limitə çatdıqda ən az istifadə edilmiş elementi silən keşləmə alqoritmidir. Mobil tətbiqlərdə şəkillər və API məlumatları üçün istifadə olunur.

Offline Queue necə işləyir?

Offline Queue şəbəkə olmadıqda istifadəçi əməliyyatlarını yerli verilənlər bazasında saxlayır. Sync Manager bağlantı bərpa edildikdə onları icra edir, dəyişikliklərin serverə çatdırılmasını təmin edir.

Conflict Resolution nədir?

Conflict Resolution — məlumat sinxronizasiyası zamanı münaqişələrin həlli strategiyasıdır. Əsas yanaşmalar: Paylanmış sistemlər üçün Last-Write-Wins, Version Vector və CRDT.

Room yoxsa SwiftData — hansını seçməli?

Android üçün Room seçin — kompilə zamanı SQL yoxlaması olan yetkin kitabxana. iOS üçün — deklarativ sintaksis ilə SwiftData. Çarpaz platforma layihələri üçün SQLDelight və ya Realm uyğun olacaq.

Nə qədər tez-tez sinxronizasiya etməli?

Optimal məlumat sinxronizasiyası kritik əməliyyatlar üçün hər dəyişiklikdə və qalanları üçün fon rejimində hər 15-30 dəqiqədə bir aparılır. Anında çatdırılma üçün push bildirişlərindən istifadə edin.

Xülasə

  • Repository Remote və Local Data Source-u birləşdirir, məlumatlarla işdə vahid giriş nöqtəsi təmin edir
  • LRU Cache iki səviyyəli Memory + Disk Cache sistemi ilə şəbəkə sorğularını azaldır və məzmun yükləməni sürətləndirir
  • Offline Queue Sync Manager ilə müvəqqəti bağlantı itkisi zamanı dəyişikliklərin çatdırılmasına zəmanət verir
  • Conflict Resolution Version Vector və ya CRDT əsaslı paralel sinxronizasiya zamanı məlumat itkisinin qarşısını alır
  • Schema Migration istifadəçi məlumatlarını itirmədən təhlükəsiz yerli verilənlər bazası yeniləmələrini təmin edir
  • Room DAO ilə və SwiftData @Model ilə mobil inkişafda yerli depolama üçün standart həllərdir
  • Keşləmə və məlumat sinxronizasiyasına hərtərəfli yanaşma yüksək performanslı mobil tətbiqin əsasıdır

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et