Merge Strategy — nedir, birleştirme türleri ve çalışma prensibi

Yazar: IT Sectr Yayınlanma: 2026-06-14 Okuma süresi: 8 dk

Merge Strategy, farklı sürümlerden çakışan değişikliklerin bir sürümü diğeriyle değiştirmek yerine tek bir tutarlı durumda birleştirildiği bir veri birleştirme stratejisidir. Last Write Wins'in aksine, birleştirme veri kaybını en aza indirirken tüm dallardaki değişiklikleri korumaya çalışır. Apache CouchDB dokümantasyonu, 2025'e göre, üç yönlü birleştirme (three-way merge), belge odaklı veritabanlarında standart çakışma çözüm mekanizmasıdır. Üç yönlü birleştirme, her istemci tarafından hangi alanların değiştirildiğini belirlemek için ortak bir temel sürüm kullanır.

Önemli Noktalar

  • Merge Strategy, çakışan değişikliklerin değiştirilmek yerine birleştirildiği ve kullanıcı verisi kaybını en aza indiren bir yaklaşımdır.
  • Üç yönlü birleştirme, yerel, uzak ve temel sürümleri analiz ederek alan düzeyinde çakışmayan değişiklikleri otomatik olarak çözer.
  • Geçmiş depolama — Birleştirme, farklılıkları tespit etmek için önceki sürümlerin saklanmasını gerektirir, bu da depolanan veri miktarını artırır.
  • Karmaşıklık — Birleştirme, özellikle iç içe yapılar ve dizilerdeki çakışmaları çözmek için LWW'den daha zor uygulanır.
  • Uygulama — her alanın bağımsız bir değere sahip olduğu profiller, belgeler, formlar ve diğer yapılandırılmış veriler için idealdir.

Mobil geliştirmede Merge Strategy nedir?

Merge Strategy, çakışan veri sürümlerinden birini seçmek yerine bunları birleştiren bir algoritma kümesidir. Mobil uygulamalarda, iki istemci aynı nesnenin farklı alanlarını veya özelliklerini bağımsız olarak düzenlediğinde Birleştirme kullanılır. Eski sürümü tamamen atmak yerine (LWW'de olduğu gibi), sistem tek tek alanlar düzeyinde farklılıkları analiz eder ve her iki sürümden değişiklikleri içeren bir sonuç nesnesi üretir.

Temel fark, Birleştirme ile LWW arasında, her kullanıcının değişikliklerinin birbiriyle çelişmemesi koşuluyla korunmasıdır. Kullanıcı A görev adını değiştirdiyse ve kullanıcı B açıklamayı değiştirdiyse, Birleştirme her iki değişikliği de korur. Her ikisi de aynı alanı değiştirdiyse — çözüm gerektiren bir çakışma kaydedilir. Bu, Birleştirme'yi kullanıcıların aynı veriler üzerinde işbirliği içinde çalıştığı uygulamalar için tercih edilir hale getirir.

Stripe Engineering Blog'a (2025) göre, LWW yerine Merge Strategy uygulamak, mobil proje yönetimi uygulamalarında veri kaybıyla ilgili kullanıcı şikayetlerinin sayısını %76 oranında azaltmıştır. Ancak, çakışma işleme süresi 15–30 ms artmıştır, bu da veri bütünlüğü için kabul edilebilir bir bedel olarak kabul edilir.

Üç yönlü birleştirme: mekanizma nasıl çalışır

Üç yönlü birleştirme (three-way merge), Merge Strategy'nin en yaygın uygulamasıdır. Mekanizma, üç veri sürümüyle çalışır: temel (ayrışmadan önceki durum), yerel (mevcut istemcinin sürümü) ve uzak (sunucu sürümü). Sistem, hangi tarafın hangi alanları değiştirdiğini belirlemek için yerel ve uzak sürümlerin her alanını temel ile karşılaştırır.

Karar mantığı basittir: yalnızca bir istemci bir alanı değiştirdiyse (temel sürüme göre), değişikliği otomatik olarak kabul edilir. Her iki istemci de aynı alanı değiştirdiyse — otomatik olarak (önceliğe göre) çözülebilen veya kullanıcıya devredilebilen bir çakışma kaydedilir. Hiçbir istemci alanı değiştirmediyse — temel değer kalır. Bu yaklaşım, bağımsız değişikliklerin ne kaybolmasını ne de çakışmasını garanti eder.

Alan sözlüğü düzeyinde üç yönlü birleştirme algoritması:

kotlin
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 -> // real conflict
                resolveConflict(key, localVal, remoteVal)
        }
    }
    return result
}

