ÇSTech
Published in

ÇSTech

.Net Geliştiriciler İçin Couchbase’e Giriş Rehberi

Bu yazıda bir NOSQL veri tabanı olan Couchbase’e bir .Net geliştiricinin bakış açısı ile bakacağız.

Couchbase Nedir?

Couchbase, memory-first yaklaşımı ve SQL uyumlu sorgulama diliyle (N1QL) ön plana çıkan bir multi-model NOSQL veri tabanıdır. Veriler MongoDB’den farklı olarak pure JSON şeklinde tutulur. CAP teoremine göre Couchbase’in bir “CP database” olduğu söylenebilir. Fakat birden fazla instance ile konfigüre edildiğinde bir “AP database” olarak davranır.

Öne Çıkan Özellikleri

  • SQL uyumlu gelişmiş bir sorgulama dili(N1QL) vardır. İlişkisel veri tabanlarına aşina olanlar için adapte olması kolaydır.
  • Couchbase, hem document-based hem de key-value veri tabanı olarak davranır. Böylelikle hem document-based db’lerin sunduğu zengin sorgulama yeteneğine sahip olurken hem de key-value db’lerin sunduğu ölçeklenebilirlik, performans ve güvenilirliği sağlar.
  • Built-in caching ve memory-first yaklaşımı ile ekstra bir caching mekanizmasına ihtiyaç duymadan performanslı sorgular elde edebilmemizi sağlar.
  • Gelişmiş web ui’ı sayesinde tüm yapılandırma işlemleri tek bir yerden yönetilebilir.
  • Couchbase Server, JSON kullanan esnek bir veri modelini destekler. Bununla birlikte gelişmiş bir indexing mekanizması vardır.
  • Search Service ile full text search’ü destekler.
  • Distributed ACID transactions özelliği ile birden fazla Couchbase Server instance’ı üzerinde transactional sorgular yapabilmemize imkan sağlar.
  • Time to live özelliği ile yaşamı belirli bir süre ile sınırlanmış document’lar oluşturabiliriz.

Eksik Olduğu Noktalar

  • Community’si büyük değil. İnternette bulunan doküman ya da makaleler genelde Couchbase’in kendi kaynağı oluyor. Bu da çoğu zaman yeterli olmuyor. Developer anketlerinde de en çok istenen db’ler arasında alt sıralarda bulunuyor.
  • Büyük veri setlerinde rakibi MongoDB’ye göre daha düşük performans gösteriyor.
  • Popüler birçok programlama dillerini desteklese de bu sayı MongoDB’ye göre daha az ve .NET tarafında LINQ ile sorgulama yapabileceğimiz resmi olarak desteklenen bir kütüphane yok.
  • Error log’ları genel olarak başarılı değil. Sorguda oluşan hataya dair detaylı bir mesaj verilmiyor.

Couchbase’deki Kavramlar

Clusters

Bir veya birden fazla Couchbase Server instance’ının oluşturduğu yapıya cluster(küme) denir. Veriler birden fazla instance üzerinde tekrarlanarak high-availibility amaçlanır.

Buckets

İlişkisel veri tabanlarındaki veri tabanı kavramının karşılığı şeklinde ifade edebiliriz. Bir cluster üzerinde birden fazla bucket bulunabilir.

Documents

İlişkisel veri tabanlarındaki her bir kaydın(ya da satırın) karşılığı diyebiliriz. Couchbase’de her bir kayıt JSON şeklinde bir document olarak saklanır.

Collections

Document’ların tutulduğu yerdir. İlişkisel veri tabanlarındaki tablonun karşılığı denebilir. Herhangi bir collection oluşturulmadığında document’lar “_default” isimli collection altında tutulur. Bir bucket altında birden fazla collection oluşturulabilir.

Scopes

Collection’ların parent’ı olarak davranan ve birden fazla collection’ı gruplamaya yarayan bir yapıdır. Collectionlar veri tipine göre ya da deployment phase’ine göre(test, prod vs.) scope’larda gruplanabilir. Herhangi bir scope oluşturulmadığında collection’lar “_default” isimli scope altında bulunur.

Bucket Türleri

Couchbase’de Couchbase ve Ephemaral isminde iki farklı bucket türü vardır. Couchbase bucket türünde; veri hem memory hem disk’te tutulur. Kalıcılık sağlanmak isteniyorsa tercih edilmesi gereken bucket türüdür. Ephemeral’da ise veri sadece memory’de tutulur. Verinin kalıcı olmasına ihtiyaç duyulmadığı durumlarda yüksek derecede tutarlı bir in-memory veri tabanı olarak davranır. Üçüncü bir tür olup redis gibi bir key-value veri tabanı şeklinde davranan Memcached ise sonradan kullanımdan kaldırılmıştır.

Bir Couchbase Sunucusunu Ayağa Kaldırmak

Docker hub’daki Couchbase resmi docker imaj linkindeki adımları uygulayarak lokalimizde kolay bir şekilde bir Couchbase Server ayağa kaldırıp yapılandırabiliriz.

N1QL(Nickel) Sorgulama Dili

Couchbase’in sorgulama dili olan N1QL’i, JSON verileri sorgulayabileceğimiz gelişmiş bir SQL olarak tanımlayabiliriz. SQL’de aşina olduğumuz select, update, insert, join gibi clause’ların yanında N1QL’e özgü upsert, nest, unnest gibi çok kullanışlı clause’lar vardır.

