Değişiklik akışlarıyla gerçek zamanlı verileri okuma

MongoDB uyumlu Firestore için Değişiklik Akışları, uygulamaların bir koleksiyonda veya veritabanının tamamında yapılan gerçek zamanlı değişikliklere (eklemeler, güncellemeler ve silmeler) erişmesine olanak tanır. Değişiklik akışı, güncellemeleri değiştirilme zamanına göre sıralar.

Değişiklik akışlarına, MongoDB uyumlu API'ler ve geleneksel MongoDB sürücüleri aracılığıyla erişilebilir. MongoDB uyumlu Firestore'un Değişiklik Akışları uygulaması, yazma ve okuma işlemlerinde otomatik bölümleme ile okuma paralelliğinin benzersiz bir uygulaması sayesinde herhangi bir yazma ve okuma işleme hızını yönetebilir. Bu sayede yüksek işleme hızlı iş yükleri oluşturabilirsiniz. Ayrıca, Cloud Firestore ile diğer depolama çözümleri arasındaki taşıma ve veri senkronizasyonu altyapısını da iyileştirebilirsiniz.

MongoDB sürücüleriyle uyumluluğun yanı sıra, Değişiklik Akışlarını paralel olarak okumak için Cloud Firestore kullanabilirsiniz. Bu sayede paralel ve yüksek işleme hızlı okuma iş yükleri oluşturabilirsiniz. Her akış, sonuçların iyi dağıtılmış bir bölümünü temsil eder.

Değişiklik Akışları aşağıdaki özellikleri destekler:

  • Veritabanı veya koleksiyon kapsamlı, yapılandırılabilir değişiklik akışları.
  • Oluşturma sırasında belirtilen bir değişiklik akışının saklama süresi. Varsayılan saklama süresi 7 gün, minimum saklama süresi ise 1 gündür. Saklama süresi, en fazla 7 gün olmak üzere 1 günün katları şeklinde olmalıdır. Saklama süresi, oluşturulduktan sonra değiştirilemez. Saklama süresini değiştirmek için değişiklik akışını bırakıp yeniden oluşturmanız gerekir.
  • delete, insert, update ve drop, db.collection.watch() ve db.watch() kullanılarak gözlemlenebilen değişiklik etkinlikleridir.
  • updateDescription.updatedFields, güncelleme farklılıkları içeriyor.
  • Tüm fullDocument ve fullDocumentBeforeChange seçenekleri.
    • Güncellemeler için tam belge aranıyor.
    • Belgenin değiştirilmeden, güncellenmeden veya silinmeden önceki görüntüsü.
    • Belgenin değiştirildikten veya güncellendikten sonraki resmi.
    • Bir saatten eski olan öncesi ve sonrası görüntüleri için belirli bir noktadan önceyi kurtarma (PITR) özelliğinin etkinleştirilmesi gerekir.
  • resumeAfter ve startAfter dahil olmak üzere tüm devam ettirme seçenekleri.
  • Değişiklikleri gözlemlemek için watch()'yı kullanırken $addFields, $match, $project, $replaceRoot, $replaceWith, $set ve $unset gibi toplama aşamalarını zincirleyebilirsiniz.

Değişiklik akışlarını yapılandırma

Bir veritabanı için mevcut değişiklik akışlarını oluşturmak, bırakmak veya görüntülemek üzere Google Cloud Console'u kullanın.

Roller ve izinler

Bir asıl, değişiklik akışlarını oluşturmak, silmek ve listelemek için sırasıyla datastore.schemas.create, datastore.schemas.delete ve datastore.schemas.list Identity and Access Management (IAM) izinlerine sahip olmalıdır.

Örneğin, Datastore Dizini Yöneticisi (roles/datastore.indexAdmin) rolü şu izinleri verir.

Değişiklik akışı oluşturma

İlgili bir değişiklik akışı imlecini açabilmeniz için önce değişiklik akışı oluşturmanız gerekir. Toplama veya veritabanı oluşturma sırasında otomatik değişiklik akışı etkinleştirme desteklenmez.

Değişiklik akışı oluşturmak için Google Cloud Console'u kullanın.

  1. Google Cloud Console'da Veritabanları sayfasına gidin.

    Veritabanları'na gidin

  2. Listeden MongoDB uyumlu bir Firestore veritabanı seçin. Firestore Studio paneli açılır.
  3. Gezgin panelinde Değişiklik akışları düğümünü bulun, Diğer işlemler'i tıklayın ve Değişiklik akışı oluştur'u seçin.
  4. Benzersiz bir değişiklik akışı adı, kapsamı ve saklama süresi girip Kaydet'i tıklayın.

Değişiklik akışlarını görüntüleme

