Category Archives: Cloud Computing

Windows Azure ile Cloud Computing Uygulamaları – 7 (Video)

Zaman sürekli değişmektedir. Değişen zaman içerisinde birçok iş çözümü geliştirilmiştir. Geliştirilen çözümler, iş gereksinimlerine uygun depolama çözümleri ile desteklenmektedir.

Uygulama yaşam süreci boyunca çeşitli girdi / çıktılar ile çalışmaktadır. Üretilen iş verileri, gereksinimlerine bağlı düzenlemeler sonucunda normalizasyon ya da yapısal bozulmalara neden olmaktadır. Meydanan gelenen bozulmalar, veri kaynakların kullanan iş uygulamalarınında performans problemlerine neden olmaktadır.

Windows Azure ile Cloud Computing uygulamaları yayın serisinin “Windows Azure ile Cloud Computing uygulamaları – 7” bölümü ile Windows Azure Platform ’un desteklemiş olduğu
NoSQL çözümleri incelenmeye
çalışılmıştır.

Gerçekleştirilen kullanılan uygulama örneği ve ilgili gelişmeleri takip etmek için aşağıdaki bağlantıyı incelemenizi tavsiye ederim.

Github / https://github.com/ibrahimatay/WindowsAzure.FunnyApp

Windows Azure ile Cloud Computing Uygulamaları – 7

Zaman içerisinde planlı ya da plansız olarak, birçok işlem yapılmaktadır. Günümüzde sosyal ağlar ile paylaşımlar ya da bankalar ile birçok harcamalar yapmaktayız. Yapılan işlemler kullanıcılar için önemli olmasa da şirketler için CRM bilgisi olarak depolanmaktadır.

Günümüzde müşteri isteklerini, talep etmeden hazırlayan şirketler kazanmaktadır.                

Yeni nesil CRM süreçleri, her yeni gün özellik kazanarak şekillenmektedir. Söz konusu CRM süreçleri, yasal yaptırımlara bağlı gerçekleştirilmektedir.

İş planlama ve senaryoları gereksinim ve yasal yaptırımlara uyumluluk sağlanmak amacı ile güncellemektedir. Uygulamaların kullanım sürecinde gereksinim duyulmayan, herhangi özellik dönemde gereksinim duyulabilmektedir. Gerçekleşen değişimler, kullanılan iş uygulamalarının şekillendirilmesi ya da yeniden geliştirilmesi gündeme gelebilmektedir.

Türkiye Cumhuriyeti’nde, 1999 yılın sonu itibari ile vatandaşlık numarası uygulaması başlatılmıştır. Uygulama ile isim benzerliklerinde kaynaklanan problemler ve tüm işlemlerin tek numara üzerinde gerçekleştirilmesi amaçlamıştır. Çalışma ile başta sağlık sektörü olmak üzere, insan ile ilişkili tüm sektörlerde kullanılan uygulamalarda, vatandaşlık numarasını temel alma özelliğinin kazandırılması gereksinimi ortaya çıkmıştır. Yapılan işlemler ile tamamlanmış
mevcut ya da süren işlem verilerinin düzenlenmesi gereksinimi ortaya çıkmıştır.

İş süreçleri, kural ya da yasal yaptırımların uygulanması sebebi ile işlem girdi ve çıktılarının değişiklik göstermesi gündeme gelebilmektedir. Yapılan işlemler, mevcutta verilerin düzenlenmesi, performans ve depolama süreçlerini de etkilemektedir.

İş uygulamaları, kullanıcılarından yazılı ya da Binary türünde çeşitli veriler ile çalışmaktadır. Çalışılan veriler, yığınların oluşmasına neden olmaktadır. Veri yığınları ise, zaman ile büyük veri(Big Data) olgusunu gündeme getirmektedir.

Her şirketin çalışmış olduğu ana iş dalı üzerinde çalışması, konu ile ilgili uzmanlaşmasını sağlayacaktır. Gereksinimleri duyduğu diğer yan ihtiyaçları, konunun uzmanlarında sağlaması, iş sürecini ve üretimin kalitesini artıracaktır.

Şirketler, mevcut veri yığınlarını, depolama, analiz ve yönetim için çeşitli iş uygulamaları kullanmaktadır.  Veri yığınları ile ilgili işlem yapılabilmek amacı ile çeşitli araçlar satın alınmaktadır. Yapılan satın alma hareketleri, her şirketin birer veri merkezinin oluşturmasına neden olmaktadır. Veri merkezlerinin kurulması, yönetilmesi, bakımı ya da nitelikli iş gücünün oluşturulması, şirketlerin iş kolları dışında yüklerin altına girmesine neden olmaktadır.

Günümüzde sektör ve iş kolların çeşitlenmesi, iş ihtiyaçlarının ile ilgili duyulan verinin artmasına neden olmaktadır. İş gereksinimleri sağlanması ve istenilen sonuçların üretilebilmesi için iş uygulamalarının, Cloud Computing saylayıcılara ve özellikle Microsoft Windows Azure Platform ’a taşınmaktadır.

