Geniş ölçekte gerçek zamanlı sorguları anlama

Sunucusuz uygulamanızı saniyede binlerce işlemin veya yüz binlerce eşzamanlı kullanıcının ötesinde ölçeklendirme yapma konusunda rehberlik için bu belgeyi okuyun. Bu belgede sistemi derinlemesine anlamanıza yardımcı olacak ileri düzey konular vardır. Cloud Firestore'u kullanmaya yeni başlıyorsanız hızlı başlangıç kılavuzuna göz atın.

Cloud Firestore ve Firebase mobil/web SDK'ları, istemci taraflı kodun doğrudan veritabanına eriştiği sunucusuz uygulamalar geliştirmek için güçlü bir model sunar. SDK'lar, müşterilerin verilerde yapılan güncellemeleri gerçek zamanlı olarak dinlemesini sağlar. Sunucu altyapısı gerektirmeyen duyarlı uygulamalar oluşturmak için gerçek zamanlı güncellemeleri kullanabilirsiniz. Bir şeyi çalışır durumda tutmak çok kolay olsa da Cloud Firestore'u oluşturan sistemlerdeki kısıtlamaları anlamanıza yardımcı olur. Böylece sunucusuz uygulamanız, trafik arttığında iyi ölçeklendirilir ve iyi performans gösterir.

Uygulamanızı ölçeklendirmeyle ilgili öneriler için aşağıdaki bölümlere bakın.

Kullanıcılarınıza yakın bir veritabanı konumu seçin

Aşağıdaki şemada gerçek zamanlı bir uygulamanın mimarisi gösterilmektedir:

Örnek gerçek zamanlı uygulama mimarisi

Kullanıcının cihazında çalışan bir uygulama (mobil veya web) Cloud Firestore ile bağlantı kurduğunda bağlantı, veritabanınızın bulunduğu bölgedeki bir Cloud Firestore ön uç sunucusuna yönlendirilir. Örneğin, veritabanınız us-east1 bölgesindeyse bağlantı us-east1 ürününde de bir Cloud Firestore ön ucuna gider. Bu bağlantılar uzun ömürlüdür ve uygulama tarafından açıkça kapatılana kadar açık kalır. Ön uç, temel Cloud Firestore depolama sistemlerindeki verileri okur.

