C# DynamoDB Kullanımı

Big Data Çağrı ŞİŞMAN 24.2.2016

Merhabalar,

DynamoDB Amazon tarafından sağlanan NoSql çözümlerinden biridir. Hızlı ve yüksek ölçeklenebilirliği ile beraber düşük maliyetli bir çözüm olması DynamoDB'nin giderek popüler bir şekilde kullanımını sağlıyor. Fiyat ile detaylı bilgilere https://aws.amazon.com/dynamodb/pricing/ adresinden ulaşabilmek mümkün.

Özellikle S3 ya da EMR(Elastic Map Reduce) gibi diğer AWS(Amazon Web Services) servislerini kullanıyorsanız, bu servislerin birbirleriyle oldukça rahat ve kolay bir şekilde haberleşebilmesi de düşünüldüğünde,  NoSQL çözümü olarak ihtiyaca göre DynamoDB kullanmak oldukça avantajlı olabilir. 

DynamoDB'yi farklı yazılım dillerinde de programlamak mümkün. Java, C#,Ruby,Phyton gibi farklı yazılım dilleri için kullanılmak üzere çeşitli SDK'lar geliştirilmiş.

Bu yazımızda C# ile DynamoDB'yi nasıl kullanabileceğimize bir göz atacağız.

Her AWS servisinde olduğu gibi  DynamoDB'yi kullanabilmek için gerekli yetkilere sahip bir Amazon hesabına ihtiyaç var. İlgili hesabı oluşturduktan sonra DynamoDb ile C# uygulamalarını entegre edebilmek amacıyla Nuget paketlerini altında yer alan AWSSDK kütüphanesini projeye eklemek gerekir.

 

DynamoDb ile bağlantı AmazonDynamoDBClient sınıfı ile gerçekleştirilir. AmazonDynamoDBClient sınıfından yeni bir nesne oluştururken Amazon hesabına ait AccessKey ve Secret Key değerlerinden oluşan güvenlik sınıfı BasicAWSCredentials sınıfından üretilen credentials nesnesini parametre olarak veriyoruz. İkinci parametre ise veri tabanının bulunduğu sunucu bölgesini belirtir.

private IAmazonDynamoDB GetDynamoDbClient()
{
    
            var credentials = new BasicAWSCredentials("YourAccessKey", "YourSecret");
            var client=new AmazonDynamoDBClient(credentials,RegionEndpoint.EUCentral1);

            return client;

}

**AccessKey ve SecretKey Amazon hesabınıza ait değerlerdir.

 

Şimdi bir örnekle CRUD operasyonlarını nasıl yapacağımıza bakalım.

 public class DynamoDbDataService : IDisposable
    {
        private readonly DynamoDBContext _context;

        public DynamoDbDataService()
        {
            _context = new DynamoDBContext(GetDynamoDbClient());
        }

        private IAmazonDynamoDB GetDynamoDbClient()
        {
            var credentials = new BasicAWSCredentials("YourAccessKey", "YourSecretKey");
            var client=new AmazonDynamoDBClient(credentials,RegionEndpoint.EUCentral1);

            return client;

        }

        public void SaveContent<T>(T value)
        {
            var data = _context.Scan<T>();
            _context.Save(value);
        }

        public void Delete<T>(T value)
        {
            
            _context.Delete(value);

        }


        public IEnumerable<T> GetData<T>()
        {
            return _context.Scan<T>();
        }


        public void Dispose()
        {
            _context.Dispose();
            GC.SuppressFinalize(this);
        }
    }

 

DynamoDB ile ilgili CRUD işlemlerini DynamoDBContext sınıfından ürettiğimiz _context nesnesiyle gerçekleştiririz. Save,Delete ve Scan metodlarının generic desteği de önemli bir avantajdır. Şimdi tablolar üzerinde nasıl işlemler yapabiliriz buna bakalım.

 

 TwitterTerm adında bir tablomuz var 3 tane alana sahip.

Term -> Primary Key-> String

CreatedOn -> String

LastTweetId -> String

Bu tablonun modellemesi aşağıdaki gibi olacaktır.

  [DynamoDBTable("TwitterTerm")]
    public class TwitterTerm
    {
        [DynamoDBHashKey("Term")]
        public string Term { get; set; }
        [DynamoDBProperty("CreatedOn")]
        public DateTime CreatedOn { get; set; }
        [DynamoDBProperty("LastTweetId")]
        public string LastTweetId { get; set; }
    }

Primary key olarak işaretlenen alana DynamoDBHashKey attribute'unu ekliyoruz. Diğer tablo sütun değerleri için ise DynamoDBProperty değerlerini kullanırız. Parantez içerisindeki değerler ise tablodaki sütun isimleridir.

 

Artık gerekli metodlar ve ilgili tipimiz elimizde artık DynamoDbDataService sınıfını kullanarak veri elde edebiliriz.

 private TwitterTerm GetTwitterTerm(string term)
{

     using (var dynamoDbDataService = new DynamoDbDataService())
     {
         return dynamoDbDataService.GetData<TwitterTerm>().SingleOrDefault(x => x.Term.Contains(term));
     }

}

Faydası olması dileğimle.


Etiketler: C#