Bir .Net Framework Projesini .Net Core’a Geçirirken Dikkat Edilecek Hususlar

PEAKUP’da kendi ürünlerimizin ihtiyacı olan bazı veriyi uygulama bazlı tutmak yerine tek bir merkezden sağlamak üzere uzun zaman önce geliştirdiğimiz bir “Data” projesi bulunuyor. Öncelikle biraz uygulamanın ne yaptığından ve neleri barındırdığından bahsetmek istiyorum. Projeyi henüz .NET Core ilk çıktığında geliştirmeye başlayıp, .NET Core’un biraz daha stabil hala gelmesini beklemek için .Net Framework ile geliştirdik.  Veri tabanı tamamen EntityFramework Code First ile tasarlandı. Veri tabanı olarak Azure SQL Server kullanıyoruz. Bu servis içerisinde hemen hemen her uygulamada ihtiyaç duyulan; kıta, ülke, şehir gibi coğrafi bilgilerin yanında 2020, 2021 yılı resmî tatil günleri, anlık hava durumu bilgisi ve döviz kuru ve benzeri gibi bilgiler yer almaktadır. Servis içerisinde verilerin sunumu için kullandığımız web uygulamasının yanında, hava durumu ve döviz için birden fazla kaynağa bağlanıp veri çeken ve bunları hem veri tabanına hem de Redis ile daha hızlı çıktılar vermek için Cache’e yazan iki Azure Job projesi daha bulunmaktadır.

Neden .Net Core’a Geçiş Yapıyoruz?

Öncelikle Microsoft’un .Net Core için uzun süredir yaptığı geliştirme eforuna ve olup bitene baktığımızda .Net Framework için uzun vadede geliştirmelerin bir süre sonra duracağını ya da kısıtlı bir hale geleceğini ön görebilmek hiç zor değil.  Anlatacağım birtakım şeyler .Net Framework ile de mümkün olsa da çıktılarının .NET Core kadar iyi olmadığı ya da süreç içerisinde ekstra zaman kaybına sebep olan bazı sorunlar yaşandığı aşikâr!

Projeye yakın zamanda eklemek istediğimiz; Image Compression, Video Compression gibi özellikler için arayıp bulduğumuz kütüphanelerin yalnızca .Net Core tarafında geliştirildiğini görmek, daha uzun vadede yapılacak geliştirmeler için bu eforu neredeyse yarı yarıya düşürmek anlamında çok önemli durumdadır.

Uygulamaya istek gönderen diğer PEAKUP ürünlerindeki kullanıcı sayısı giderek artarken dolaylı olarak tuttuğumuz hava durumu ve döviz verisinde de büyük bir artış gözlemleniyor. Uygulaya gelen istek sayısı ve verinin büyüklüğü arttıkça Response sürelerindeki artış ve hem web uygulamasının hemde kullandığımız SQL veri tabanının artık maliyet ve performans olarak bir probleme dönüşmesinin önünü almak en önemli sebepler arasında yer almaktadır.

Şu anda projeyi standart bir şekilde iki ayrı Git Branch’inde tutuyoruz. Geliştirmeleri Dev’de yapıp, her şeyin tamam olduğunu gördükten sonra master’a Merge edip bütün süreçteki Deployment faaliyetini manuel olarak yürütüyoruz. Sık sık açıp üzerinde geliştirme yaptığımız bir proje olmasa da bu sürecin Azure DevOps ile tamamen manuel ve elle Deploy edilir bir halden çıkartılıp. Otomatik olarak Deploy eden, veri tabanında Migration’ları kendisi çalışan bir hale doğru ilerlemesi arzu ettiğimiz bir geliştirme süreci, bunu .NET Core ile daha verimli ve daha hızlı bir şekilde yapmanın önü .NET Framework’e göre oldukça daha esnek zira proje içerisinde paket yönetimi daha kolay bir şekilde tasarlanmış.