İş uygulamaları, gerçekleştirilmesi istenen süreci en avantajlı sunması amacı ile çeşitli teknolojik bağımlıklara yüklenmektedir. Çeşitli nedenlerden dolayı, değişen iş süreçleri, kullanılan uygulamaların da güncelleme gereksinimini ortaya çıkartmaktadır. İş Uygulamaları, iş süreçleri
ile ilgili çeşitli avantajlar sunarken, değişim süreçlerinde handikapların oluşmasına neden olabilmektedir.

Uygulama mimarileri, iş süreç ve yasal bağımlıkları nedeni ile kullanıcı tarafından verilerin güncellenmesi gündeme gelebilmektedir. Uygulama veri yapılarının, zaman ve ihtiyaçların gereğince değişmesi, uygulama performansı ve veritabanı optimizasyonu gibi problem oluşturabilmektedir. Geçmiş dönemde gereksinim olduğu düşünülen veriler, farklı bir dönemde
gereksinim duyulmayabilir. Benzer yaklaşım olarak, bazı uygulama verileri gereksinim duyulabilmektedir. Yapılan işlemler, verinin depolanması ya da analiz sürecini etkileyebilmektedir.

Gelişen teknoloji ile iş süreçlere uygun, kolay ve hızlı iş çözümleri oluşturulabilmektedir. Günümüz iş uygulamalarının, hızlı veri sorgulama ve veri ile ilgili yapısal düzenleme gereksinimleri ortaya çıkarmıştır. Meydana gelen gereksinimler, verinin yapının esnek olması ihtiyacını doğurdu.

2009 yılın da “eğlenceyi seç, ilişkisel=yanlış; olan gerçek Dünyadan faydalan” sloganı ile  yapılan, “no:sql(east)” konferansı ile NoSQL konusunda çeşitli düşüncelerin oluşmasında büyük etki oluşturmuştur.

NoSQL, 1998’un sonlarına doğru ortaya çıkan bir kavramdır. Klasik ilişkisel veritabanı yapışanda bulunmayan ve sorgulama için SQL dili kullanmayan veritabanı türüdür. Genel
olarak xml ya da JSON formatında veri depolama yapmaktadır.

İş ihtiyaçları, iş verisinin esnek olma gereksinimi beraberin de ihtiyacın hizmet olarak sunulmasını da sağlamıştır. Microsoft ve diğer Cloud Computing sağlayıcıları çeşitli depolama hizmetleri ile kullanıcılarına Cloud Storage hizmetleri sunmaktadır. Microsoft da Windows Azure Platform ile kullanıcılarına ilişkisel(SQL Database) veritabanı hizmeti sunduğu gibi No-Relation(Windows Azure Storage) iş çözümü de sunmaktadır.

Windows Azure Platform No-Relation iş çözümü olarak, Windows Azure Storage hizmeti sağlamaktadır. Hizmet ile Binary ve diğer veri türleri farklı nesneler içerisinde güveli ve yüksek optimizasyonu değerlerinde, depolanması sağlanmaktadır.  Aşağıda Windows Azure Storage hizmeti katmanları belirtilmiştir.

Windows Azure Storage hizmeti, üç parçalı ve parçalara özgü özelliklerin olması sebebi ile anlatımın devamında Windows Azure Storage ‘ın parçalarından olan Windows Azure Table
Storage
ile ilgili bilgiler verilecektir.

Windows Azure Table Storage, SQL Database yaklaşımında bulunan Table nesnesine
benzemektedir. Ama yapısal bazı özgü özelliklerden dolayı, Windows Azure Table Storage yapısı SQL Database’de bazı farklıklar göstermektedir. Aşağıda Windows Azure Storage ve SQL Database ile ilgili bilgi ve karşılaştırmalar bulunmaktadır.

Özellik

Windows Azure Table Storage

SQL Database

İlişkisel veri

Desteklemiyor

Destekliyor

Server-side çalışama

Desteklemiyor

Destekliyor

Geo-replication

Destekliyor

Desteklemiyor

Scale-out

Otomatik

Manuel

LINQ desteği

Destekliyor

Destekliyor

Veri erişimi

OData Protokol

ODBC ya da JDBC

Yönetim protokollü

HTTP/HTTPS üzerinde REST

HTTP/HTTPS üzerinde REST ile ODBC/JDBC

En az veri depolama

1MB

2GB

En fazla veri depolama

100TB Tablo başına

150GB Tablo başına

Firewall Güvenliği

Desteklemiyor

Destekliyor

REST protokol ile erişim

Destekliyor

Destekliyor

Transaction

Destekliyor (Limitli)

Destekliyor

Transaction logs tutma

Desteklemiyor

Destekliyor

Windows Azure Table ile çalışmak, veritabanı işlemlerini Entity Framework ile yapmak kadar kolay, işlevsel ve hızlıdır. Windows Azure Table Storage, veri işlem süreçlerin de LINQ sorgularını kullanılabilmektedir. Entity Framework ile geliştirilen uygulamalarda DbContext nesnesi kullanıldığı gibi Windows Azure Table Storage yapısında ise, TableServiceContext nesnesi kullanılmaktadır.

public class FunnyAppContext : TableServiceContext

{

    public FunnyAppContext(string baseAddress, StorageCredentials credentials)

        : base(baseAddress, credentials)

    {

    }

    public IQueryable<Tag> Tag