Couchbase’in resmi uygulamalı tutorial linki üzerindeki tutorial takip edilerek N1QL hakkında daha detaylı bilgi sahibi olunabilir. Ayrıca cheatsheet linki üzerinden basit sorgulama işlemlerinin nasıl yapıldığına bakıp dil ile alakalı fikir edinilebilir.

Couchbase’de Index Türleri

Doğru index’i doğru key’ler ile, doğru sırada ve doğru ifadelerle oluşturmak veri tabanlarında sorgu performansını etkileyen kritik bir konudur. Aynı şey Couchbase Server için de geçerli. Couchbase’de index’ler türlerine göre ayrılır.

Primary Index

Couchbase’deki her document unique bir key’e sahip olmak zorundadır. Bu her bir document’i eşsiz hale getiren key’ler üzerinde oluşturulan index’e primary index denir. Couchbase’de primary key isimli ya da isimsiz şekilde oluşturulabilir.

Secondary Index

Herhangi bir alan üzerinde oluşturulan index’e denir. Bu alan skaler, array ya da bir nesne olabilir.

Composite Secondary Index

Birden fazla alan üzerinde oluşturulan secondary index’tir. Eğer sorguda sadece index’teki alanları barındıran alanlar isteniyorsa query engine hiç sorgulamadan taradığı index’teki sonucu döner. Bu detay performans ve tutarlılık açısından önemlidir.

Functional Index

Funcional expressionlar kullanarak oluşturduğumuz indexlerdir. Örneğin büyük ve küçük harfleri bir arada bulunduran string tipinde bir alanı indexlerken lower() fonksiyonunu kullanarak küçük harfle indexleyebilmemizi sağlar.

Array Index

Array index’ler ile document üzerinde bulunan dizideki bir alanı indexleyebiliriz.

Partial Index

Relational db’lerde her farklı tipte kayıt farklı tablolarda bulunurken Couchbase’de document üzerinde tipler oluşturarak aynı collection üzerinde farklı tipte veriler saklayabiliriz(Böyle yapmak zorunda değiliz ama farklı tipleri birbirinden ayrıştırmak için gerekli). Partial index’ler ile index oluştururken koşul vererek collection üzerindeki sadece belli koşulu sağlayan kayıtları indexleyebiliriz. Örneğin sadece belli tipteki document’ları…

Duplicate Index

Duplicate index aslında farklı bir index türü değil, Couchbase’de bir indexing özelliğidir. Couchbase’de aynı index’i farklı isimlerle birden fazla kez oluşturabiliriz. Bu şekilde high availibility ve yük dağıtımı konusunda avantajlar kazanırız.

Daha detaylı bilgi ve örnekler için official Couchbase linki.

Couchbase .NET SDK

CouchbaseNetClient isimli official kütüphaneyi .NET projemize ekleyerek Couchbase Server ile etkileşime geçebiliriz.

Aşağıda SDK’in kullanım örneklerini bulabilirsiniz:

Daha detaylı bilgi için official Couchbase linki.

Transactions

Couchbase ile, birden fazla node üzerinde bulunan birden fazla document üzerinde distributed transaction operasyonları gerçekleştirebiliriz. Distibuted transaction işlemlerinde sadece güncellenecek verileri barındıran node’lar etkilenir.

Couchbase ACID transactions yaklaşımını benimser.

  • Atomicity ile ya hep ya da hiç prensibi benimsenir. Yani ya işlemlerin hepsi başarı ile gerçekleşip commit edilir ya da herhangi bir işlem başarısız olursa tüm değişiklikler roll-back yapılır.
  • Consistency ile veri tabanındaki verilerin bir tutarlı durumdan diğer tutarlı duruma geçtiği garanti edilir.
  • Isolation, transaction’da etkilenen verilerin işlem bitmeden görünür olmayacağını belirtir.
  • Durability ise bir failure durumunda transaction ile commit edilen verinin kaybolmayacağından emin olmamızı sağlar.

.NET tarafında Couchbase.Transactions isimli paket ile transactional işlemler gerçekleştirebiliriz.

Aşağıdaki kod örneğinde Couchbase.Transactions paketi ile .NET’te nasıl transactional operasyonlar yapıldığını görebiliriz:

Couchbase transactions’ın temel fikri lambda fonksiyonu içindeki işlemleri sorunsuz bir şekilde gerçekleştirdikten sonra transaction’ı commit etmektir. Eğer başka bir transaction ile çakışma gibi geçici bir problemle karşılaşılırsa otomatik olarak transaction rollback yapılıp işlemler tekrar denenir(bu yüzden lambda fonksiyona verdiğimiz parametre tipinin ismi AttemptContext). Bunun için application seviyesinde bir error handling ve retry mekanizmasına gerek yoktur.

Daha detaylı bilgi için official Couchbase linki.

Dependency Injection

Couchbase, Couchbase.Extensions.DependencyInjection paketiyle .NET’te dependency injection’ı destekler. Yazının sonunda da paylaştığım proje linkinden kullanım detaylarını inceleyebilirsiniz.

LINQ Desteği

Couchbase Labs’in bir açık kaynak projesi olan Linq2Couchbase kütüphanesi ile Couchbase Server’daki verilerimizi LINQ ile sorgulayabiliyoruz. Proje dokümanında belirtilene göre resmi olarak desteklenen bir kütüphane olmasa da aktif olarak maintain ediliyor. Kütüphane ile alakalı detaylı bilgi için github linkinden kodları ve dokümanı inceleyebilirsiniz.

Couchbase .NET SDK’in dependency injection ile kullanımına yönelik örnek projeme github linkinden erişebilirsiniz.

--

--

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store