PEAKUP tarafından tamamen SaaS olarak geliştirilen uygulamalara geçiş yapan müşterilerin, bütün süreci bir kerede tamamlayıp kullanıcılarına ürünleri duyurduklarına gelen sıra dışı yükü Scale etmek için uygulama tarafında sürekli Azure Servis Planları arasında geçiş yapmaktaydık. Bu hem maliyet olarak hem de uygulamayı Scale etmek konusunda Azure Web Application tarafında birtakım kısıtlamalara neden oluyordu. Azure DevOps ile uygulamanın tamamen Container’lara taşınarak hem kendini Scale Down yapıp hem de ihtiyaç durumunda sınırsız sayıda Container ayağa kaldırarak bütün taleplere, aynı ve hatta daha yüksek hızda cevap vermesi de olmasını istediğimiz özelliklerden birisiydi! Projeyi geçirdikten sonra yaptığım testler ile aslında Docker ve Kubernetes ile ilgili atılacak adımlar için çok erken olduğunu gördükten sonra web uygulamasıyla devam etmeye karar verdim.

Karşılaştığım Problemler ve Çözümleri

  • Routing’de Değişiklik

Üzerinde neredeyse yarım günlük efor harcadığım bu problemle karşılaştığımda geçişin ne kadar sancılı olacağını tahmin etmeye başladım. Proje içerisinde kullandığımız Interface tasarımında iki adet GET metodu bulunuyordu ve bunlardan bir tanesi tüm kayıtları ötekiyse aldığı Id parametresine göre verileri döndürüyordu. Net Core tarafındaki Routing ile ilgili hatalı tasarımların önüne geçilmek için bu daha izin verilmediğini araştırarak öğrendim. Bu nedenle metot içerisindeki Id parametresini Nullable yaparak duruma göre farklı davranan tek bir metot ile devam etmeye karar verdim.

  • Entity Framework Core’daki Değişen İsimlendirmeler

Projeyi geliştirirken kullandığımız modellerin tamamını .NET Core’a geçerken birebir kullandım. Auto Migration sayesinde veri tabanında çıkacak Schema’nın birebir olmasından emindim ancak .NET Framework tarafında ilişkilerin kurulduğu alan isimleri herhangi bir karakter değişimine uğramazken .NET Core’da ilişki için kullanılan alanlar arasında alt çizgi eklendiğini gördüm. Bu nedenle Schema’yı birebir kurmak ve direkt olarak Production’daki verileri taşıyabilmek için haliyle [ForeignKey(“X_Id”)] Attribute’undan faydalanarak kolonlardaki verinin eski standartlara uymasını sağladım.

  • Veri Tabanın Taşınması

Veri tabanında hiçbir veri kaybetmeden yaklaşık 12GB civarındaki verinin kopyasını Azure üzerindeki bir sunucuya çektim. Oradan kendi bilgisayarıma zipleyerek indirdiğim için 12GB civarındaki veriyi 900MB text olarak kendi makineme aldım ve verinin geçişi ile ilgili senaryoları denemeye başladım. Weather (eski hava durumu verisi), Forecast (yeni yayına aldığımız hava durumu verisi) ve Currency tabloları bu veri tabanındaki büyüklüğün başlıca sebeplerindendi. Bu nedenle bu üç tabloyu tek tek geçirerek ilerlemeye karar verdim. Denediğim senaryolar arasında SQL içerisinde adeta benchmarking yaptığımı söyleyebilirim.

Çektiğim dosyayı komple bir veri tabanı üzerinde ayağa kaldırıp ardından verilerin girişini sağlasam da işlemler hem uzun sürüyor hem de belli bir yerden sonra hata verdiğinde bütün süre boşa gidiyordu. Bu nedenle her bir satırın tek tek taşınması ve iki farklı veri tabanındaki Schema’ların birbiri arasındaki uyumu görmek için SQL Management Studio içerisinde varsayılan olarak gelen Import Data seçeneğini tercih ettim. Bu aşamada Entity Framework’ün tarih tipindeki alanlar için .NET Framework’de datetime, .NET Core’da da datetime2 veri tipi farklılığı yarattığını gördüm.