    {

        get { return this.CreateQuery<Tag>(“Tag”); }

    }

    public IQueryable<Post> Post

    {

        get { return this.CreateQuery<Post>(“Post”); }

    }

    public IQueryable<Comment> Comment

    {

        get { return this.CreateQuery<Comment>(“Comment”); }

    }

}

Uygulama örneği olan, “WindowsAzure.FunnyApp” çalışması nesneye yönelimli olarak geliştirilerek, gerçek yaşamda karşılaşabilecek durumlar ele alınmaya çalışılmıştır. Aşağıda “WindowsAzure.FunnyApp” çalışması ile ilgili sınıf ilişkisel şeması bulunmaktadır.

Yukarıdaki şema da görüldüğü gibi EntityBase sınıfı TableServiceEntity sınıfında türetilmiştir. Yapılan türetme ile Windows Azure Table Storage Entity fonksiyonelliği kazandırılmış olacaktır.  Temel sınıf olan EntityBase sınıfından türeyen sınıflar,  “PartitionKey” , “RowKey” ve “Timestamp” özellikleri kazanmaktadır.  Söz konusu özellikler, Windows Azure Table Storage içerisinde verilerin, benzersiniz(“PartitionKey” , “RowKey”) ve işlem zamanı(“Timestamp”) ile ilgili bilgiler taşımaktadır.

public class EntityBase : TableServiceEntity
{
    public EntityBase()
    {
        this.PartitionKey = DateTime.UtcNow.ToString("MMddyyyy");
        this.RowKey = string.Format("{0:10}_{1}", 
            DateTime.MaxValue.Ticks - DateTime.Now.Ticks, Guid.NewGuid());
    }
}

Klasik uygulama veritabanı uygulama geliştirme sürecinde gerçekleştirildiği gibi Windows Azure Table Storage ile de GRUD işlemleri yapılabilmektedir. Yapılan işlemlerin bir kalıp üzerinde gidebilmesi amacı ile Repository tasarım deseni kullanılmıştır.

public interface IRepository<TEntity>
{
    TEntity Find(string partitionKey, string rowKey);
    TEntity Find(string rowKey);
    void Create(TEntity entity);
    void Delete(TEntity entity);
    void Update(TEntity entityToUpdate);
    void SubmitChange();
    IQueryable<TEntity> Get();
}

Windows Azure Table Storage nesnesi ile veri işlemlerinin yönetebilmesi amacı için Repository nesnesinin yönetilebildiği FunnyAppRepository sınıfı hazırlanmıştır. Sınıf EntityBase türüne ait nesnelere hizmet vermek amacı ile sınırlandırılmıştır.

public class FunnyAppRepository<TEntity> : IRepository<TEntity>, 
    IDisposable where TEntity : EntityBase
{
    // veri işlemleri ile ilgili kullanıcı 
    // hesap bilgilerinin alınması
    private static CloudStorageAccount _storageAccount;
    
    // iş nesnesi ile ilgili tanımlamanın yapılması
    private readonly FunnyAppContext _context;
    
    // nesne türüne ayit isim alınması
    private readonly string _entitySetName;

    public FunnyAppRepository()
    {
        // veri işlemleri ile ilgili gerekli bilgilerin alınması
        _storageAccount = 
            CloudStorageAccount
            .FromConfigurationSetting(Utils.ConfigurationString);
        // Veri hesap bilgilerinin bilgilerin ve iş
        // nesnesinin Table model atanması
        CloudTableClient.CreateTablesFromModel(
            typeof (FunnyAppContext),
            _storageAccount.TableEndpoint.AbsoluteUri,
            _storageAccount.Credentials);

        // seçili olan nesne türünün isminin alınması
        _entitySetName = typeof (TEntity).Name;

        // Nesnenin Windows Azure Storage içerisinde
        // Tanımlı olup / olmadığı kontrol edilir.
        // Tanımlı değil ise, oluşturulur.
        _storageAccount.CreateCloudTableClient()
            .CreateTableIfNotExist(_entitySetName);

        // GRUD işlemleri ile ilgili iş nesnesi oluşturulması
        this._context = new FunnyAppContext(
            _storageAccount.TableEndpoint.AbsoluteUri, 
            _storageAccount.Credentials);
        this._context.RetryPolicy = RetryPolicies.Retry(3, 
            TimeSpan.FromSeconds(1));
    }
    
    // nesne türüne bağlı olarak
    // rowkey ve partitionkey ile kayıt getirme
    public TEntity Find(string partitionKey, string rowKey)
    {
        return (from g in _context.CreateQuery<TEntity>(_entitySetName)
                where g.PartitionKey == partitionKey && g.RowKey == rowKey
                select g).FirstOrDefault();
    }

    // nesne türüne bağlı olarak
    // rowkey ile kayıt getirme
    public TEntity Find(string rowKey)
    {
        return (from g in _context.CreateQuery<TEntity>(_entitySetName)
                where g.RowKey == rowKey
                select g).FirstOrDefault();
    }

    // nesne türüne ayit yeni üye oluşturma
    public void Create(TEntity entity)
    {
        this._context.AddObject(_entitySetName, entity);
    }

    // nesne silmek için
    public void Delete(TEntity entity)
    {
        this._context.DeleteObject(entity);
    }

    // nesne güncellemek için
    public void Update(TEntity entityToUpdate)
    {
        this._context.UpdateObject(entityToUpdate);
    }

    // yapılan değişikleri depolama alanına yansıtmak için
    public void SubmitChange()
    {
        this._context.SaveChanges();
    }

    // nesne türüne ayit tüm içerikleri çekebilmek için
    public IQueryable<TEntity> Get()
    {
        return this._context.CreateQuery<TEntity>(_entitySetName);
    }

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

Tanımlaması yapılan iş nesnelerinin, kullanımı ile uygulama senaryosu olan, Kullanıcın tarafında yüklenen fotoğrafların görüntülenme süreci gerçekleştirilmektedir. Yapılan işlem ile LINQ
sorgusu kullanarak gerçekleşmektedir.

public partial class MyUploads : Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack) return;
        
        // Post nesne türüne ayıt, repository iş nesnesinin tanımlanması
        FunnyAppRepository<Post> _postRepository = 
            new FunnyAppRepository<Post>();

        List<PostViewData> viewDatas = new List<PostViewData>();

        // istenilen öncüllerin oluşturulduğu Linq sorgusu
        // tanımlanması
        _postRepository.Get().Where(post => 
            post.UserId == Membership.GetUser(Page.User.Identity.Name)
            .ProviderUserKey.ToString()).ToList()
                       .Where(post=> post.State)
                       .OrderByDescending(post => post.Timestamp)
                       .Take(20).ToList().ForEach(
                       post => viewDatas.Add(new PostViewData()
                       {
                           PostContent = post.PostContent,
                           PostImage = post.PostImage,
                           RowKey = post.RowKey,
                           UserId = post.UserId
                       }));
        
        this.RepeaterImages.DataSource = viewDatas;
        this.RepeaterImages.DataBind();
    }
}