Değişiklik Akışları ile ilgili ayrıntıları Google Cloud Console'da görüntüleyebilirsiniz.

  1. Google Cloud Console'da Veritabanları sayfasına gidin.

    Veritabanları'na gidin

  2. Listeden MongoDB uyumlu bir Firestore veritabanı seçin. Firestore Studio paneli açılır.
  3. Gezgin panelinde Değişiklik akışları düğümünü bulun.
  4. Düğümü açmak veya kapatmak için Düğümü aç/kapat'ı tıklayın.

Değişiklik akışını silme

Değişiklik akışını silmek için Google Cloud Console'u kullanın.

  1. Google Cloud Console'da Veritabanları sayfasına gidin.

    Veritabanları'na gidin

  2. Listeden MongoDB uyumlu bir Firestore veritabanı seçin. Firestore Studio paneli açılır.
  3. Gezgin panelinde Değişiklik akışları düğümünü bulun.
  4. Düğümü açmak veya kapatmak için Düğümü aç/kapat'ı tıklayın.
  5. Gezgin'de silmek istediğiniz değişiklik akışını bulun.
  6. Diğer işlemler'i tıklayın ve Değişiklik akışını sil'i seçin.
  7. İletişim kutusunda, silme işlemini onaylamak için değişiklik akışı adını girin ve Sil'i tıklayın.

Bir değişiklik akışı imlecini açma veya devam ettirme

Aşağıdaki örneklerde, değişiklik akışı imlecinin nasıl oluşturulacağı, devam ettirileceği ve yapılandırılacağı gösterilmektedir.

Değişiklik akışı imleci oluşturmadan önce veritabanı veya koleksiyon için açıkça değişiklik akışı oluşturmanız gerekir.

Değişiklik akışı imleci oluşturma

Yeni bir değişiklik akışı imleci oluşturmak için MongoDB sürücülerinde watch yöntemini kullanın. Bir veritabanındaki tüm değişiklikleri dinlemek için veritabanı kapsamlı bir değişiklik akışı oluşturun ve watch yöntemini db nesnesinde çağırın.

let cursor = db.watch()

Bir koleksiyonla sınırlı bir imleç oluşturmak için önce bu koleksiyon için bir değişiklik akışı oluşturmanız gerekir. Ardından, ilgili koleksiyonda watch yöntemini çağırın.

let cursor = db.my_collection.watch()

Değişiklik akışı imleci oluşturduğunuza göre artık yayın yapmaya başlayabilirsiniz. Örneğin, bir belge ekleyip imleçte tryNext çağrısı yaptığınızda değişikliğin değişiklik akışında göründüğünü görürsünüz.

let doc = db.my_collection.insertOne({value: "hello world"})
console.log(cursor.tryNext())

Dokümanı güncelleyip silerseniz bu değişikliklerin değişiklik akışında göründüğünü görürsünüz:

db.my_collection.updateOne({"_id": doc.insertedId}, {$set: {value: "hello world!"}})
db.my_collection.deleteOne({"_id": doc.insertedId}})

// Prints the update event
console.log(cursor.tryNext())

// Prints the delete event
console.log(cursor.tryNext())

Değişiklik akışını sürdürme

Bir değişiklik akışını devam ettirmek için resumeAfter veya startAfter seçeneklerini kullanın. resumeAfter ve startAfter değişiklik günlüklerinde hangi noktadan devam edeceğinizi belirlemek için devam jetonu kullanın.

// Create a cursor and add one event to the change stream.
let cursor = db.my_collection.watch();
db.my_collection.insertOne({value: "hello world"});
let event = cursor.tryNext();

// Get the resume token from the event.
let resumeToken = event._id;

// Add a new event to the change stream.
db.my_collection.insertOne({value: "foobar"});

// Create a new cursor by using the resume token as a starting point.
let newCursor = db.my_collection.watch({resumeAfter: resumeToken})

// Log the change event containing the "foobar" value.
console.log(newCursor.tryNext())

startAfter uygulamasını kullanmak için:

// Start after the resume token.
let startAfterCursor = db.my_collection.watch({startAfter: resumeToken})

Güncellemelere ve silme işlemine öncesi ve sonrası resimlerini dahil etme

Gerekirse güncelleme ve silme değişiklik etkinliklerine dokümanların öncesi ve sonrası resimlerini ekleyebilirsiniz. Görüntü kullanılabilirliği, belirli bir noktadan önceyi kurtarma (PITR) penceresine tabidir. Bir saatten eski belge resimlerini okumak için PITR'yi etkinleştirmeniz gerekir.

Değişiklik akışları, belirli bir değişiklik etkinliğinden önce ve sonraki doküman görünümünü sağlamak için PITR aralığından yararlanır. Varsayılan olarak, güncelleme etkinlikleri, güncelleme işlemiyle değiştirilen alanların farkı olan bir updateDescription alanı içerir.