Tekrar projeye dönüp Datetime alanlarının başına [Column(TypeName = “datetime”)]

Attribute’unu ekleyerek bu alanlarında Schema’da veri geçişi için bu şekilde kalmasını sağladım ve verileri başarılı bir şekilde kendi makinamda 15 dakikada taşıdım.

Production’da artık bir EF Core veri tabanı ayağa kaldırmak için Web Uygulaması açarak hem veri tabanını hem de uygulamayı Deploy ettim. Burada .NET Core kullandığım için Linux tipindeki Web Application ile ilerlemeye karar verdim ve sonrasında bazı problemler yaşadım. Bununla ilgili bir sonraki adımlarda bahsettim.

  • Cache Katmanında Kütüphane Değişikliğine Gidilmesi

Hem performans hem de API tasarımı daha iyi olmasının yanında kendisine özel geliştirilen JSON kütüphanesi ile daha performanslı bir önbellek çözümü sunan ServiceStack.Redis kütüphanesini kullanmaktaydık. Ancak hem bu geliştirmeyi yaptığımız Nuget kütüphanesinin uzun zamandır güncellenmediği için bu faydadan uzak kaldığımız hemde Connection Pooling ile ilgili performansını yeterince göremediğimiz için StackOverFlow tarafından geliştirilen StackExchange.Redis kütüphanesine geçiş yaptım.

  • Text. Json’daki Kritik Eksiklikler

Microsoft’un .NET Core içerisinde hem performans hem de JSON işlemleri için uzun zamandır saplantılı bir şekilde System.Text ve altındaki bütün kütüphanelerde geliştirme yaptığını söyleyebilirim. Benchmarking testleri yapıldığında System.Text Namespace’ini kullanan bir çok projede neredeyse her Framework versiyonunda büyük bir performans artışı görüldüğünü uzun zamandır takip ediyordum. Hem Newton.Json hemde ServiceStack.Redis’in JSON kütüphanesinden kurtulmak için API’dan dönen JSON’ları ve Cache’e veri okuma-yazma işlerinde Built’in gelen bir kütüphanenin daha iyi olacağını düşünerek tahmin ettim. Ancak sonrasındaki hayal kırıklığı çok büyük oldu! Zira Newton.Json’dan geçişle ilgili yayınlanan Microsoft dokümanında PreserveReferencesHandling, ReferenceLoopHandling gibi birçok özelliğin henüz geliştirilmediğini gördüm. Bu nedenle Built’in gelen bütün kodu geriye aldım ve Newton.Json ’la devam ettim.

  • Linux Web Uygulamasında Azure Tarafında Tamamlanmamış Özellikler

Uygulamayı öncelikle elle test edebileceğim ve sonrasında performans testleri yapabileceğim, herhangi bir Pipeline beklemeden, Staging sonradan devam etmek üzere standart bir şekilde ayağa kaldırdım. Publish ederek işlemi başlattım ve o gün Azure’da yaşanan bir saatlik bir kesinti ile şans eseri karşılaşıp uygulamada bir problem olduğunu düşündüm. İki saatimi kaybettikten sonra Microsoft tarafında bir Incident yaşandığını ve çalıştığımız Avrupa kıtasındaki bazı işlemlerde problem olabildiği bilgisini aldım. O sırada uygulamanın sonraki adımlarını incelemek üzere diğer çalışmalara başladım. Fark ettim ki kesintiyi iyi ki yaşamışım!