Her yeni gün, yeni çalışmalar ve işlemler yapmaktayız. Gerçekleştirilen süreçler, veri yığınları oluşmasına neden olmaktadır. Meydana gelen veri yığınları, güncelleme, analiz ve depolama gibi gereksinimleri ortaya çıkarmaktadır. Yaşanan problemler, ortaya çıkan NoSQL yaklaşımları ile amaçlanmaktadır.

Veri yapılarının hatalı analiz ve planlanması nedeni ile veri ile ilgili tüm alanlarda problemlerin ortaya çıkması mümkün olacaktır.

Not: Yapılan anlatımın örneklenmesi amacı ile “WindowsAzure.FunnyApp” uygulaması hazırlanmıştır. Aşağıdaki bağlantı kullanılarak, uygulama kaynak kodlarına erişebilirsiniz.

Github / https://github.com/ibrahimatay/WindowsAzure.FunnyApp

Windows Azure Storage yaklaşımı, geliştiricilerine kullandıkları verilerin sınıflandırma ve planlamaya yöneltmektedir. Veri yığınlarının, Windows Azure Storage uyumluluğunun sağlanması ile esnek ve kolay yönetilebilir yapılara sahip olunmaktadır.

TC Kimlik Numarası

http://www.nvi.gov.tr/Hakkimizda/Projeler,Mernis_Hedef.html

http://tr.wikipedia.org/wiki/T%C3%BCrkiye_Cumhuriyeti_Kimlik_Numaras%C4%B1

no:sql(east)

https://nosqleast.com/2009/

Repository Pattern

http://martinfowler.com/eaaCatalog/repository.html

Windows Azure Table Storage and SQL Database – Compared and Contrasted

http://msdn.microsoft.com/en-us/library/windowsazure/jj553018.aspx

Windows Azure Table Storage

http://www.windowsazure.com/en-us/develop/net/how-to-guides/table-services/

Windows Azure ile Cloud Computing Uygulamaları – 6 (Video)

Kurumsal hayat, süreçlerini iş kural ve standartlarına bağlı gerçekleştirmek için iş uygulamaları kullanılmaktadır. Kullanılan iş uygulamaları, farklı zaman aralıkların da meydana gelebilecek, iş yoğunluklarına başarılı ve performanslı olarak, cevap üretmesi beklenmektedir.

Uygulama yaşam ortamları, uygulamalar üzerinde bulunan iş yoğun düzenlemesini sağlamaktadır.  Kullanılan uygulamaların yazılım mimari yapısı ise,  uygulamanın sağlık ve başarılı çalışması sağlamaktadır.

Günümüzde iş gereksinimlerinin çeşitlenmesi, süreçlere uygun iş uygulamaların geliştirilmesine sebep olmaktadır. Uygulamaların, iş süreçlerine dayanıklı ve başarılı sonuçlar üretmesi, geliştirilen uygulamanı yaşadığı platform ve yazılım mimarisi ilgili olarak çalışmaktadır.

Windows Azure ile Cloud Computing uygulamaları yayın serisinin “Windows Azure ile Cloud Computing uygulamaları – 6” bölümünde geliştirilen uygulamaların içerisinde bulunduğu Platform ve yazılım mimarilerin biri ile ilişkisi anlatılarak, Windows Azure Cloud Service hakkında bilgiler verilmiştir.