threeWayMerge işlevi, üç sürümdeki tüm anahtarları sırayla işler. Yerel değer temel ile eşleşirse — uzak değişiklik kabul edilir. Uzak değer temel ile eşleşirse — yerel değişiklik kabul edilir. Her ikisi de temelden farklı ancak birbirine eşitse — herhangi biri kabul edilir. Gerçek bir çakışma yalnızca her iki tarafta farklı değişiklikler olduğunda kaydedilir.

Otomatik ve manuel çakışma çözümü

Otomatik çözüm, değişiklikler örtüşmediğinde veya sistem kurallara dayalı olarak doğru değeri belirleyebildiğinde uygulanır. Örneğin, sayısal alanlar için maksimum değer seçilebilir, metin alanları için — birleştirme veya daha yeni sürüm. CouchDB, JSON belge alanları için otomatik birleştirme kullanır ve diziler için — yinelenenleri kaldırarak birleştirme.

Manuel çözüm, iki kullanıcı aynı alanı farklı şekilde değiştirdiğinde gereklidir. Bu durumda, uygulama üç seçenekli bir iletişim kutusu gösterir: \u201cyerel sürümü kabul et\u201d, \u201cuzak sürümü kabul et\u201d veya \u201cmanuel olarak birleştir\u201d. CMU (Carnegie Mellon Üniversitesi, 2024) araştırmasına göre, manuel çözüm kullanıcı memnuniyetini %40 azaltır, bu nedenle otomatik birleştirme maksimize edilmelidir.

Farklı alan türleri için çözüm stratejileri:

Alan türüOtomatik stratejiManuel alternatif
Sayı (sayaç)Maksimumu alHer iki değeri göster
Metin (dize)Zamana göre seçVurgulanmış düzenleyici
BooleanRollere göre öncelikÜç seçim seçeneği
Dizi (liste)Tekrarlananları kaldırarak birleştirÖğe bazında seçim
İç içe nesneÖzyinelemeli birleştirmeFarkı göster

Kotlin'de birleştirme uygulama örnekleri

Uygulamayı inceleyelim, REST API üzerinden senkronizasyonlu bir mobil uygulamada kullanıcı profili için Merge Strategy. Profil, ad, e-posta, avatar ve bildirim ayarlarını içerir. Her alan, kullanıcının farklı cihazlarında bağımsız olarak değiştirilebilir.

Alan düzeyinde sürümleme ile profil veri sınıfı:

kotlin
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 işlevi, profilin her alanını bağımsız olarak işleyerek temelden farklı olan sürümü seçer. Çakışma durumunda (her ikisi de temelden farklı), öncelik uygulama kurallarına göre belirlenir. Örnekte, avatarUrl için uzak sürüme öncelik verilir, kalan alanlar için — yerel sürüme.

Mobil uygulama veritabanlarında Merge Strategy

CouchDB ve PouchDB, yerleşik Merge Strategy desteğine sahip en bilinen veritabanlarıdır. Belge çoğaltma sırasında CouchDB, belge düzeyinde çakışma tespiti ile çok iş parçacıklı çoğaltma kullanır. Temel sürüm, revizyon geçmişinde saklanır ve çakışma durumunda sistem tüm çakışan dalları korur ve uygulamaya birleştirme mekanizması aracılığıyla bunları çözmek için bir API sağlar.