Döviz ve hava durumu ile ilgili çektiğimiz verilerin bazıları anlık akarken bazılarıysa saatlik gelmektedir. Bunları uygulama içerisinden çıkmadan, Azure Job olarak zaten daha öncesinde de ilerletiyorduk. Aynı şekilde kalmasına ve olacaklar ile ilgili problemleri gözlemek için Web Application içerisinde Web Job sekmesini aradığımda sekmeyi bulamadım! Önce uygulamanın Tier’ı ile alakalı olabileceğini düşündüğüm bu problem için uygulamayı bir üst Tier’a geçirdim ve Web Job tekrar gelmedi. Sonrasında araştırdığımda henüz Linux tipindeki Azure Web Application’larda birçok şeyin eksik olduğunu öğrendim. Kesintinin bitmesini beklemeden direkt uygulamayı sildim ve Windows tipinde yeni bir web uygulaması açarak devam ettim.

Bu aşamada bu kararı vermemin sebebi Load testlerde yakalanacak başarıya göre yapının tamamen Kubernetes ve Container üzerinden devam etmesiyle ilgili oldu.

  • Load Testlerin Yapılması

Herkesin Email Marketing şirketi olarak bildiği SendLoop’un mühendislik takımı tarafından geliştirilen hem ücretli hem de ücretsiz bir aracı bulunuyor. https://loader.io/ adresinden erişebileceğiniz bu Tool ile her zaman önce ilk testin buradan geçmesini bekler sonrasında da Apache’nin AB projesi ile yük testlerini gerçekleştiririm. 10,000 isteğe kadar çıkan bu ücretsiz Tool ile ilk test oldukça başarılıydı. Response Time’da ciddi düşüşler görülüyor ancak uygulama belli bir süre sonra yavaşlamaya başlıyordu.

Azure içerisinde Web Application’da Memory’de anlamsız bir şişme ve bir yerden sonra 1MB boyutunda bile yer kalmadığını fark ettim. İstekleri incelediğimde Redis Cache içerisinde kullandığım metodun verinin verilen Key üzerinde OverWrite yerine AddAndWrite senaryosu ile ilerlediğini fark ettim! Hemen bu problemi çözüp paketleri güncelledikten sonra testlere devam ettim.

SendGrid tarafında isteklerin başarılı bir şekilde geçtiğini gördükten sonra AB Tool’u ile testler yapmaya başladım. Bunun için internet bağlantısı çok iyi olarak bir sunucuyu kullandım. Artık her şey hazır ve DevOps’daki son adıma geçebilirdim.

  • DevOps Pipeline Kurulumundaki Yenilikler

Projeyi artık istek alır hale getirdikten sonra makalenin girişinde de bahsettiğim Production, canlı ortam ve son kod geliştirmesiyle birlikte çalışan Beta ve DEV olacak şekilde üç Stage’e ayırmaya başladım. Önce Master yani Production sonrasında da silsileyi takip edecek şekilde geçişleri tamamladım. Her bir Stage için ayrı veri tabanı açtım ve hepsini Master’dan taşımaya devam ettim.

Azure’un DevOps Pipeline’ında yaptığı bir arayüz değişikliği ile ilk defa karşılaştım. Artifact çıktısını Release adımına geçirirken burada bir Versionlama sistemiyle artık kütüphane alt yapısının yani ConnectionString, özel anahtarlar gibi ayarlar ile ilgili yapılan değişikliklerin de bir Step olarak eklendiğini öğrendim.

Learning C# in 15 Minutes

I’ve come across these types of content on the internet over the years and always wanted to make my own, so here it is; I’m here to teach you C# in 15 minutes. Of course, you have to have a history with any type of OOP language (Java, C++ etc.) in general to get all this and make connections with your existing know-how. The whole purpose is to give you a cheatsheet to look at on your journey. If you believe you can learn any programming language from scratch in 15 minutes then your best bet would be to teach yourself C++ in 21 days

Alright then, let’s begin…

https://gist.github.com/fatihdgn/39309f25003270db4dc836cfd719433d