Windows Azure ile Cloud Computing uygulamaları yayın serisinde gerçekleştirecek uygulama ile ilgili olarak, aşağıdaki bağlantıları takip etmenizi önermekteyim.

Github / https://github.com/ibrahimatay/WindowsAzure.FunnyApp

Windows Azure ile Cloud Computing uygulamaları yayın serisinin yeni bölümünü yayınlamış bulunmaktayım.

Windows Azure ile Cloud Computing Uygulamaları – 6

Şirketler, yaşamlarını sürdürebilmek amacı ile çeşitli iş süreçleri gerçekleştirmektedir. İş süreçleri, sürekli ve başarılı sonuçlar üretilmesi, iş kural ve standartları ile sağlanmaktadır. Oluşturulan iş kuralları, kalitenin korunmasını amaçlamaktadır.

Günümüzde müşteri memnuniyetinin, devamlı ve istenildiği gibi sağlanması, iş uygulamaları ile gerçekleştirilmektedir. İş standart ve kurallarının farklık göstermesi, kullanıcıları özelleştirilmiş uygulamalara yöneltmektedir.

Müşteri portföylerine, uygun üretim ve hizmetlerin sunulması, iş süreçlerinin sürekli ve başarılı
olması ile sağlanmaktadır. İstenilen sonuçlar, süreçleri gerçekleştiren ve izleyen uygulamaların sağlıklı çalışması ile sağlanmaktadır.

İş uygulamaları kullanımı, gerçekleştireceği iş sürecinin yoğunluğuna bağlı olarak değişmektedir. Örneğin; yılbaşı dönemini de içerisine alan yılın son üç ayı, e-ticaret ve şirketlerin muhasebe bölümleri, hesapları kapatabilmek ve ürün satmak amacı ile yoğun olarak çalışmaktadır. Gerçekleştirilen işlemler, yılın diğer zamanlarına göre daha yoğundur. İş uygulamaları, farklı zaman birimlerinde oluşan iş yoğunlukların başarı ve performans ile çalışabilmesi için elastik çalışma ortamlarına ihtiyaç duymaktadır.

Şirketler, iş süreçlerini devamlı, en az maliyet ve başarılı olarak gerçekleştirmek amacı ile uygulamalarını Cloud Computing sağlayıcı şirketler ve özellikle Microsoft Windows Azure Platform’a taşımaktadır. 

İş uygulamalarının Windows Azure Platform’a taşınması ile uygulamaların, kullanabileceği zengin alt yapı sağlanmaktadır. Uygulamaların çalışma ortamın’da Windows Azure Platform gibi zengin bir ortama taşınması, kullanıcıları tarafında meydana gelecek olan iş yükünün düzenlenmesine ve uygulama üzerinde bulunan stresin azaltılmasını sağlayacaktır. Ama Windows Azure Platform ‘un sağlamış olduğu alt yapı gücün amaçlandığı gibi kullanılmasını sağlamayacaktır. İş uygulamaları, Windows Azure Platform içerisinde en iyi başarı ve performansı yakalayabilmesi için, uygulamaların Windows Azure Platform ‘a uyumlu olarak geliştirilmesi gerekmektedir.

Uygulama yaşam ortamları, uygulamalar üzerinde bulunan iş yoğunluğu düzenlemesini sağlamaktadır.  Kullanılan uygulamaların yazılım mimari yapısı ise,  uygulamanın sağlık ve
başarılı çalışmasını sağlamaktadır.

Geliştirilen iş uygulamalarının, Windows Azure Platform alt yapı zenginliklerini en iyi şekilde kullanılabilmesi için Windows Azure Platform ‘un desteklemiş olduğu, Windows Azure Cloud Service uygulama modelinin kullanılması önerilmektedir. Uygulamalar, Windows Azure Cloud Service modeli ile kolay yönetilebilir, güvenli ve elastiki yaşam ortamı kazanmaktadır.

Uygulama geliştiricilerinin, Windows Azure Platform zenginleri ve Windows Azure Cloud Service uygulama modelinin hızlı ve kolay öğrenebilmesi amacı ile “WindowsAzure.FunnyApp” uygulama örneği hazırlanmıştır. Uygulama örneği ile temsili olarak iş yoğunlukların dağıtılması ve katmanlı çalışma süreçleri incelenmiştir. Uygulama örneğinde aşağıda belirtilen, senaryolar gerçekleştirilmiştir.

  • Kullanıcı hesabının işlemleri (kullanıcı adı, parola, eposta)
  • Resim yükleme alanının oluşturulması (istenen resmin yüklenmesi, açıklama, ilgili etiketler)
  • Yüklenen resimlerin thumbnail boyutlarında şekillendirilmesi (Windows Azure Worker Role)
  • Yüklenen resimlerin görüntülenmesi (thumbnail boyutunda resimlerin listelenmesi)
  • Resminde detay gösterilmesi (açıklama, etiketler ve yüklene boyutlarda resim)
  • Yorum giriş alanın oluşturulması (kullanıcı adı, eposta ve yorum)
  • Yorumların listelenmesi (Kullanıcı adı ve yorum gösterilmesi)

