Merge Strategy — məlumatların birləşdirilməsi strategiyası, burada müxtəlif versiyalardan olan ziddiyyətli dəyişikliklər bir versiyanı digəri ilə əvəz etmək əvəzinə vahid uzlaşdırılmış vəziyyətdə birləşdirilir. Last Write Wins-dən fərqli olaraq, birləşmə bütün budaqlardan dəyişiklikləri qorumağa çalışır, məlumat itkisini minimuma endirir. Apache CouchDB documentation, 2025 məlumatlarına görə, üçtərəfli birləşmə (three-way merge) sənəd yönümlü verilənlər bazalarında münaqişələrin həlli üçün standart mexanizmdir. Üçtərəfli birləşmə hər bir müştərinin hansı sahələri dəyişdiyini müəyyən etmək üçün ümumi əsas versiyadan istifadə edir.
Əsas məqamlar
Merge Strategy — bir versiyanı seçmək əvəzinə ziddiyyətli məlumat versiyalarını birləşdirən alqoritmlər toplusudur. Mobil tətbiqlərdə Merge iki müştəri müstəqil olaraq bir obyektin müxtəlif sahələrini və ya xüsusiyyətlərini redaktə etdikdə istifadə olunur. Köhnə versiyanı tamamilə atmaq əvəzinə (LWW-də olduğu kimi), sistem ayrı-ayrı sahələr səviyyəsində fərqlilikləri təhlil edir və hər iki versiyadan dəyişiklikləri özündə birləşdirən nəticə obyekti formalaşdırır.
Əsas fərq Merge ilə LWW arasında — hər bir istifadəçinin dəyişikliklərinin, onlar bir-birinə zidd olmadıqda qorunmasıdır. Əgər istifadəçi A tapşırığın adını, istifadəçi B isə təsvirini dəyişibsə, Merge hər iki dəyişikliyi qoruyacaq. Əgər hər ikisi eyni sahəni dəyişibsə — həll tələb edən münaqişə qeydə alınır. Bu, Merge-i istifadəçilərin eyni məlumatlar üzərində birgə işlədiyi tətbiqlər üçün üstünlüklü edir.
Stripe Engineering Blog (2025) hesabatına görə, Merge Strategy-nin LWW əvəzinə tətbiqi onların layihə idarəetmə mobil tətbiqində məlumat itkisi ilə bağlı istifadəçi şikayətlərinin sayını 76% azaldıb. Bununla belə, münaqişələrin emal müddəti 15–30 ms artıb ki, bu da məlumatların qorunması üçün məqbul qiymət hesab olunur.
Üçtərəfli birləşmə (three-way merge) — Merge Strategy-nin ən geniş yayılmış tətbiqidir. Mexanizm üç məlumat versiyası ilə işləyir: əsas (base — fərqlilikdən əvvəlki vəziyyət), yerli (local — cari müştərinin versiyası) və uzaq (remote — serverdən olan versiya). Sistem yerli və uzaq versiyaların hər bir sahəsini əsas versiya ilə müqayisə edərək hansı tərəfin hansı sahələri dəyişdiyini müəyyən edir.
Qərar qəbuletmə məntiqi sadədir: əgər sahəni yalnız bir müştəri dəyişibsə (əsas versiyaya nisbətən), onun dəyişikliyi avtomatik qəbul edilir. Əgər hər iki müştəri eyni sahəni dəyişibsə — avtomatik (prioritetə görə) həll edilə bilən və ya istifadəçiyə ötürülən münaqişə qeydə alınır. Əgər heç bir müştəri sahəni dəyişməyibsə — əsas dəyər qalır. Bu yanaşma müstəqil dəyişikliklərin itirilməməsini və münaqişə yaratmamasını təmin edir.
Sahə lüğəti səviyyəsində üçtərəfli birləşmə alqoritmi:
fun threeWayMerge(
base: Map<String, Any?>,
local: Map<String, Any?>,
remote: Map<String, Any?>
): Map<String, Any?> {
val result = base.toMutableMap()
val allKeys = base.keys + local.keys + remote.keys
allKeys.forEach { key ->
val baseVal = base[key]
val localVal = local[key]
val remoteVal = remote[key]
result[key] = when {
localVal == baseVal -> remoteVal
remoteVal == baseVal -> localVal
localVal == remoteVal -> localVal
else -> // həqiqi münaqişə
resolveConflict(key, localVal, remoteVal)
}
}
return result
}
threeWayMerge funksiyası ardıcıl olaraq üç versiyadan bütün açarları emal edir. Əgər yerli dəyər əsas dəyərlə üst-üstə düşürsə — uzaq dəyişiklik qəbul edilir. Əgər uzaq dəyər əsasla üst-üstə düşürsə — yerli dəyişiklik qəbul edilir. Əgər hər ikisi əsasdan fərqlənir, lakin bir-birinə bərabərdirsə — hər hansı biri qəbul edilir. Həqiqi münaqişə yalnız hər iki tərəfdən fərqli dəyişikliklər olduqda qeydə alınır.
Avtomatik həll dəyişikliklər kəsişmədikdə və ya sistem qaydalar əsasında düzgün dəyəri müəyyən edə bildikdə tətbiq olunur. Məsələn, rəqəm sahələri üçün maksimal dəyər, mətn sahələri üçün birləşdirmə və ya daha yeni versiya seçilə bilər. CouchDB JSON sənədinin sahələri üçün avtomatik birləşmədən, massivlər üçün isə dublikatların silinməsi ilə birləşdirmədən istifadə edir.
Əl ilə həll iki istifadəçi eyni sahəni fərqli şəkildə dəyişdikdə zəruridir. Bu halda tətbiq üç seçimli dialoq göstərir: “yerli versiyanı qəbul et”, “uzaq versiyanı qəbul et” və ya “əl ilə birləşdir”. CMU (Carnegie Mellon University, 2024) tədqiqatçıları qeyd edirlər ki, əl ilə həll istifadəçi məmnuniyyətini 40% azaldır, buna görə də avtomatik birləşmə maksimum dərəcədə artırılmalıdır.
Müxtəlif sahə növləri üçün həll strategiyaları:
| Sahə növü | Avtomatik strategiya | Əl ilə alternativ |
|---|---|---|
| Rəqəm (sayğac) | Maksimalı götür | Hər iki dəyəri göstər |
| Mətn (sətir) | Zamana görə seç | Vurğulayan redaktor |
| Məntiqi dəyər | Rollara görə prioritet | Üç seçim variantı |
| Massiv (siyahı) | Deduplikasiya ilə birləşdirmə | Element üzrə seçim |
| Daxili obyekt | Rekursiv birləşmə | Diff göstər |
Tətbiqi nəzərdən keçirək REST API vasitəsilə sinxronizasiya olunan mobil tətbiqdə istifadəçi profili üçün Merge Strategy. Profil ad, email, avatar və bildiriş parametrlərini ehtiva edir. Hər bir sahə istifadəçinin müxtəlif cihazlarında müstəqil şəkildə dəyişdirilə bilər.
Sahə səviyyəsində versiyalaşdırma ilə profil məlumat sinfi:
data class UserProfile(
val displayName: String,
val email: String,
val avatarUrl: String,
val notificationsEnabled: Boolean
)
data class ProfileSnapshot(
val profile: UserProfile,
val version: Int
)
fun mergeProfiles(
base: UserProfile,
local: UserProfile,
remote: UserProfile
): UserProfile {
return UserProfile(
displayName = if (local.displayName != base.displayName)
local.displayName else remote.displayName,
email = if (local.email != base.email)
local.email else remote.email,
avatarUrl = if (remote.avatarUrl != base.avatarUrl)
remote.avatarUrl else local.avatarUrl,
notificationsEnabled = if (local.notificationsEnabled != base.notificationsEnabled)
local.notificationsEnabled
else remote.notificationsEnabled
)
}
mergeProfiles funksiyası profil hər bir sahəsini müstəqil emal edərək, əsas versiyadan fərqlənən versiyanı seçir. Münaqişə zamanı (hər ikisi əsasdan fərqlənir) prioritet tətbiq qaydaları ilə müəyyən edilir. Nümunədə avatarUrl üçün uzaq versiyaya, qalan sahələr üçün isə yerli versiyaya üstünlük verilir.
CouchDB və PouchDB — Merge Strategy-nin daxili dəstəyi ilə ən məşhur verilənlər bazalarıdır. Sənədlərin replikasiyası zamanı CouchDB sənəd səviyyəsində münaqişələrin aşkarlanması ilə çoxaxınlı replikasiyadan istifadə edir. Əsas versiya reviziya tarixçəsində saxlanılır və münaqişə zamanı sistem bütün ziddiyyətli budaqları qoruyur və tətbiqə birləşmə mexanizmi vasitəsilə onların həlli üçün API təqdim edir.
Firebase Firestore-da Merge optimistik bloklama ilə transaksiyalar vasitəsilə həyata keçirilir. Tərtibatçı müəyyən sahələrin atomik şəkildə yenilənməli olduğunu göstərə bilər, FieldValue.serverTimestamp() və FieldValue.arrayUnion() istifadə edərək. Lakin Firestore tam üçtərəfli birləşməni dəstəkləmir — münaqişə zamanı transaksiya yeni məlumatlarla təkrarlanır, bu da həqiqi birləşmə deyil, təkrar cəhddir.
Kotlin Multiplatform və React Native üzərində mobil tətbiqlər üçün Merge Strategy müştəri tərəfində həyata keçirilir. Yerli verilənlər bazası (SQLite, Realm) hər bir sənədin versiyasını saxlayır və sinxronizasiya zamanı müştəri serverdən versiyanı yükləyir və nəticəni göndərməzdən əvvəl yerli olaraq birləşməni həyata keçirir. Bu yanaşma, daha çox münaqişənin yığıldığı uzunmüddətli oflayn iş zamanı belə məlumatların qorunmasını təmin edir.
Tez-tez verilən suallar
Merge Strategy — müxtəlif versiyalardan dəyişikliklərin vahid vəziyyətdə birləşdirildiyi münaqişələrin həlli yanaşmasıdır. LWW-dən fərqli olaraq, Merge sahə səviyyəsində bir-birinə zidd olmadıqda hər iki budaqdan dəyişiklikləri qoruyur.
Üçtərəfli birləşmə hər bir müştərinin hansı sahələri dəyişdiyini müəyyən etmək üçün əsas versiyadan (fərqlilikdən əvvəlki vəziyyət) istifadə edir. İkitərəfli birləşmə yalnız iki versiyanı müqayisə edir, ilkin vəziyyəti bilmir, bu da daha tez-tez yalançı münaqişələrə səbəb olur.
CouchDB və PouchDB üçtərəfli birləşmə üçün daxili dəstəyə malikdir. Firebase Firestore transaksiya səviyyəsində tətbiq tələb edir. MongoDB və Realm optimistik bloklama mexanizmləri təklif edir, lakin tam avtomatik birləşməni deyil.
Merge uyğun deyil emal sürətinin vacib olduğu məlumatlar (saniyədə 1000-dən çox münaqişə), axın məlumatları (loglar, hadisələr) və dəyişikliklərin prinsipcə uyğunsuz olduğu hallar (məlumat sxeminin müxtəlif versiyaları) üçün. Bu hallarda LWW və ya CRDT daha effektivdir.
Tətbiq üç mərhələdən ibarətdir: serverdən məlumat yüklənərkən əsas versiyanın saxlanması, yadda saxlanarkən sahə səviyyəsində dəyişikliklərin aşkarlanması və sinxronizasiya zamanı birləşmə alqoritminin çağırılması. Sadələşdirmək üçün JSON Patch və ya CRDT kitabxanalarından istifadə edin.
Nəticə
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.
Həm də oxuyun