Yazılım Mimarileri ve Tasarım Desenleri Üzerine

Azure Storage Serisi #6 – Azure Table Storage ve Asp.NET Core İle Kullanımı

azure-storage

Merhaba,

Azure Storage Yazı Dizisinin bu altıncı makalesinde Azure Table Storage servisi üzerine incelemede bulunuyor olacağız.

Azure Table Storage Nedir?

Azure Table Storage, bir NoSQL veritabanı türevidir. Primary Key ve Foreign Key ihtiyacı olmaksızın veri tutmamız gerektiğinde bu veriyi ilişkisel veritabanında tutmaktansa NoSQL’de tutmayı tercih edebiliriz. NoSQL açılımsal olarak ‘Not Only SQL’ yani ‘Sadece SQL Değil’ diyerek, bu ve bunun gibi ilişkisel bir tasarım gerektirmeyen durumlarda standart SQL’in zaten var olan yoğunluğu içerisinde ekstradan maliyeti arttırmaksızın NoSQL yaklaşımını benimsemiş bir veritabanı üzerinden çözüm getirilmesi ve böylece maliyetten düşülerek verisel işlemlerde hız ve verimin arttırılması fikrini ortaya koymaktadır.

NoSQL, yapısal olarak veriler üzerinde statik alan tanımlamalarından ziyade daha esnek olan ve ihtiyaca binaen dinamik alan tanımlamasına imkan verdiğinden dolayı ilişkisel veritabanlarında olan sert kuralları aşabilmemizi sağlamakta ve bu esnekliğin getirisi olan verimlilikten dolayı tercih edilmektedir. NoSQL hakkında daha detaylı ekstra bilgiler edinmek için buradaki makaleyi okumanızı tavsiye ederim.

NoSQL ile Relational yaklaşımları birlikte kullanıldığında daha güçlü, performanslı ve verimli olmaktadır.

Azure Table Storage’ı Neden Kullanmalıyız?

Azure Table Storage, NoSQL yaklaşımı benimsediğinden dolayı uygulamanızın ihtiyaçları geliştikçe verilerinizi uyarlamak daha kolay olacaktır. Benzer hacimlerdeki veriler için geleneksel SQL yöntemlerine nazaran daha düşük maliyette sorgulamalar yapmanızı sağlayacaktır. Ayrıca OData protokolü ile yapılan sorgulamalarda NoSQL yaklaşımları oldukça elverişli bir sonuç doğurmaktadır.

Azure Storage Table’ın transaction desteği bulunmamaktadır. Bu durum kesinlikle NoSQL veritabanları için genellenmemelidir. Örneğin; MongoDB NoSQL yaklaşımını benimsemiş bir veritabanıdır ve transaction desteği bulunmaktadır.

Azure Table Storage Kavramları Nelerdir?

Azure Table Storage’a bir veri eklendiğinde ilgili entity içerisine default olarak ‘Row Key’, ‘Partition Key’ ve ‘Timestamp’ alanları eklenir.

Row Key; Primary Key gibi düşünülebilir. Eşsiz bir değerdir.

Partition Key; entityleri gruplama ve hızlı arama için kullanılır. Örneğin; User tablosunda tüm userların bulunduğu şehirleri partition key olarak işaretlememiz şehirleri gruplayacak ve arama esnasında ilgili şehir dışında olan userları aramaksızın sürece büyük avantaj sağlayacaktır.

Timestamp; Zaman damgası, verinin eklendiği tarihi tutacaktır.

Azure Table Storage, LINQ’i destekler…

Asp.NET Core İle Azure Table Storage Kullanımı

Azure Table Storage’ı Asp.NET Core ile kullanabilmek için öncelikle bir Class Library içerisinde uygulamadan bağımsız Azure Storage ile iletişim kuran yapılanma oluşturulmalıdır. Ardından ilgili yapılanmanın uygulama tarafından dependency edilerek kullanılması yazılımsal açıdan daha kullanışlı ve efektif bir yöntem olacaktır.

Bunun için aşağıdaki adımları sırasıyla uygulayınız;

Tüm bu adımların baştan sona gerçekleştirilmesi neticesinde örnek Azure Table Storage uygulaması geliştirilmiş olacaktır.

Test Edelim
Testimizi Postman aracılığıyla gerçekleştirelim.

POST GET
PUT DELETE

Put operasyonu Timestamp özelliği üzerinden otomatik olarak olası veri tutarsızlığının önlemini almaktadır. Bknz : Entity Framework Core – Data Concurrency Eğer ki, bir tutarsızlık söz konusu olursa aşağıdaki gibi try – catch blokları aracılığıyla ‘StorageException’ türü ile hatayı yakalayıp manipüle edebilirsiniz.

        [HttpPut]
        public async Task<IActionResult> Update(Product product)
        {
            try
            {
                Product updated = await _noSQLStorage.Update(product);
                return Ok(updated);
            }
            catch (StorageException ex)
            {
                if (ex.RequestInformation.HttpStatusCode == (int)HttpStatusCode.PreconditionFailed)
                    return Ok("PreconditionFailed Exception");
                return Ok(ex.Message);
            }
        }

Ya da veri tutarsızlığının göz ardı edilmesini istiyorsanız ‘ETag’ property’sine * değerini verebilirsiniz.

        [HttpPut]
        public async Task<IActionResult> Update(Product product)
        {
            try
            {
                product.ETag = "*";
                Product updated = await _noSQLStorage.Update(product);
                return Ok(updated);
            }
            catch (StorageException ex)
            {
                if (ex.RequestInformation.HttpStatusCode == (int)HttpStatusCode.PreconditionFailed)
                    return Ok("PreconditionFailed Exception");
                return Ok(ex.Message);
            }
        }

Not: Yapılan çalışmaları localde Azure Storage Explorer uygulamasından takip etmek istiyorsanız eğer ‘Microsoft Azure Storage Emulator’ uygulamasının başlat menüsünden çalıştırılmış olması gerekmektedir.

Microsoft Azure Storage Emulator çalıştırdıktan sonra Console çıktısı…

Tabi Azure Storage Explorer ile localde çalışacaksanız eğer ‘TableStorage’ sınıfında localin connection string değeri tanımlanmış olması gerekiyor. Bunun için, Azure Storage Explorer uygulamasının ‘Explorer’ penceresinde ‘Local&Attached’ -> ‘Storage Accounts’ -> ‘(Emulator – Default Ports) (Key)’ kombinasyonuna tıkladığınızda aşağıdaki ‘Properties’ sekmesine gelen ‘Primary Connection String’ değerini kopyalamanız yeterli olacaktır.

İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Not : Örnek projeyi indirmek için buraya tıklayınız.

Mobil sürümden çık