İş uygulamaları içerisinde kullanıcı işlemlerinin gerçekleştirildiği alanlar olduğu gibi yoğun iş yükünün olduğu parçalar da bulunmaktadır. İş uygulamalarında örneğin; resim ya da video işleme, yoğun muhasebe ve arama işlemleri gerçekleştirilebilmektedir. Söz konusu işlemler, Windows Service uygulamaları ya da kullanıcı işlemlerinin devam ettirebileceği şekilde planlanmaktadır.

Uygulama örneği olan, WindowsAzure.FunnyApp” çalışması içerisinde kullanıcı tarafında yüklenen resim içeriğin, içerik bilgisi alınarak işleme katmanına taşınmaktadır. Yapılan işlem ile kullanıcı çalışmalarına devam ederken, resim işleme süreçleri farklı katmanda tamamlanmaktadır. İşlem sürecinde Windows Azure nesneleri kullanarak, katmanlar arasında mesajlaşma işlemleri ile gerçekleşmektedir.

Windows Azure Platform içerisinde birbirinden bağımsız olan, uygulama katmanları iletişiminin sağlanması amacı ile Queues nesnelerinin kullanılması önerilmektedir. Queues nesneleri, Windows Azure Storage içerisinde bulunduğu gibi Windows Azure ServiceBus Queues yaklaşımı ile de kullanılmaktadır.

Windows Azure Platform içerisinde aynı uygulama domaininde çalışan, katmanlar arası iletişimin sağlanması amacı ile Windows Azure Storage içerisinde bulunan Queues nesnesi kullanılması önerilmektedir. Uygulama parçalarının dışı ya da iç sistemler ile iletişim sağlaması için Windows Azure ServiceBus Queues yaklaşımın kullanılması önerilmektedir.  Windows Azure Platform ‘un desteklemiş olduğu Queues nesneleri ile ilgili bilgi ve karşılaştırma aşağıda
bulunmaktadır.

Özellik

Windows Azure Queues

Windows Azure Service Bus Queues

Toplu mesaj gönderme

Desteklemiyor

Destekliyor

Toplu mesaj alma

Destekliyor

Destekliyor

WCF Entegrasyonu

Desteklemiyor

Destekliyor

WF Entegrasyonu

Geliştirme Gerektiriyor

Destekliyor

Server-Side Transaction Log

Destekliyor

Desteklemiyor

Zamanlanmış Gönderim

Destekliyor

Destekliyor

En az mesaj boyuttu

64KB

256KB

En fazla mesaj boyuttu

100TB

1,2,3,4 ya da 5GB

Kuyruk Algoritması

First-In-First-Out (FIFO)

Kullanılan iletişim protokollü

HTTP/HTTPS üzerinde Rest

HTTPS üzerinde Rest

Peek fonksiyon desteği

Destekliyor

Desteklemiyor

Authentication

Symmetric key

ACS claims

Yetki tabanlı iletişim

Desteklemiyor

Destekliyor

Gerçekleştirilen uygulama örneği, dış herhangi sistem ile iletişim kurmaması nedeni ile Windows Azure Queues kullanılmıştır. Uygulama içerisinde mesaj içeriğinin gönderilmesi ve dinleyici tarafından alınması ile ilgili süreçler gerçekleştirilmiştir.  Uygulama senaryoları, aşağıda kaynak kodlar ile incelenmektedir.

Aşağıda anlatılan süreçler de kullanılmak üzere bazı sabitler tanımlanmıştır. Tanımlanan
değişkenler, yazılan kod içerisinde anahtar içeriklerin tek noktada kontrolünü sağlamaktadır. Blob, Queue nesneleri için tanımlanan değişken değerlerinin, küçük harf ile yazılmasına dikkat edilmelidir.

public class Utils

{

    public const string ConfigurationString = “DataConnectionString”;

    public const string CloudQueueKey = “imagequeue”;

    public const string CloudBlobKey = “imageblob”;

}

Uygulama Senaryosu – I

Kullanıcı tarafında resim ve ilgili bilgilerin girilmesi işlemleri gerçekleştirilmektedir. Gerçekleştirilen işlemler ile ilgili bilgiler mesaj kuyruğuna girmesini sağlayacaktır. Konu ile ilgili kaynak kodlar, yorumlar ile aşağıda anlatılmıştır.

private static readonly object _look = new object();

private static bool _storageInitialized = false;

// işlem gerçekleştirlecek olan nesnelerin tanımlanması

private static CloudBlobClient _blobClient;

private static CloudQueueClient _queueClient;

protected void Page_Load(object sender, EventArgs e)

{

    this.Page.Title = “Image Uploads”;

    if (IsPostBack) return;

    InitializeStorage();

}

protected void ButtonSave_Click(object sender, EventArgs e)