Let’s end it there. Please comment if you want me to include something that I haven’t yet.
Hope you enjoyed this, see you next time.

 

Web Uygulamaları Geliştirebileceğiniz Diller ve Platformlar

Bu yazımızda sizlerle birlikte web uygulamaları geliştirebileceğiniz bir kaç dili, onların platformlarını ve bu platformlarda kullanabileceğiniz bir kaç örnek kütüphaneyi inceleyeceğiz.

1. .NET Dilleri (Visual Basic, C#, F#)

Visual Basic, Microsoft tarafından 1991 yılında duyurulan ve Basic dilini temel alarak geliştirilen, nesne yönelimli (OOP), olay odaklı (event-driven) bir dil.

C# ise yine Microsoft tarafından 2000 yıllarında duyurulan, çoklu yönelimli (multi-paradigm) bir programlama dilidir. Nesne yönelimli, fonksiyonel ve generic programlama yaklaşımlarına sahiptir.

F#, artık tahmin edebileceğiniz gibi Microsoft tarafından 2005 yılında 1.0 versiyonuna ulaşmış, çok yönelimli, özellikle fonksiyonel programlama yapabileceğiniz bir dil. Aynı zamanda Javascript ve GPU odaklı kod oluşturma gibi yetenekleri de var.

.NET dillerini kullanarak web uygulamaları geliştirebileceğiniz bir kaç platform mevcut. ASP.NET ailesinin yanı sıra, aynı zamanda Owin (Open Web Interface for .NET) ve Nancy gibi protokole daha yakın platformlar da bulunuyor.

1.1 ASP.NET Ailesi

Popüler olanları sayacak olursak Web Forms, MVC ve Web Api platformlarını sayabiliriz. Onun dışında yeni çıkan Web Pages ve Blazor isimli platformlar da mevcut fakat bunları başka yazılarda detaylı bir şekilde inceleyeceğiz.

1.1.1 ASP.NET Web Forms

ASP teknolojisinin .NET platformunda hayat bulduğu ilk hali diyebiliriz. ASP’de olduğu gibi <% ve %> tagleri kullanılarak sunucu taraflı kod yazabilirken, aynı zamanda .NET kütüphanesinin tamamına da erişim sağlayabiliyorsunuz.

1.1.2 ASP.NET MVC

ASP.NET platformu üzerine MVC metodolojisinin kurgulandığı bir platformdur. Aynı zamanda klasik ASP’den beri kullanılan <% ve %> tagleri yerine, kullanımı biraz daha kolay olan Razor yazım şekli ile birlikte gelmiştir.

1.1.3 ASP.NET Web Api

ASP.NET MVC platformu üzerinde yapılan bir kaç değişiklik ile birlikte, RESTful API’ler geliştirilebilen bir platformdur ve son yıllarda istemci taraflı web geliştirmenin de popülerliğinin artması ile birlikte en sık kullanılan yaklaşımdır.

1.2 Owin (Open Web Interface for .NET)

Sunucu ve uygulama arasındaki bağı kopartmaya çalışan Owin, geliştiricilerin daha çok uygulamanın kendisine odaklanmasını sağlamaya çalışmaktadır. Middleware yaklaşımını kullanır ve diğer .NET platformlarına nazaran daha esnek bir API sunar.

1.3 Nancy

Herhangi bir metodolojiyi benimsemeyen Nancy, direkt olarak browser tarafından istenen kaynağa karşılık gelecek şekilde bir yazım şekli sağlar. Böylece fazla kapsamlı olmayan ihtiyaçlara karşılık çok hafif bir platform alternatifi sunar.

 

2. PHP

1995 yılında Rasmus Lerdorf tarafından yaratılan PHP, sunucu taraflı kodlama sağlıyor. WordPress, Joomla! ve Drupal gibi sistemler bu dil kullanılarak geliştirilmiş ve çok yaygın bir kullanıma sahip. Sadece PHP dilinin kendisi kullanılarak da bir web uygulaması geliştirilebilse de farklı yaklaşımları barındıran bir çok platform ortaya çıkmış. İçlerinden Symfony, CodeIgniter, Laravel, CakePHP ve Phalcon platformlarını örnek olarak sayabiliriz.

2.1 Symfony

İçerisinde 50 adet bileşen bulunduran Symfony, bu bileşenler ile birlikte kod tekrarını azaltmayı ve genel ihtiyaçları karşılamayı amaçlıyor. Drupal, phpBB, yine aşağıda inceleyeceğimiz Laravel ve daha bir çok platform tarafından da kullanılmakta.

2.2 CodeIngiter

MVC metodolojisini benimseyen CodeIgniter, MVC’yi benimsemeseniz bile kullanabileceğiniz bir platform çünkü sizi MVC yazmaya zorlamıyor. Küçük ve performanslı web uygulamaları geliştirebilirsiniz. Artı olarak detaylı ve sade bir dökümantasyona da sahip.

2.3 Laravel

Web sanatçılarının PHP kütüphanesi mottosuyla kendini gösteriyor Laravel. İçerisinde Active Record desenini implemente eden Eloquent adında bir ORM’e ve Blade adında bir şablon motoruna sahip. Yaklaşım olarak MVC tercih edilmiş.

2.4 CakePHP

Dökümanın ilerleyen bölümlerinde inceleyeceğimiz Ruby on Rails’in konseptine uygun geliştirilen CakePHP, diğer bir çok platform gibi MVC yaklaşımını benimsiyor. Laravel’de de olduğu gibi içerisinde Active Record desenini implemente eden bir kütüphaneye sahip.

2.5 Phalcon

Büyük bir çoğunluğu C ile yazılan Phalcon, diğer platformlara göre daha performanslı ve daha az kaynak harcadığını savunuyor. Aynı şekilde C ile yazılan bir ORM’e ve MVC yaklaşımına sahip.

 

3. Python

‘Python Hakkında Ufak Bir Söyleşi’ adlı yazımda kendisine detaylı bir şekilde değindim. Okumak isterseniz buradan ulaşabilirsiniz.

Bir çok web platformu mevcut fakat bir kaç örnek olarak Django, Flask ve Pyramid’i sayabiliriz.

3.1 Django

İçerisinde varsayılan olarak şablon motoru, ORM ve kimlik doğrulama gibi özellikler ile geliyor ve Python üzerinde web programlama için kullanılan en popüler platformdur.

3.2 Flask

Aşağıda da inceleyeceğimiz ve bir Ruby platformu olan Sinatra’dan ilham alan Flask, alt tabanında Werkzeug WSGI Toolkit ve Jinja2 şablon motorunu kullanıyor. Çok hafif bir yapıya sahiptir.

3.3 Pyramid

Az uğraş gerektireceğini vaad eden Pyramid, en basitinden en kapsamlısına bütün projelerde kullanılabileceğini söylüyor. İçerisinde dosya bazlı şablon motoru, doğrulama sistemi ve test kütüphaneleri ile birlikte geliyor ve geniş konfigurasyon desteği sağlıyor.

 

4. Ruby

Yukihiro “Matz” Matsumoto tarafından Japonya’da, 1990’lı yılların ortalarında geliştirilmeye başlanmış. Çoklu yönelimli bir dil olan Ruby, nesne yönelimli ve fonksiyonel programlama yaklaşımlarına sahiptir.

Dökümanda önceden de bahsedilen, Ruby için önemli sayılabilecek iki adet platform bulunuyor ; Ruby on Rails ve Sinatra.

4.1 Ruby on Rails

Convention over Configuration yaklaşımını savunan Ruby on Rails, çok hızlı bir şekilde web üzerinde çalışabilen uygulamalar geliştirmenizi sağlıyor. Ruby üzerinde kullanılan açık ara en popüler platform.

4.2 Sinatra

Nancy ve Flask gibi, minimum efor ile web uygulaması yazmanızı sağlayan bir platform. Test kütüphaneleri ve topluluk tarafından geliştirilen eklentiler ile çok daha geniş çaplı uygulamalar da yazılabiliyor.

 

Bu yazıda, .NET dilleri, PHP, Python ve Ruby dilleri için kullanılabilecek platformları inceledik.

Bir sonraki yazıda görüşmek üzere.

.NET İçin Kuyruk Çözümleri : MSMQ

MSMQ Nedir?

MSMQ zaman bağımsız olarak birden fazla uygulama arasında offline veri alışverişini sağlayan Windows tabanlı kuyruk sistemidir. MSMQ ile birlikte uygulama veya ağ üzerinde bir sorun oluşsa dahi (çökme, hata fırlatma vb.) akış, gerçekleşen sorun giderildikten sonra veya çöken/çalışmayı durduran uygulama tekrar çalışmaya başladıktan sonra devam eder.

MSMQ ile iletilen mesajlar sistem üzerinde fiziksel bir alanda saklanmaktadır. Bu noktada yukarıda bahsetmiş olduğumuz senaryolar dahil, mesajları alması beklenen uygulama kapalı olsa dahi bu mesajlar saklanmaktadır.

Resim 1: Oluşturduğunuz Queue’ları Computer Management Ekranından Görmeniz Mümkün (compmgmt.msc)

Kuyruk Tipleri

MSMQ için iki adet kuyruk tipi mevcut;

Public Queues:

Bu tipte oluşturulmuş olan kuyruklara, yalnızca oluşturulduğu sunucu/bilgisayardaki uygulamalardan değil, aynı ağa bağlı tüm sunucu/bilgisayarlardan erişim sağlanabilmektedir. Bu sayede aynı ağda bulunan iki farklı sunucu ve bu sunucularda kurulu olan farklı uygulamalar arasında da MSMQ aracılığı ile mesaj iletimi sağlanabiliyor.

Private Queues:

Bu tipte oluşturulmuş olan kuyruklara ise yalnızca oluşturulduğu bilgisayar/uygulama üzerinden erişim sağlanabilir ve yalnızca aynı bilgisayar/sunucu üzerinde kurulu olan uygulamalar bu kuyruktan beslenebilir ve bu kuyruğu besleyebilir.

Programlanabilirlik

MSMQ alt yapısı C#, VB.NET ve .NET tabanlı diğer diller tarafından kullanılabilmektedir. System.Messaging namespace’i altından erişilebilir.

Kurulum

Eğer MSMQ sistemini bilgisayarınıza kurmak isterseniz, aşağıdaki adımları takip edebilirsiniz.

  1. Denetim Masası üzerinden “Programlar” seçimini yapın, ardından açılan ekranda “Programlar ve Özellikler” altında bulunan “Windows Özelliklerini Aç veya Kapat” seçimini yapın. Veya Windows + R tuş kombinasyonu ile “optionalfeatures” komutunu çalıştırabilirsiniz.
  2. Açılan pencerede “Microsoft Message Queue (MSMQ) Server” seçeneğini işaretleyin

Resim 2: “Windows Özelliklerini Aç veya Kapat” seçimi sonrası açılan pencereden “Microsof Message Queue (MSMQ) Server” özelliği işaretlenmeli.

Aynı kurulumu Windows Sunucu üzerinde yapmak için ise aşağıdaki adımları izlemelisiniz;

  1. Server Manager açıldıktan sonra Sağ üst tarafta bulunan Manage altından, “Add Roles and Features” seçilir.
  2. Açılan pencereden Features adımına gelindikten sonra listeden “Message Queuing” özelliği işaretlenir. Bu seçimin ardından “Install” butonu tıklanır ve özelliğin aktif edilme süreci bağlar. Bu işlemin ardından sunucunuzu yeniden başlatmanız gerekmez.

Resim 3: Features adımı altındaki listeden “Message Queuing” seçimi yapılır ve Install butonu tıklanarak kurulum süreci başlatılır.

C# Uygulamalarında MSMQ’yu Kullanmak

MSMQ’nun ne olduğundan ve nasıl kurulduğundan bahsettiğimize göre, örnek bir senaryo üzerinden bir C# uygulamasında MSMQ’nun sağladığı kuyruk alt yapısından nasıl faydalanabiliriz inceleyelim.

Senaryomuz; PeakUp’ta yeni işe başlayan personelin bilgisi sisteme girildiğinde, ilgili çalışana mail atmak olsun. Bu senaryoda ihtiyacımız olan iki uygulama var;

  1. Personel bilgilerinin girileceği uygulama
  2. Farklı uygulamalardan gelen mail gönderme taleplerini karşılayacak ve mailleri gönderecek uygulama.

İlk uygulamamızın ismi Peakup.Employee.Manager olsun. Projemizin yapısı aşağıdaki gibi;

PeakUp.Empoyee.Manager

  • Extensions
    • MessageQueueExtensions.cs (MessageQueue sınıfı için yazacağımız extension metotlar)
  • Models
    • EmployeeModel.cs (Personel sınıfı)
    • Mail.cs (Mail Sınıfı)
  • Program.cs

Önemli

MessageQueue sınıfını kullanabilmemiz için her iki projemize de System.Messaging referansını eklememiz gerekiyor.

Şimdi kodlara göz atalım:

Oluşturmak istediğimiz isimde bir Queue zaten varsa onu getirmek, yoksa tekrar oluşturmak gerekiyor. Bu işlemi daha hızlı bir şekilde gerçekleştirmek için bu Extension metodu kullanabilirsiniz.

https://gist.github.com/kivancbakdi/9ca90e66f422151ff1db65b7c13f146a

Employee ve Mail sınıflarımız;

https://gist.github.com/kivancbakdi/87f66c7e26a3e91fdea43d572d94dccd

https://gist.github.com/kivancbakdi/d20de4c25791aec483b2755987e08ac8

Yeni personel oluşturma ve bu personeli mail için kuyruğa atma işlemlerini yaptığımız program dosyamız;

https://gist.github.com/kivancbakdi/3c2af5f2b1f008c6e048474c0027f915

İkinci uygulamamızın ismi ise PeakUp.Email.Manager. Projemizin yapısı aşağıdaki gibi;

PeakUp.Email.Manager

  • Extensions
    • MessageQueueExtensions.cs (MessageQueue sınıfı için yazacağımız extension metotlar)
  • Models
    • Mail.cs (Mail Sınıfı)
  • Program.cs

Bu projemizin kodları da aşağıdaki gibi;

Oluşturmak istediğimiz isimde bir Queue zaten varsa getirmek, yoksa tekrar oluşturmamız gerekiyor. Bu işlemi daha hızlı bir şekilde gerçekleştirmek için bu Extension metodu kullanabilirsiniz.

https://gist.github.com/kivancbakdi/9ca90e66f422151ff1db65b7c13f146a

Mail sınıfımız;

https://gist.github.com/kivancbakdi/d20de4c25791aec483b2755987e08ac8

Mail kuyruğunu dinleyen ve mail sınıfını konsola yazdıran program dosyamız;

https://gist.github.com/kivancbakdi/e74526652da6f740544de516bdd1e51b

Bir C# projesinde MSMQ kullanan bu yazımızın sonuna gelmiş olduk. Bu konuyla ilgili daha fazla detaya ihtiyaç duyuyor veya örnekleri beraber incelemek istiyorsanız Live Coding Sessions‘larımızı takip etmeyi ihmal etmeyin!

Teşekkürler!