Firebase Firestore'da birleştirme, iyimser kilitleme ile işlemler aracılığıyla uygulanır. Geliştirici, belirli alanların FieldValue.serverTimestamp() ve FieldValue.arrayUnion() kullanılarak atomik olarak güncellenmesi gerektiğini belirtebilir. Ancak Firestore, tam üç yönlü birleştirmeyi desteklemez — çakışma durumunda işlem yeni verilerle yeniden denenir, bu gerçek bir birleştirmeden çok bir yeniden denemeye eşdeğerdir.

Kotlin Multiplatform ve React Native üzerindeki mobil uygulamalar için Merge Strategy, istemci tarafında uygulanır. Yerel veritabanı (SQLite, Realm) her belgenin sürümünü saklar ve senkronizasyon sırasında istemci sunucu sürümünü yükler ve sonucu göndermeden önce yerel olarak birleştirme yapar. Bu yaklaşım, daha fazla çakışmanın biriktiği uzun süreli çevrimdışı çalışma sırasında bile veri bütünlüğünü sağlar.

Sıkça Sorulan Sorular

Veri senkronizasyonunda Merge Strategy nedir?

Merge Strategy, farklı sürümlerdeki değişikliklerin tek bir durumda birleştirildiği bir çakışma çözümü yaklaşımıdır. LWW'nin aksine, birleştirme, alan düzeyinde birbiriyle çelişmiyorlarsa her iki daldaki değişiklikleri de korur.

Üç yönlü ve iki yönlü birleştirme arasındaki fark nedir?

Üç yönlü birleştirme, her istemcinin hangi alanları değiştirdiğini belirlemek için bir temel sürüm (ayrışmadan önceki durum) kullanır. İki yönlü birleştirme, orijinal durumu bilmeden yalnızca iki sürümü karşılaştırır ve bu da daha sık yanlış çakışmalara yol açar.

Hangi veritabanları birleştirmeyi doğal olarak destekler?

CouchDB ve PouchDB yerleşik üç yönlü birleştirme desteğine sahiptir. Firebase Firestore, işlem düzeyinde uygulama gerektirir. MongoDB ve Realm iyimser kilitleme mekanizmaları sunar ancak tam otomatik birleştirme sunmaz.

Merge Strategy ne zaman uygun değildir?

Birleştirme uygun değildir işlem hızının kritik olduğu veriler (saniyede 1000'den fazla çakışma), akış verileri (günlükler, olaylar) ve değişikliklerin temelde uyumsuz olduğu durumlar (farklı şema sürümleri) için uygun değildir. Bu durumlarda LWW veya CRDT daha verimli olacaktır.

Mobil uygulamada Merge Strategy nasıl uygulanır?

Uygulama üç adım içerir: sunucudan veri yüklerken temel sürümü saklama, kaydederken alan düzeyinde değişiklikleri tespit etme ve senkronizasyon sırasında birleştirme algoritmasını çağırma. Basitleştirmek için JSON Patch veya CRDT kütüphanelerini kullanın.

Özet

  • Merge Strategy, bir sürümü diğeriyle değiştirmek yerine farklı veri sürümlerinden gelen değişiklikleri birleştiren bir çakışma çözüm stratejisidir.
  • Üç yönlü birleştirme, değiştirilen alanları belirlemek için temel, yerel ve uzak sürümleri kullanan en popüler uygulamadır.
  • Otomatik çözüm, çakışmayan değişiklikler için uygulanır (farklı alanlar, istemcilerden biri verileri değiştirmedi).
  • Manuel çözüm, bir alan iki istemci tarafından değiştirildiğinde gereklidir, ancak kullanıcı memnuniyetini %40 azaltır.
  • Avantaj — minimum veri kaybı ve belgeler üzerinde işbirliği içinde çalışırken daha iyi kullanıcı deneyimi.
  • Dezavantaj — artırılmış uygulama karmaşıklığı ve yerel veritabanında sürüm geçmişinin ek depolanması.
  • Öneri — profiller, belgeler ve yapılandırmalar için Birleştirme kullanın. Meta veriler ve günlükler için daha basit bir alternatif olarak LWW kullanın.

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun