Firebase read azaltma işleminin birçok yolu var. CRUD operasyonları arasında en çok kullanılan read komutu yüzünden birçok geliştirici yüksek Firebase kullanım istatistiklerine veya eğer ücretsiz kullanım hakkının hemen dolduğuna şahit olabiliyor. Her ne kadar Firebase read azaltma işlemi kodlarımızı optimize ederek yapılsa da Firebase Firestore kütüphanesi bize bu konuda yardımcı olacak bazı imkanlar sunuyor.
Her şeyden önce kötü kod yazmamaya dikkat edin. Çoğunlukla Firebase read sayısının kullanıcı başına on binlerce read operasyonu şeklinde gözükmesi kötü kod yazımından kaynaklanır. Öncelikli tavsiyem, uygulamanızı debug etmeniz ve Firestore fonksiyonlarını incelemeniz. Ayrıca, Flutter üzerinden konuşuyorsak, her yaptığınız setState bazı Firestore fonksiyonlarını tetikleyebilir. Dikkat edin. 🙂
Firebase Firestore koleksiyonumuzu inceleyelim
Öncelikle users adında bir collection açtığımızı düşünelim. Bu users içerisinde 100 tane döküman olsun ve döküman ID’leri unique, yani birbirinden farklı olsun. İçerlerindeki field adedi okuma sayısına etki etmez. Yani her dökümanı okumak 1 read olarak yazılır. Bu durumda collection içerisindeki tüm dökümanları çektiniz. Çekerken de basitçe collections.get() gibi bir kod kullandınız. Firebase size 100 okuma yazdı. Daha sonra uygulamayı kapattınız ve yeniden açtınız.
Tebrikler, yine 100 okuma daha yaptınız. Eğer herhangi bir CACHE ifadesi belirtmediyseniz 2 dakika içerisinde hiçbir şey yapmayarak 200 veri okudunuz.
Firebase Read bu durumda nasıl azaltılır?
Snapshot listener kullanarak Firebase Read sayısı azaltılabilir. Flutter’da bu Stream’e karşılık geliyor. Kullandığınız snapshot değişkeni yalnızca Firestore üzerinde belirttiğiniz collection veya document üzerinde değişiklik olduğu zamanda size read sayısı yansıtılıyor ve bu değişen dosya başına gerçekleşiyor. Aynı zamanda 30 dakika boyunca bu açtığınız snapshot bağlantısı açık kalıyor ve bu süreçte yalnızca 100 + ( eğer değiştirilen, değişime uğrayan döküman varsa ) değişen döküman başına 1 read sayısı kadar read kullanılıyor.
Bu durumun avantajı, sürekli gir çık yapılan uygulamalarda read sayısını azaltması ve dökümanlar üzerindeki değişiklikleri uygulamaya düşük maliyetlerle yansıtabilmesi.
Bir StreamBuilder ve Snapshot Listener kullanımına örnek olarak;
StreamBuilder<QuerySnapshot>(
stream: Firestore.instance.collection('users').snapshots(),
builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
if (!snapshot.hasData) return new Text('Waiting');
return new ListView(
children: snapshot.data.documents.map((DocumentSnapshot document) {
return new ListTile(
title: new Text(document['name']),
subtitle: new Text(document['phone']),
);
}).toList(),
);
},
);
Firebase Read azaltma yöntemi: docChanges
Flutter’da Firebase’in sunduğu docChanges metotuyla bir collection içerisindeki, bir koşulu sağlayan tüm dökümanların en son görüntüsüyle beraber içerisinde yapılan değişikliklerin birleştirilip sunulduğu bir metottur. Bir QuerySnapshot döndürür. Tıpkı yukarıda yazdığımız stream objesine benzer bir işlevi vardır.
docChanges metotuna örnek olarak;
var query = await _firestore
.collection('users')
.where('approved', isEqualTo: true)
.get(GetOptions(source: Source.serverAndCache));
query.docChanges.forEach((element) {
User user = User.fromMap(element.doc.data());
userList.add(user);
});
StreamBuilder’da yaptığımız şeye ek olarak yukarıdaki query’de get içerisinde GetOptions yer alıyor. Eğer telefon internete bağlı değilse, son snapshot verisini daima cache üzerinde tuttuğu için, cache’de yer alan veriyi kullanıcıya gösteriyor. Tabi cache içerisindeki veriyi göstermek için önce cache içerisine bir veri tutmalısınız değil mi? Onun da bir yolu var. 🙂
Firebase üzerinde iki farklı yöntemle, snapshot kullanarak read sayısını azaltmayı öğrendiğimiz bu yazının sonuna geldik. Firebase için daha detaylı bir Cache yazısı yazmak istediğimden şimdilik burada kesiyorum. Daha fazla Firebase yazısı için takipte kalın. 🙂
Okuyucuya Not
Merhaba okuyucu! Blogum son zamanlarda yüksek trafik almaya başladı ve bu durumdan memnunum fakat aynı zamanda siz ziyaretçileri tatmin edememekten endişeliyim. 🙂 Eğer yazılarım ile ilgili bir tavsiyeniz olursa mail adresimden bana ulaşabilir veya Twitter üzerinden direct message gönderebilirsiniz. Github’ta örnek olarak yaptığım projelere göz atmak isterseniz de bu linki kullanabilirsiniz. Umarım bu ziyaretinizle size bir şeyler katabilmişimdir.
Sağlıcakla kalın!