Kullanıcının fiziksel konumu ile Cloud Firestore veri tabanı konumu arasındaki mesafe, kullanıcının yaşadığı gecikmeyi etkiler. Örneğin, Hindistan'da bulunan ve uygulaması Kuzey Amerika'daki bir Google Cloud bölgesindeki bir veritabanıyla iletişim kuran bir kullanıcının, veritabanının daha yakın bir konumda (ör. Hindistan veya Asya'nın başka bir bölgesinde) bulunduğu durumlara kıyasla deneyimi daha yavaş ve uygulamanın daha hızlı olduğunu fark edebilir.

Güvenilirlik sağlayacak tasarım

Aşağıdaki konular uygulamanızın güvenilirliğini iyileştirir veya etkiler:

Çevrimdışı modunu etkinleştir

Firebase SDK'ları çevrimdışı veri kalıcılığı sağlar. Kullanıcının cihazındaki uygulama Cloud Firestore'a bağlanamıyorsa uygulama, yerel olarak önbelleğe alınmış verilerle çalışarak kullanılabilir durumda kalır. Bu, kullanıcılar kesintili internet bağlantılarıyla karşılaşsa veya birkaç saat ya da gün boyunca erişimlerini tamamen kaybetse bile verilere erişim sağlar. Çevrimdışı mod hakkında daha fazla ayrıntı için Çevrimdışı verileri etkinleştirme bölümüne bakın.

Otomatik yeniden denemeleri anlama

Firebase SDK'ları, yeniden deneme işlemlerini ve bozuk bağlantıları yeniden kurmayı sağlar. Bu sayede, sunucuların yeniden başlatılmasından veya istemci ile veritabanı arasındaki ağ sorunlarından kaynaklanan geçici hataların çözülmesine yardımcı olur.

Bölgesel ve çok bölgeli konumlar arasında seçim yapın

Bölgesel ve çok bölgeli konumlar arasında seçim yaparken bazı ödünler vardır. Temel fark, verilerin nasıl kopyalandığıdır. Bu, uygulamanızın kullanılabilirlik garantilerini artırır. Çok bölgeli örnekler, daha güçlü sunma güvenilirliği sağlar ve verilerinizin dayanıklılığını artırır. Ancak bunun karşılığını alırsınız.

Gerçek zamanlı sorgu sistemini anlama

Anlık görüntü dinleyicileri olarak da adlandırılan gerçek zamanlı sorgular, uygulamanın veritabanındaki değişiklikleri dinlemesini ve veriler değişir değişmez düşük gecikmeli bildirimler almasını sağlar. Bir uygulama, veritabanını güncellemeler için düzenli olarak yoklayarak aynı sonucu alabilir. Ancak bu uygulama genellikle daha yavaş ve pahalıdır ve daha fazla kod gerektirir. Gerçek zamanlı sorguların nasıl ayarlanacağı ve kullanılacağı ile ilgili örnekler için Gerçek zamanlı güncellemeler alma bölümüne bakın. Aşağıdaki bölümlerde anlık görüntü işleyicilerin işleyişiyle ilgili ayrıntılar ve performansı korurken gerçek zamanlı sorguları ölçeklendirmeyle ilgili en iyi uygulamalardan bazıları açıklanmaktadır.

Mobil SDK'lardan biriyle oluşturulmuş bir mesajlaşma uygulaması aracılığıyla Cloud Firestore'a bağlanan iki kullanıcı düşünün.

A istemcisi, chatroom adlı bir koleksiyona doküman eklemek ve mevcut dokümanları güncellemek için veritabanına yazar:

collection chatroom:
    document message1:
      from: 'Sparky'
      message: 'Welcome to Cloud Firestore!'

    document message2:
      from: 'Santa'
      message: 'Presents are coming'

B istemcisi, anlık görüntü işleyici kullanarak aynı koleksiyondaki güncellemeleri dinler. Kullanıcı B, yeni bir mesaj oluşturduğunda anında bildirim alır. Aşağıdaki şemada, anlık görüntü işleyicinin arkasındaki mimari gösterilmektedir:

Anlık görüntü dinleyici bağlantısının mimarisi

İstemci B bir anlık görüntü işleyiciyi veritabanına bağladığında aşağıdaki etkinlik dizisi gerçekleşir:

  1. B İstemcisi, Cloud Firestore bağlantısını açar ve Firebase SDK'sı üzerinden onSnapshot(collection("chatroom")) çağrısı yaparak bir işleyici kaydeder. Bu dinleyici saat boyunca aktif kalabilir.
  2. Cloud Firestore ön ucu, veri kümesini önyüklemek için temel depolama sistemini sorgular. Eşleşen dokümanlardan oluşan sonuç kümesinin tamamını yükler. Buna anket sorgusu denir. Ardından sistem, kullanıcının bu verilere erişebildiğini doğrulamak için veritabanının Firebase Güvenlik Kuralları'nı değerlendirir. Kullanıcı yetkilendirilmişse veritabanı, verileri kullanıcıya döndürür.
  3. Ardından B istemcisinin sorgusu dinleme moduna geçer. Dinleyici bir abonelik işleyici ile kayıt yaptırır ve veri güncellemelerini bekler.
  4. A istemcisi artık bir dokümanda değişiklik yapmak için yazma işlemi gönderir.
  5. Veritabanı, belge değişikliğini depolama sistemine kaydeder.
  6. İşlemsel olarak sistem, aynı güncellemeyi dahili bir değişiklik günlüğüne kaydeder. Değişiklik günlüğü, değişikliklerin gerçekleştiği sırada katı bir sıralama oluşturur.
  7. Değişiklik günlüğü, güncellenmiş verileri bir abonelik işleyiciler havuzuna gönderir.
  8. Güncellenen dokümanın, şu anda kayıtlı anlık görüntü işleyicilerle eşleşip eşleşmediğini görmek için ters sorgu eşleştirici yürütülür. Bu örnekte belge, İstemci B'nin anlık görüntü işleyicisi ile eşleşir. Adından da anlaşılacağı gibi, ters sorgu eşleştiriciyi normal bir veritabanı sorgusu olarak düşünebilirsiniz, ancak bu işlemin tersi yapılır. Bir sorguyla eşleşenleri bulmak için dokümanlarda arama yapmak yerine, gelen bir dokümanla eşleşenleri bulmak için sorgularda verimli bir şekilde arama yapar. Bir eşleşme bulduğunda sistem, söz konusu belgeyi anlık görüntü dinleyicilerine iletir. Ardından sistem, verileri yalnızca yetkili kullanıcıların aldığından emin olmak için veritabanının Firebase Güvenlik Kuralları'nı değerlendirir.
  9. Sistem, doküman güncellemesini B istemcisinin cihazındaki SDK'ya yönlendirir ve onSnapshot geri çağırması tetiklenir. Yerel kalıcılık etkinleştirilirse SDK, güncellemeyi yerel önbelleğe de uygular.

Cloud Firestore'un ölçeklenebilirliğinin önemli bir parçası, değişiklik günlüğünden abonelik işleyicilere ve ön uç sunucularına giden çıkışa bağlıdır. Fan-out, tek bir veri değişikliğinin milyonlarca gerçek zamanlı sorgu ve bağlı kullanıcıya hizmet vermek için verimli bir şekilde yayılmasına olanak tanır. Cloud Firestore, tüm bu bileşenlerin birçok kopyasını birden fazla alt bölgede (veya çok bölgeli dağıtım durumunda birden fazla bölgede) çalıştırarak yüksek kullanılabilirlik ve ölçeklenebilirlik sağlar.

Mobil ve web SDK'larından yayınlanan tüm okuma işlemlerinin yukarıdaki modeli uyguladığını belirtmek isteriz. Tutarlılık garantileri sağlamak için bir yoklama sorgusu ve ardından dinleme modu uygulanır. Bu durum gerçek zamanlı dinleyiciler, belge almaya yönelik çağrılar ve tek seferlik sorgular için de geçerlidir. Tek belge alma işlemlerini ve tek seferlik sorguları, performansla ilgili benzer kısıtlamalara sahip kısa ömürlü anlık görüntü dinleyicileri olarak düşünebilirsiniz.

Gerçek zamanlı sorguları ölçeklendirmek için en iyi uygulamalardan yararlanma

Ölçeklenebilir gerçek zamanlı sorgular tasarlamak için aşağıdaki en iyi uygulamalardan yararlanın.

Sistemdeki yüksek yazma trafiğini anlayın

Bu bölüm, sistemin artan yazma isteğine nasıl yanıt verdiğini anlamanıza yardımcı olur.

Gerçek zamanlı sorguları uygulayan Cloud Firestore değişiklik günlükleri, yazma trafiği arttıkça yatay olarak otomatik olarak ölçeklendirilir. Bir veritabanının yazma hızı, tek bir sunucunun işleyebildiğinden daha fazla arttıkça değişiklik günlüğü birden çok sunucuya bölünür ve sorgu işleme, bir yerine birden çok abonelik işleyiciden gelen verileri tüketmeye başlar. İstemci ve SDK açısından, tüm bunlar şeffaftır ve bölme gerçekleştiğinde uygulamanın herhangi bir işlem yapması gerekmez. Aşağıdaki şemada, gerçek zamanlı sorguların nasıl ölçeklendirildiği gösterilmektedir:

Değişiklik günlüğü yayma mimarisi

Otomatik ölçeklendirme, yazma trafiğinizi sınırlama olmadan artırmanıza olanak tanır ancak trafik arttıkça sistemin yanıt vermesi biraz zaman alabilir. Yazma hotspot'u oluşturmaktan kaçınmak için 5-5-5 kuralının önerilerini uygulayın. Key Visualizer, yazma hotspot'larını analiz etmek için kullanışlı bir araçtır.

Birçok uygulama, Cloud Firestore'un önlem olmadan sağlayabileceği öngörülebilir organik büyümeye sahiptir. Bununla birlikte, büyük bir veri kümesini içe aktarma gibi toplu iş yükleri, yazma işlemlerini çok hızlı bir şekilde hızlandırabilir. Uygulamanızı tasarlarken yazma trafiğinizin nereden geldiğini takip edin.

Yazma ve okuma işlemlerinin nasıl etkileşimde bulunduğunu anlama

Gerçek zamanlı sorgu sistemini, yazma işlemlerini okuyuculara bağlayan bir ardışık düzen olarak düşünebilirsiniz. Bir doküman oluşturulduğunda, güncellendiğinde veya silindiğinde, değişiklik depolama sisteminden o anda kayıtlı olan dinleyicilere uygulanır. Cloud Firestore'un değişiklik günlüğü yapısı, güçlü tutarlılığı garanti eder. Bu sayede uygulamanız, veritabanının veri değişikliklerini kaydettiği zamana kıyasla düzenli olmayan güncelleme bildirimleri almaz. Bu sayede veri tutarlılığıyla ilgili uç durumları kaldırarak uygulama geliştirme daha basit hale gelir.

Bu bağlı ardışık düzen, hotspot'lara veya kilit anlaşmazlığına neden olan bir yazma işleminin, okuma işlemlerini olumsuz etkileyebileceği anlamına gelir. Yazma işlemleri başarısız olduğunda veya kısıtlamayla karşılaşıldığında, okuma işlemi değişiklik günlüğünden tutarlı veri beklerken durabilir. Uygulamanızda böyle bir durum yaşanırsa sorgular için hem yavaş yazma işlemleri hem de bunlarla bağlantılı yavaş yanıt süreleri görebilirsiniz. Hotspot'lardan kaçınmak, bu sorundan uzak durmanın anahtarıdır.

Belgeleri ve yazma işlemlerini küçük tutun

Anlık görüntü dinleyicileriyle uygulama oluştururken, genellikle kullanıcıların veri değişikliklerinden hızlı bir şekilde haberdar olmasını istersiniz. Bunun için görevleri küçük tutmaya çalışın. Sistem, onlarca alanı olan küçük belgeleri sisteme çok hızlı bir şekilde aktarabilir. Yüzlerce alan ve büyük veriler içeren daha büyük dokümanların işlenmesi daha uzun sürer.

Benzer şekilde, gecikmeyi düşük tutmak için kısa, hızlı kaydetme ve yazma işlemlerine öncelik verin. Büyük gruplar, yazarın bakış açısına göre daha yüksek işleme hızı sunar ancak anlık görüntü dinleyicileri için bildirim süresini uzatabilir. Bu, performansı artırmak için toplu işlemeyi kullanabileceğiniz diğer veritabanı sistemlerini kullanmaya kıyasla genellikle mantığa aykırıdır.

Verimli dinleyiciler kullanın

Veritabanınızın yazma hızı arttıkça Cloud Firestore, veri işlemeyi birçok sunucuya böler. Cloud Firestore'un parçalama algoritması, verileri aynı koleksiyon veya koleksiyon grubundan aynı değişiklik günlüğü sunucusunda bulmaya çalışır. Sistem, bir sorgunun işlenmesine dahil olan sunucuların sayısını mümkün olduğunca düşük tutarken olası yazma işleme hızını en üst düzeye çıkarmaya çalışır.

Ancak, belirli kalıplar yine de anlık görüntü dinleyicileri için ideal olmayan davranışa neden olabilir. Örneğin, uygulamanız verilerinin çoğunu büyük bir koleksiyonda depoluyorsa dinleyicinin, ihtiyaç duyduğu tüm verileri almak için çok sayıda sunucuya bağlanması gerekebilir. Bu durum, bir sorgu filtresi uygulasanız bile geçerliliğini korur. Çok sayıda sunucuya bağlanmak daha yavaş yanıt riskini artırır.

Bu yavaş yanıtları önlemek için şemanızı ve uygulamanızı, sistemin çok sayıda farklı sunucuya gitmeden dinleyicilere hizmet verebileceği şekilde tasarlayın. Verilerinizi daha düşük yazma hızlarıyla daha küçük koleksiyonlara bölmek sizin için en uygun seçenek olabilir.

Bu, tam tablo taraması gerektiren ilişkisel bir veritabanında performans sorgularını düşünmeye benzer. İlişkisel bir veritabanında, tam tablo taraması gerektiren bir sorgu, yüksek kayıplı bir koleksiyonu izleyen anlık görüntü dinleyicisine eşdeğerdir. Veritabanının daha belirli bir dizin kullanarak sunabileceği bir sorguya kıyasla daha yavaş performans gösterebilir. Daha spesifik bir dizine sahip sorgular, tek bir dokümanı veya daha seyrek değişen bir koleksiyonu izleyen anlık görüntü dinleyiciye benzer. Kullanım alanınızın davranışını ve ihtiyacını en iyi şekilde anlamak için uygulamanızı yükleme testi yapmanız gerekir.

Yoklama sorgularını hızlandırın

Yanıt veren gerçek zamanlı sorguların bir diğer önemli parçası da verileri önyüklemek için kullanılan anket sorgusunun hızlı ve verimli olmasını sağlamaktır. Yeni bir anlık görüntü dinleyicisi ilk kez bağlandığında, dinleyicinin sonuç kümesinin tamamını yükleyip kullanıcının cihazına göndermesi gerekir. Yavaş sorgular, uygulamanızı daha az duyarlı hale getirir. Buna örneğin, uygun dizinleri kullanmayan birçok belgeyi veya sorguyu okumaya çalışan sorgular dahildir.

Dinleyici bazı durumlarda dinleme durumundan anket durumuna da geçiş yapabilir. Bu işlem otomatik olarak gerçekleşir ve SDK'lar ile uygulamanız için şeffaftır. Aşağıdaki koşullar bir yoklama durumunu tetikleyebilir:

  • Sistem, yükteki değişiklikler nedeniyle bir değişiklik günlüğünü yeniden dengeler.
  • Hotspot'lar, veritabanına başarısız veya gecikmeli yazma işlemlerine neden olur.
  • Geçici sunucu yeniden başlatılması dinleyicileri geçici olarak etkiler.

Anket sorgularınız yeterince hızlıysa yoklama durumu, uygulamanızın kullanıcıları için şeffaf hale gelir.

Uzun soluklu dinleyicileri tercih edin

Cloud Firestore kullanan bir uygulama oluşturmanın en uygun maliyetli yolu genellikle dinleyicileri açıp uzun süre canlı tutmaktır. Cloud Firestore kullanırken açık bağlantı sürdürüldüğünde değil, uygulamanıza döndürülen belgeler için faturalandırılırsınız. Uzun ömürlü anlık görüntü dinleyicisi, yalnızca kullanım ömrü boyunca sorguyu sunmak için ihtiyaç duyduğu verileri okur. Buna, ilk yoklama işlemi ve ardından veriler gerçekten değiştiğinde gönderilen bildirimler dahildir. Diğer yandan, tek seferlik sorgular, uygulamanın sorguyu son çalıştırmasından bu yana değişmemiş olabilecek verileri yeniden okur.

Uygulamanızın yüksek oranda veri kullanması gereken durumlarda anlık görüntü dinleyiciler uygun olmayabilir. Örneğin, kullanım alanınız bir bağlantı üzerinden uzun bir süre boyunca saniyede çok sayıda dokümanı aktarıyorsa daha düşük sıklıkta çalışan tek seferlik sorguları tercih etmeniz daha iyi olabilir.

Sonraki Adımlar