{

    if (FileUploadImage.HasFiles & Page.IsValid)

    {

        string uniqueBobName = string.Format(

{0}/funnyimage_{1}{2}Utils.CloudBlobKey,

                 Guid.NewGuid().ToString(),

                 Path.GetExtension(FileUploadImage.FileName));

        CloudBlockBlob blob = _blobClient.GetBlockBlobReference(uniqueBobName);

        blob.Properties.ContentType = FileUploadImage.PostedFile.ContentType;

        blob.UploadFromStream(FileUploadImage.FileContent);

        FunnyAppRepository<Post> postRepository = new FunnyAppRepository<Post>();

        FunnyAppRepository<Tag> tagRepository = new FunnyAppRepository<Tag>();

        MembershipUser user = Membership.GetUser(Page.User.Identity.Name);

        if (user != null)

        {

            Post post = new Post

                {

                    PostContent = TextBoxDescription.Text,

                    PostTitle = TextBoxTitle.Text,

                    State = false,

                    UserId = user.ProviderUserKey.ToString()

                };

            string[] tags = TextBoxTag.Text.Split(‘;’);

            foreach (string tag in tags)

            {

                if (!string.IsNullOrEmpty(tag))

                {

                    tagRepository.Create(new Tag()

                        {

                            PostRowKey = post.RowKey,

                            PostPartitionKey = post.PartitionKey,

                            TagName = tag,

                        });

                    tagRepository.SubmitChange();

                }

            }

            postRepository.Create(post);

            postRepository.SubmitChange();

            // Kuyruk nesneleri 

            CloudQueue queue = 

_queueClient.GetQueueReference(Utils.CloudQueueKey);

            // mesaj içeriğinin oluşturulması

            // mesaj içerisinden birden fazla bilgi olması sebebi ile “,” 

            // karakteri ile bilgiler birbirinden ayrılmıştır.

            CloudQueueMessage message =

                new CloudQueueMessage(string.Format({0},{1},{2}, blob.Uri, 

post.PartitionKey, post.RowKey));

            // Mesaj kuyruğa eklenmiştir.

            queue.AddMessage(message);

            LabelResult.Text = “Uploaded”;

        }

        else

        {

            LabelResult.Text = “Failed”;

        }

    }

}

private void InitializeStorage()

{

    if (_storageInitialized)

    {

        return;

    }

    

    lock (_look)

    {

        if (_storageInitialized)

        {

            return;

        }

        try

        {

            // hesap bilgilerinin alınması

            CloudStorageAccount storageAccount = 

CloudStorageAccount.FromConfigurationSetting(Utils.ConfigurationString);

            // image blob taşıyıcısının oluşturulması

            _blobClient = storageAccount.CreateCloudBlobClient();

            CloudBlobContainer container = 

_blobClient.GetContainerReference(Utils.CloudBlobKey);

            container.CreateIfNotExist();

            // Blob taşıyıcısına ile ilgili erişim ayarlarının tanımlanması

            var permissions = container.GetPermissions();

            permissions.PublicAccess = BlobContainerPublicAccessType.Container;

            container.SetPermissions(permissions);

            // create queue to communicate with worker role

            _queueClient = storageAccount.CreateCloudQueueClient();

            CloudQueue queue = _queueClient.GetQueueReference(Utils.CloudQueueKey);

            queue.CreateIfNotExist();

        }

        catch (WebException exception)

        {

            Trace.Write(exception.Message);

        }

        _storageInitialized = true;

    }

}

Uygulama Senaryosu – II

Mesaj kuyruğunun dinlenmesi ve ilgili bilgilerin alınması gerekmektedir. Söz konusu bilgilerin
alınması ile Worker Role içerisinde resim işleme süreci istenilen boyutlara şekillendirilecektir. Dinleme işlemi, uygulama yaşam süresi boyunca, kullanıcı taleplerinin gerçekleştirilmesi amacı
ile sonsuz bir döngü içerisinde gerçekleştirilmektedir.

// işlem gerçekleştirlecek olan nesnelerin tanımlanması

private CloudQueue _queue;

private CloudBlobContainer _container;

public override void Run()

{

    // Worker nesnesi içerisinde sürecin sürekli olarak gerçekleştirilmesi amacı ile

    // sonsuz döngüye alınması gerekmektedir.

    while (true)

    {

        try

        {

            // İşlem sürecinde kuyruk içerisinde bulunan mesajın dinleme işlemi

            CloudQueueMessage message = _queue.GetMessage();

            if (message != null)

            {

                string[] messageArray = message.AsString.Split(new char[] { ‘,’ });

                string outputBlobUri = messageArray[0];

                string partitionKey = messageArray[1];

                string rowkey = messageArray[2];

                // Kuyruk içerisinde okunan mesajı, döngü içerisinde 

// tekrar okuması önemek amacı ile

                // mesaj Peek edilmektedir.

                _queue.PeekMessage();

                string inputBlobUri = Regex.Replace(

outputBlobUri, “([^\\.]+)(\\.[^\\.]+)?$”“$1-myimage$2”);

                _container.CreateIfNotExist();

                CloudBlob inputBlob = _container.GetBlobReference(outputBlobUri);

                CloudBlob outputBlob = _container.GetBlobReference(inputBlobUri);

                

                var u = inputBlob.Uri.AbsolutePath;

                // Blob nesnesi içerisinde bulunan resim içeriği okunması

                using (BlobStream input = inputBlob.OpenRead())

                using (BlobStream output = outputBlob.OpenWrite())

                {

                    ProcessImage(input, output);

                    

                    output.Commit();

                    outputBlob.Properties.ContentType = “image/jpeg”;

                    outputBlob.SetProperties();

                    FunnyAppRepository<Post> postRepository =

 new FunnyAppRepository<Post>();

                    Post post = postRepository.Find(partitionKey, rowkey);

                    

                    post.PostImage = inputBlobUri;

                    post.State = true;

                    postRepository.Update(post);

                    postRepository.SubmitChange();

                    _queue.DeleteMessage(message);

                }

            }

        }

        catch (StorageClientException e)

        {

            Trace.Write(e);

        }

    }

}