Öncesi ve sonrası resimlerini bir değişiklik etkinliğine dahil etmek için değişiklik akışı sorgusunda fullDocumentBeforeChange ve fullDocument seçeneklerini belirtmeniz gerekir.

let cursor = db.my_collection.watch({
  "fullDocument": "required",
  "fullDocumentBeforeChange": "required"
})

Sorgu, PITR saklama penceresinin dışındaki bir dokümanı okumaya çalışırsa veya PITR etkin değilse required değeri sunucu tarafında bir hata mesajı verir.

Hata oluşturmak yerine, resimler artık kullanılamıyorsa whenAvailable değerini kullanarak null değeri döndürebilirsiniz.

let cursor = db.my_collection.watch({
  "fullDocument": "whenAvailable",
  "fullDocumentBeforeChange": "whenAvailable"
})

Güncellemelere mevcut resmi dahil etme

Varsayılan olarak, güncelleme etkinlikleri, güncelleme işlemiyle değiştirilen alanların farkı olan bir updateDescription alanı içerir. Bunun yerine dokümanın tamamının en güncel sürümünü aramak için updateLookup seçeneğindeki fullDocument değerini kullanın.

Bu özellik için PITR gerekmez ve doküman için arama yapılır.

let cursor = db.my_collection.watch({
  "fullDocument": "updateLookup",
})

Paralel Okuma

Verim hızını artırmak için firestoreWorkerConfig seçeneğini kullanarak bir değişiklik akışı sorgusunu birden fazla çalışan arasında bölebilirsiniz. Her çalışan, farklı bir belge grubundaki değişiklikleri sunmaktan sorumludur. runCommand veya aggregate sorgusuyla paralel imleç oluşturmanız gerekir.

Örneğin, bir değişiklik akışını 3 çalışan arasında aşağıdaki gibi dağıtabilirsiniz:

let cursor1 = db.my_collection.aggregate([{
    "$changeStream": {
        "firestoreWorkerConfig": {numWorkers: 3, workerId: 0 }}
  }]);

let cursor2 = db.my_collection.aggregate([{
    "$changeStream": {
        "firestoreWorkerConfig": {numWorkers: 3, workerId: 1 }}
  }]);

let cursor3 = db.my_collection.aggregate([{
    "$changeStream": {
        "firestoreWorkerConfig": {numWorkers: 3, workerId: 2 }}
  }]);

Yayınları ve yedekleri değiştirme

Yedek geri yükleme işlemlerinde ne değişiklik akışı yapılandırması ne de değişiklik akışı verileri kullanılabilir. Değişiklik akışları içeren bir veritabanını geri yüklerseniz bu veritabanına imleç açmak için hedef veritabanında bu değişiklik akışlarını yeniden oluşturmanız gerekir.

Faturalandırma

Davranış farklılıkları

Aşağıdaki bölümde, MongoDB uyumlu Firestore ile MongoDB arasındaki değişiklik akışlarındaki farklılıklar açıklanmaktadır.

updateDescription

updateDescription, güncelleme işlemiyle güncellenen veya kaldırılan alanları açıklayan bir update etkinliğindeki dokümandır. In Cloud Firestore, the notable differences are that:

  • updateDescription içinde truncatedArrays ve disambiguatedPaths alanları doldurulmaz.
  • updateDescription.updatedFields Bir mutasyon uygulanmadan önce ve uygulandıktan sonraki bir belgenin önceki ve sonraki resimleri arasındaki kanonik farkı temsil eder.

Bir dokümanın aşağıdaki başlangıç durumunu düşünün:

db.my_collection.insertOne({
  _id: 1,
  root: {
    array: [{a: 1}, {b: 2}, {c: 3}]
  }
})

Senaryo 1: Dizinin yalnızca ilk öğesini değiştirin.

Bu senaryoda, Cloud Firestore davranışı MongoDB ile eşleşir.

db.my_collection.updateOne(
  {_id: 1},
  {'$set': {"root.array.0.a": 100}}
)

{
  updatedFields: {"root.array.0.a": 100},
  removedFields: []
}

2. senaryo: Dizinin tamamıyla üzerine yazma

Bu senaryoda işlem yalnızca ilk dizi alanını günceller ancak dizinin tamamının üzerine yazar.

Cloud Firestore güncelleme farkı bu iki senaryo arasında ayrım yapmaz ve her ikisi için de aynı updateDescription.updatedFields değerini döndürür:

db.my_collection.updateOne(
  {_id: 1},
  {'$set': {"root.array": [{a: 100}, {b: 2}, {c: 3}]}}
)

// In other implementations, updatedFields reflects the mutation itself
{
  updatedFields: {
    "root.array": [{a: 100}, {b: 2}, {c: 3}]
  },
  removedFields: []
}

// Firestore updatedFields is the diff between the before and after versions of the document
{
  updatedFields: {"root.array.0.a": 100},
  removedFields: []
}

Sırada ne var?