public override bool OnStart()

{

    // Worker üzerinde başlatılması amaçlanan varsayılan bağlantı sayısı

    ServicePointManager.DefaultConnectionLimit = 12;

    // Uygulama içerisinde bağlantı bilgilerinin alınma işlemi

    CloudStorageAccount.SetConfigurationSettingPublisher((configName, configSetter) => 

        configSetter(RoleEnvironment.GetConfigurationSettingValue(configName)));

    

    // Uygulama içerisinde bağlantı bilgilerinin alınma işlemi

    var storageAccount = 

CloudStorageAccount.FromConfigurationSetting(Utils.ConfigurationString);

    

    // kuyruk nesnesi ile ilgili refeasnların oluşturulması

    CloudQueueClient queueStorage = storageAccount.CreateCloudQueueClient();

    _queue = queueStorage.GetQueueReference(Utils.CloudQueueKey);

    

    // kuyruk nesnesinin bulunup-bulunmadığı kontrollünün yapılması

    _queue.CreateIfNotExist();

    CloudBlobClient blobStorage = storageAccount.CreateCloudBlobClient();

    _container = blobStorage.GetContainerReference(Utils.CloudBlobKey);

    _container.CreateIfNotExist();

    

    return base.OnStart();

}

// Resim boyutlandırma işlemleri ile fonksiyon

public void ProcessImage(Stream input, Stream output){ … }

İş uygulamalarının,  her yeni gün daha fazla kullanılması ile iş yükleri artırılmaktadır. Gerçekleştirilen her sürecin, devamlı ve başarılı sonuçlar üretmesi beklenmektedir. Süreçlerin
planlandığı gibi gerçekleşmesi, süreç içerisinde kullanılan uygulamanın sağlıklı çalışması büyük önem taşımaktadır.

Not: Yapılan anlatımın örneklenmesi amacı ile WindowsAzure.FunnyAppuygulaması hazırlanmıştır. Aşağıdaki bağlantı kullanarak, uygulama kaynak kodlarına erişebilirsiniz.

Github / https://github.com/ibrahimatay/WindowsAzure.FunnyApp

İş uygulamaların başarılı ve performanslı çalışması, uygulama yazılım mimarisi ve konumlandırıldığı platform ile ilişkili olarak gerçekleşmektedir. Windows Azure Cloud Service uygulama geliştirme modeli ile geliştirilen uygulamalar, iş sürecine bağlı olarak parçalarına ayrılarak, beklenen başarı ve performans elde edilebilmektedir.

Windows Azure Queues and Windows Azure Service Bus Queues – Compared and Contrasted

http://msdn.microsoft.com/en-us/library/hh767287(VS.103).aspx

What is a cloud service?

http://www.windowsazure.com/en-us/manage/services/cloud-services/what-is-a-cloud-service/

The NIST Definition of Cloud Computing

http://csrc.nist.gov/publications/nistpubs/800-145/SP800-145.pdf

Windows Azure Cloud Service Uygulamaları Internet Semineri Notları

Kullanıcı istekleri sürekli değişmektedir. Yeni çözümler ve uygulanan mimariler, kullanıcının güvenli ve performanslı olarak işlem yapabilmesini amaçlamaktadır. Günümüzde Cloud Computing mimarisi ile devam eden süreç de verimli çalışmak amacı ile uygulama mimarileri oluşturulmuştur.

Günümüzde şirketinizin ne kadar büyük olduğu değil, süreçlere ne kadar hızlı adapte olduğunuz ve cevap verdiğiniz önem kazanmaktadır. Büyümeye çalışan şirketler, artan operasyonları ve yoğunluklarına bağlı olarak özgür çalışabilecekleri sistemleri kullanmaktadır.

Windows Azure Platform, kullanıcılarına birçok çözüm sunmaktadır. Sunulan çözümler,
uygulama geliştirme stratejilerine bağlı seçilmektedir. Windows Azure Platform ile güvenli
seviyesi yüksek ve performanslı uygulamaların geliştirilebilmesi amacı ile Windows Azure Cloud Service uygulama geliştirme yaklaşımını sunmuştur.

Geçtiğimiz tarihlerde, “Windows Azure Platform Başlarken Internet Semineri Notları” isimli yazı ile “A’dan Z’ye Windows Azure ile Uygulama Süreçleri” internet seminerinin başladığını bilgisini verilmişti. Geçtiğimiz hafta ise, internet seminer serisinin ikinci bölümü olan, “Windows Azure Cloud Service Uygulamaları” internet semineri gerçekleştirilmiştir.

Internet semineri ile Windows Azure Cloud Service mimarisi ve kolayca uygulama geliştirme kolaylıkları hakkında bilgiler verilmiştir. Windows Azure Platform ile ilgili gerçekleştirilen, internet seminerlerine katılmak için “A’dan Z’ye Windows Azure ile Uygulama Süreçleri” yazısında bulunan katılım bağlantılarını kullanmanızı gerekmektedir.