<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Mehmet Basrioglu on Medium]]></title>
        <description><![CDATA[Stories by Mehmet Basrioglu on Medium]]></description>
        <link>https://medium.com/@basrioglumehmet?source=rss-cb4f2f54355f------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*wRJNNJc4h849gMPBNuTWxQ.jpeg</url>
            <title>Stories by Mehmet Basrioglu on Medium</title>
            <link>https://medium.com/@basrioglumehmet?source=rss-cb4f2f54355f------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 17 May 2026 03:08:39 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@basrioglumehmet/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[IIS 7+ Web Server]]></title>
            <link>https://medium.com/@basrioglumehmet/iis-7-web-server-1ec7ab92cc30?source=rss-cb4f2f54355f------2</link>
            <guid isPermaLink="false">https://medium.com/p/1ec7ab92cc30</guid>
            <category><![CDATA[iis-server]]></category>
            <category><![CDATA[dotnet]]></category>
            <category><![CDATA[deployment]]></category>
            <dc:creator><![CDATA[Mehmet Basrioglu]]></dc:creator>
            <pubDate>Fri, 06 Feb 2026 16:15:01 GMT</pubDate>
            <atom:updated>2026-02-06T16:15:01.555Z</atom:updated>
            <content:encoded><![CDATA[<p>Merhaba; Bu makalemizde Microsoft’un geliştirmiş olduğu IIS (Internet Information Services) Web Server hakkında bilgi edineceğiz. Özellikle yazılım geliştiricilerin (developer’ların) geliştirmiş oldukları projeleri canlı ortama alırken ihtiyaç duydukları temel kavramlar, IIS’in çalışma prensibi ve sağladığı avantajlar beraberinde deploy işleminin basitçe nasıl yapıldığı ele alınacaktır.</p><h4>Kısaca IIS</h4><p>IIS, dış dünyayla sunucu arasında middleman görevi görmektedir. Gelen requestleri karşılar ve ilgili uygulamaya yönlendirmektedir. HTTP/HTTPS, FTP/FTPS ve SMTP gibi protokoller desteklenir. Ek olarak web.config dosyasında yer alan yapılandırmaları tanımlayabilir, application’ın çalışma davranışlarını belirleyebilirsiniz.</p><p><strong>Örneğin: </strong>iisnode, Node.js uygulamalarını IIS üzerinden çalıştırma imkânı sağlamaktadır.</p><p><strong>Mülakatlarda sorulması muhtemel bir bilgi olarak şunu söyleyebiliriz:</strong> IIS, yalnızca Windows tabanlı sunucular üzerinde çalışan bir web sunucusudur. IIS’ten önce Windows ortamında PWS (Personal Web Server) gibi sınırlı çözümler bulunuyordu; ancak IIS ile birlikte Windows tarafında gerçek anlamda enterprise seviyesinde bir web sunucusu ortaya çıkmıştır. Günümüzde IIS, bankacılık ve kamu altyapıları başta olmak üzere birçok alanda yaygın olarak kullanılmaktadır.</p><h4>Basit Şekilde IIS Nasıl Çalışır ?</h4><p>IIS(Internet Information Services), Application Pool ve Request Pipeline üzerinden anlatacak olursak, süreç aşağıdaki gibi işlenmektedir:</p><p>Tarayıcıyı bir ziyaretci, IIS ise güvenlik kapımız olarak varsayalım. Uygulamamızı da ziyaretcinin erişmek istediği iç kısım olarak belirleyelim.</p><ul><li><strong>Application Pool</strong>, uygulamanın çalıştığı ofis odası görevini görür. Farklı ofis odaları vardır.</li><li><strong>Worker Process</strong>: Ofis çalışanı gibidir, requestleri işler ve ilgili response’u ziyaretciye dönmektedir.</li></ul><h3>IIS Mimarisi</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*fnPbeD5wuAwbY_18PpE6Bw.png" /></figure><h4><strong>Kernel Mode</strong></h4><p><strong>Client:</strong> Sunucu istemcisidir, HTTP.sys driver ile iletişime geçmektedir.</p><p><strong>HTTP.sys:</strong> HTTP isteklerinin işlenmesinden sorumludur. Ayrıca caching mekanizması bulunur; requestler worker process tarafından işlenene kadar queue’ya alabilir. Kernel mode olarak çalışmaktadır, ilgili hardware ve sistem verilerine tam yetkili bir şekilde erişimi vardır.</p><h4>User Mode</h4><p><strong>Windows Process Activation Service (WAS):</strong> İlgili Application Pool için çalışan bir worker process sürecini başlatır, applicationHost.config’den yapılandırma bilgilerini ister. User mode’da çalışır; hardware ve referans bellek erişimi yoktur.</p><p><strong>World Wide Web Publishing Service(WWW):</strong> Windows Server işletim sisteminin bir parçasıdır. User’lar için içeriklere erişim izni verir. Windows Process Activation Service üzerinden Application Pool ve Site yapılandırma bilgilerini alarak HTTP.sys’i yapılandırmak için kullanmaktadır.</p><p><strong>Application Pool: </strong>IIS’te uygulamaların çalıştığı, içinde bir veya daha fazla worker process barındırabilen uygulama havuzudur. Her bir uygulama yani worker process’ın kendine ait sınırları vardır. IIS 6&#39;da Worker Process Isolation Mode vardı, IIS 7+ ile Integrated geldi.</p><blockquote>“IIS 6.0&#39;da, worker process isolation mode ve IIS 5.0 izolasyon mode sunucu düzeyinde ayarlanır. Bu durum, aynı sunucuda her iki izolasyon mode’nun da çalıştırılmasını imkansız hale getirir.”</blockquote><p>Ancak IIS 7 ve üzeri sürümlerde, isteklerin (request) nasıl işleneceğini belirleyen iki farklı mode bulunmaktadır:</p><ol><li><strong>Integrated Mode:</strong> IIS ve ASP.NET, Request Pipeline üzerinden birlikte çalışır. IIS 7 ile birlikte ASP.NET, IIS’e tamamen entegre edilmiştir. Bu mode’da ASP.NET HttpModule’leri, ISAPI filter’ların sahip olduğu yeteneklere; ASP.NET HttpHandler’ları ise ISAPI extension’ların sahip olduğu yeteneklere eşdeğer bir güce sahiptir.</li><li><strong>Classic Mode: </strong>Integrated Mode’un çalışmadığı veya uyumluluk gerektiren durumlarda kullanılmalıdır. Bu mode, klasik ISAPI (aspnet_isapi.dll) mimarisini kullanmaktadır.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*-kDVYqxK25hSv-Tg.png" /></figure><p><strong>Worker Process(w3wp.exe):</strong> Worker Process, IIS’in kalbi olarak düşünülebilir ve .NET uygulamaları burada çalıştırılır. Client tarafından gönderilen isteklerin (request) işlenmesi ve karşılık olarak üretilen yanıtların (response) oluşturulmasından sorumludur. Tüm ASP.NET uygulamaları, ilgili Application Pool altında çalışan Worker Process tarafından yönetilir ve çalıştırılır.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/0*DX9nSNKR8ev4eYFA.png" /></figure><blockquote>En iyi pratik olarak her site/uygulama için ayrı Application Pool önerilir. Bir pool içinde birden fazla worker process (Web Garden) tanımlanabilir, ancak çoğu senaryoda tek process yeterlidir ve multiple process’ler state yönetimi sorunları yaratabilir.</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/0*jkaKlEFIUWoPlmnm.png" /></figure><h4>Türkiyede IIS Kimler Kullanıyor</h4><ul><li>Cumhurbaşkanlığı</li><li>Turkcell</li><li>Migros</li><li>Garanti Bankası</li><li>Sabancı Üniversitesi</li><li>Orta Doğu Teknik Üniversitesi</li><li>Anadolu Ajansı</li><li>Fabrikalar</li></ul><h3>Diğer Bilinmesi Gerekenler</h3><h4>Web Farm</h4><p>Web Farm, birden fazla server üzerinde birden fazla uygulamanın<br>çalıştırılması ve çok sayıda gelen isteklerin(request) bu sunucular arasında dağıtım prensibiyle çalışır.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/611/0*8AmzyuFqA72TGKqT.png" /></figure><h4>Web Garden</h4><p>Tek bir Application Pool altında birden fazla worker process (w3wp.exe) tanımlanmasıdır. Bu, tek sunucuda işlem yükünü dağıtmak için kullanılır.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/611/0*iojl9vhD8cC2BUG4.png" /></figure><h4>Kestrel ve IIS Reverse Proxy</h4><p>.NET Core için Kestrel sunucusu ve IIS ile reverse proxy olarak kullanılması önerilmiştir.</p><p><strong>Peki neden Kestrel ve IIS Reverse Proxy Önerildi?</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/783/0*dPKMQHX2NMxFEU02" /></figure><p>Bu soruya verilecek cevap şudur: Microsoft’un resmi dokümanlarında da belirtildiği üzere, Kestrel internet-facing senaryolarda bazı güvenlik, stabilite ve yönetim özellikleri açısından tek başına yeterli değildir. Bu eksiklikleri tamamlamak amacıyla Kestrel’in, IIS Reverse Proxy ile birlikte kullanılması önerilmektedir.</p><h4>IIS Kurulumu</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/751/1*RKTHX0a5inJWMTUDSfQmnw.png" /></figure><ol><li>Server Manager açınız ardından Add roles and features tıklayınız.</li><li>Server roles’a kadar next diyiniz.</li><li>Roles listesinden Web Server(IIS)’i işaretleyiniz ve next buttonuna basınız.</li><li>İlgili .net feature sürümlerini seçiniz.</li><li>IIS ile ilgili servisleri seçiniz.</li><li>Next buttonuna tekrar tıklayınız ve son olarak install basınız ardından kurulumun tamamlanmasını bekleyiniz.</li><li>Kurulumun başarılı şekilde kurulduğunu anlamanız için Server Manager &gt; Dashboard tıklarsanız, IIS ile ilgili köşeyi görebilirsiniz.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1010/1*Yi-ghw-0uTuP1OR7z6dI9w.png" /></figure><h4>Visual Studio ile Deployment ve IIS için Web Deploy Paketi</h4><p>Web Deploy (msdeploy), IIS üzerinde çalışan bir web uygulamasını kaynak sunucudan hedef sunucuya teknik olarak kopyalayan ve senkronize eden bir dağıtım aracıdır. Sadece dosyaları değil; IIS site ayarlarını, application pool yapılandırmalarını ve gerekli bağımlılıkları da birlikte taşımaktadır.</p><p>ASP.NET / ASP.NET Core projelerinde <strong>Visual Studio’nun Publish özelliği arka planda Web Deploy’u kullanır.</strong> IIS Reverse Proxy kullanılan senaryolarda ise Web Deploy, IIS üzerindeki site ve binding ayarlarının doğru şekilde oluşturulmasını sağlar ve Kestrel’in arkasında çalışan uygulamanın sorunsuz yayınlanmasına yardımcı olmaktadır.</p><p><strong>Not:</strong> Firewall Inbound yapılandırılması şarttır.</p><h4><strong>IIS URL Rewrite Module</strong></h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*hnX6O1cPC3HQ_spviQ8E_Q.png" /></figure><p>IIS URL Rewrite, Microsoft IIS için geliştirilmiştir. Gelen HTTP isteklerinin URL’lerini belirlenen kurallara göre yeniden yazmanıza veya yönlendirmenize olanak tanımaktadır. Ancak önemli bir nokta vardır: Bu işlemler IIS request pipeline’ın başında (PreBeginRequest veya BeginRequest aşamasında) gerçekleşir; yani web uygulaması (handler) devreye girmeden önce URL yeniden yazılır veya yönlendirme yapılır. Bu sayede erken müdahale (HTTPS zorunluluğu, canonical URL vb.) sağlanır.</p><p><strong>URL Rewriter Nasıl Çalışmaktadır?</strong></p><p>IIS URL Rewrite’ın çalışma mantığı oldukça nettir: Her şey kurallar üzerinden ilerler. Sunucuya gelen her HTTP isteği, önceden tanımlanmış bu kurallar doğrultusunda değerlendirilir ve istenen davranış buna göre uygulanır.</p><p>İlk aşamada <strong>Regular Expression (RegExp)</strong> ile pattern matching yapılır. Yani gelen isteğin URL yapısı, belirlenen desenle karşılaştırılır. Bu desenle eşleşme sağlanmadığı sürece kural devreye girmez. Eşleşme başarılıysa süreç bir sonraki adıma taşınır.</p><p>Ardından <strong>Conditions</strong> devreye girer. Conditions, kuralın çalışmasını daha kontrollü hâle getiren ek şartlardır. İsteğin HTTPS üzerinden gelmesi, belirli bir domain’e ait olması, query string içermesi ya da belirli bir HTTP metodu kullanılması gibi kontroller bu aşamada yapılır. Böylece tek bir URL için bile farklı senaryolar üretmek mümkün olur.</p><p>Son adım ise <strong>Action</strong> kısmıdır. Tüm koşullar sağlandığında URL Rewrite’ın ne yapacağı burada tanımlanır. Gelen isteğin arka planda farklı bir URL’ye yönlendirilmesi (rewrite), kullanıcıya başka bir adrese yönlendirme yapılması (redirect) ya da isteğin tamamen engellenmesi bu aşamada gerçekleşir.</p><h4>Visual Studio ile Build Almak</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*KCMGo86QT2B5oJHaegL-5A.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/925/1*A1HcRmiCdjgRkBpk1pVkuQ.png" /></figure><h4>IIS ile Canlıya Alım</h4><p>1. Build aldığınız publish klasörünü kopyalayın ve ilgili VDS (Windows Server) sunucunuzda bulunan bir klasöre yapıştırın. Bu klasör, sizin belirlediğiniz özel bir dizin olabileceği gibi, varsayılan olarak inetpub altında da yer alabilir.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BN9V-Lm4gFZlNqXluyQiKg.png" /></figure><p>2. IIS Web sitesini oluşturunuz.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/581/1*JJ6-8sleeNKIc63oG2ifWg.png" /></figure><ul><li><strong>Sitename: </strong>IIS’te siteye verilen isimdir.</li><li><strong>Application Pool:</strong> Sitenin hangi Application Pool üzerinde çalışacağını belirttiğimiz alandır.</li><li><strong>Physical path:</strong> Uygulamanın build/publish dosyalarının bulunduğu klasör dizinidir.</li><li><strong>Binding/Type:</strong> Kullanılacak HTTP / HTTPS protokolünün belirlendiği alandır.</li><li><strong>IP Address:</strong> Siteye dışarıdan erişimin sağlanacağı veya belirli bir IP üzerinden erişimin tanımlandığı alandır.</li><li><strong>Port:</strong> Sitenin çalışacağı port numarasını ifade eder.</li><li><strong>Host name:</strong> Sitenin hangi host adı (domain) ile yayınlanacağını belirlediğimiz alandır.</li><li><strong>Start Website immediately:</strong> Siteyi hemen başlatır ve sürekli çalışır durumda olmasını ifade eder.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*FPflJ7hHmu10xffT_ZG4ng.png" /></figure><p>3. Tarayıcı üzerinden ilgili web sitesine erişiniz.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/534/1*0gokClR_5MIytIIlW519jQ.png" /></figure><p>4. Erişim hatası ile karşılaşılacaktır. Bu hatayı gidermek için ilgili dizin üzerinde IIS kullanıcısına yetki verilmesi gerekmektedir.</p><p><strong>IIS User erişimi nasıl verilir?</strong><br>Klasör özellikleri açılır, Security (Güvenlik) sekmesine girilir ve IIS_IUSRS grubu eklenerek gerekli izinler (genellikle Read / Write veya Modify) tanımlanır.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*V7NN9UpQQ1AZaX0qI13-gA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/365/1*NVNwC2VMav6QLhKx7dtz5w.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*v_ZexiG9tAZPxL28S-FOaQ.png" /></figure><p>5. Manage Website menüsünden ilgili web sitesini yeniden başlattıktan sonra site canlıya alınacaktır.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/272/1*LZoS_-5MSyEwu6lNfgoWcg.png" /></figure><h3>Son Söz</h3><p>Sevgili dostlar, Bu yazıda IIS 7+’ın temel yapısını; mimarisiyle birlikte Application Pool, Worker Process işleyişini ve canlıya alım adımlarını en sade hâliyle ele aldık. Kestrel + reverse proxy kullanımının neden önerildiği, URL Rewrite’ın neden erken devreye girdiği gibi pratik ama kritik detaylara da değindik. IIS, bugün bankalardan kamu kurumlarına kadar pek çok yerde aktif olarak kullanılmakta ve doğru yapılandırıldığında oldukça sağlam bir çözüm sunmaktadır.</p><p>Umarım faydalı olmuştur. Bir sonraki yazıda görüşmek üzere, herkese iyi çalışmalar 🙂</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1ec7ab92cc30" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ASP.NET Page Lifecycle]]></title>
            <link>https://medium.com/@basrioglumehmet/asp-net-page-lifecycle-cafe508cd28a?source=rss-cb4f2f54355f------2</link>
            <guid isPermaLink="false">https://medium.com/p/cafe508cd28a</guid>
            <category><![CDATA[aspnet]]></category>
            <category><![CDATA[aspnetcore]]></category>
            <dc:creator><![CDATA[Mehmet Basrioglu]]></dc:creator>
            <pubDate>Thu, 29 Jan 2026 02:38:44 GMT</pubDate>
            <atom:updated>2026-01-29T02:38:44.588Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/688/0*Go1gdb2p64jtQ2GJ.png" /></figure><p>Merhaba; Bu makalede ASP.NET Page Lifecycle ele alacağız. Web uygulamalarında sayfanın oluşturulmasından tarayıcıya gönderilmesine kadar geçen süreci detaylı bir şekilde yönetmektedir. Döngü, geliştiricilere sayfa ve kontrol seviyesinde olayları yakalama, veri işleme, dinamik içerik oluşturma ve kaynakları doğru şekilde yönetme imkânı sağlamaktadır. Her bir aşama, sayfanın ve kontrollerin belirli durumlarda hangi işlemleri gerçekleştireceğini belirler ve doğru zamanda müdahale edebilme olanağı sunar gelgelelim sevgili dostlar sırasıyla anlatacak olursak:</p><ol><li><strong>PreInit</strong></li></ol><ul><li>Sayfa <strong>başlatma (start) durumunu</strong> tamamladıktan sonra ve <strong>initialization (başlatma) durumuna</strong> geçmeden önce tetiklenir.</li><li><strong>IsPostBack</strong> özelliği belirlenir.</li><li>Dinamik kontroller oluşturulabilir.</li><li>Profil değerleri okunabilir veya ayarlanabilir.</li></ul><p><strong>2. Init</strong></p><ul><li>Kontroller başlatıldığında devreye girer.</li><li>Kontrol veya sayfa özelliklerini okumak veya ayarlamak için kullanılır.</li><li>Kontrolün Init olayı, sayfanın Init olayından <strong>önce</strong> gerçekleşir.</li></ul><p><strong>3. InitComplete</strong></p><ul><li>Tüm başlatma işlemleri tamamlandığında tetiklenir.</li><li><strong>ViewState</strong> henüz yüklenmemiştir; ViewState üzerinde değişiklik yapmak için kullanılabilir.</li><li>Tüm başlatma işlemlerinin tamamlanmasını gerektiren işlemler burada yapılabilir.</li></ul><p><strong>4. PreLoad</strong></p><ul><li>Sayfa, <strong>ViewState’i yüklediğinde</strong> tetiklenir.</li><li>Postback verileri yüklenir.</li></ul><p><strong>5. Load</strong></p><ul><li>Sayfa nesnesi <strong>OnLoad</strong> metodunu çağırır.</li><li>Daha sonra her kontrol için <strong>OnLoad</strong> metodu <strong>rekürsif olarak</strong> çağrılır.</li></ul><p><strong>6. ControlEvents</strong></p><ul><li>Belirli kontrollerin olaylarını yönetmek için kullanılır.<br> Örneğin, bir <strong>Button</strong> kontrolünün Click olayı veya bir <strong>TextBox</strong> kontrolünün TextChanged olayı.</li></ul><p><strong>7. LoadComplete</strong></p><ul><li>Olay işleme aşamasının sonunda tetiklenir.</li><li>Sayfadaki tüm kontrollerin yüklenmiş olmasını gerektiren işlemler için uygundur.</li></ul><p><strong>8. PreRender</strong></p><ul><li>Sayfa nesnesi <strong>PreRender</strong> olayını tetikler, ardından her çocuk kontrol için aynı işlem rekürsif olarak yapılır.</li><li>Render aşamasına geçmeden önce sayfa veya kontroller üzerinde son değişiklikler yapmak için kullanılabilir.</li></ul><p><strong>9. PreRenderComplete</strong></p><ul><li>Her veri bağlı kontrolün (<strong>DataBound Control</strong>) DataSourceID özelliği ayarlandığında ve <strong>DataBind</strong> metodu çağrıldığında tetiklenir.</li></ul><p><strong>10. SaveStateComplete</strong></p><ul><li>Sayfa ve tüm kontroller için <strong>ViewState</strong> ve <strong>ControlState</strong> kaydedildikten sonra tetiklenir.</li></ul><p><strong>11. Render</strong></p><ul><li>Render bir olay değildir, bir süreçtir.</li><li>Sayfa nesnesi, her kontrol için <strong>Render</strong> metodunu çağırır ve HTML çıktısı oluşturulur.</li></ul><p><strong>12. Unload</strong></p><ul><li>İlk olarak her kontrol için, ardından sayfa için tetiklenir.</li><li>Tüm kaynaklar ve referanslar (ör. veritabanı bağlantıları) serbest bırakılır ve final temizliği yapılır.</li></ul><h3>Son Söz</h3><p>Dostlar, bu yazıda ASP.NET sayfa yaşam döngüsünü adım adım inceledik. Her aşamanın sayfa ve kontroller üzerindeki etkilerini ve veri ile olay işleme süreçlerini ele aldık. Amaç, yalnızca belirli bir teknoloji tanıtmak değil, geliştiricilerin doğru ve sürdürülebilir çözümler üretebilmesi için yaşam döngüsünü anlamasını sağlamaktı. Umarım faydalı olmuştur; bir sonraki yazıda görüşmek üzere, iyi çalışmalar 🙂</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=cafe508cd28a" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Outbox Pattern ve Dağıtık Sistemlerde İlişkili Yaklaşımlar]]></title>
            <link>https://medium.com/@basrioglumehmet/outbox-pattern-ve-da%C4%9F%C4%B1t%C4%B1k-sistemlerde-i%CC%87li%C5%9Fkili-yakla%C5%9F%C4%B1mlar-3deead79dee2?source=rss-cb4f2f54355f------2</link>
            <guid isPermaLink="false">https://medium.com/p/3deead79dee2</guid>
            <category><![CDATA[distributed-systems]]></category>
            <category><![CDATA[rabbitmq]]></category>
            <category><![CDATA[outbox-pattern]]></category>
            <category><![CDATA[debezium]]></category>
            <category><![CDATA[kafka]]></category>
            <dc:creator><![CDATA[Mehmet Basrioglu]]></dc:creator>
            <pubDate>Wed, 28 Jan 2026 03:37:52 GMT</pubDate>
            <atom:updated>2026-01-28T03:37:52.146Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*F6WZjmzjECGwUtNs.png" /></figure><p>Merhaba; asenkron iletişime dayalı dağıtık sistemlerde, servisler arası veya servis ile mesajlaşma aracısı (message broker) arasındaki etkileşimlerde iletişim hataları kaçınılmazdır. Mesajların hedef sisteme ulaşamadan bağlantının kopması, çalışma zamanı hataları ya da beklenmeyen donanımsal ve yazılımsal kesintiler, servisler arasında veri kaybına ve tutarsızlıklara yol açabilmektedir. Bu bağlamda Outbox Pattern, mesaj iletim sürecini daha güvenilir hâle getirerek bu tür tutarsızlık risklerini azaltmayı amaçlayan temel tasarım desenlerinden biridir.</p><p>Outbox Pattern’ın arkasındaki temel motivasyon, bir servisin kendi iş mantığını başarıyla tamamlamasına rağmen ürettiği mesajı başka bir servise veya message broker’a anında iletememesi durumunda ortaya çıkan tutarlılık problemidir. Dağıtık mimarilerde hedef servislerin geçici sürelerle erişilemez olması olağan kabul edildiğinden, her başarısız iletişim denemesinde işlemlerin geri alınması (ör. compensable transaction) her zaman uygulanabilir veya tercih edilen bir çözüm değildir.</p><p>Bu yaklaşım yerine Outbox Pattern, iletilmesi gereken message/event’lerin servis içerisindeki işlemlerle aynı transaction kapsamında kalıcı bir outbox yapısına kaydedilmesini önerir. Ardından, bu kayıtları periyodik olarak kontrol eden bağımsız bir yayınlayıcı bileşen (Outbox Publisher), ilgili mesajları hedef servise ya da message broker’a göndermeye çalışır. Böylece alıcı taraf geçici olarak erişilemez olsa dahi mesajlar kaybolmaz ve bağlantı yeniden sağlandığında iletim süreci devam eder.</p><p>Sonuç olarak Outbox Pattern, mesajların en az bir kez hedefe ulaşmasını garanti altına alarak veri kaybı riskini azaltır ve servisler arası iletişimi alıcı bileşenin anlık durumundan bağımsız hâle getirir. Bu sayede sistem, hem daha dayanıklı bir yapıya kavuşur hem de gevşek bağlı (loosely coupled) bir mimari tasarımın gerekliliklerini daha etkin biçimde karşılar.</p><blockquote>Mikroservis mimarilerinde, kritik mesajlar üreten her bir servis kendisine ait bir Outbox tablosuna sahip olmalı; iletilmesi gereken mesajları öncelikle bu tabloya kaydettikten sonra bir yayınlayıcı (publisher) bileşen aracılığıyla hedef servise ya da mesajlaşma aracısına (message broker) iletmelidir.</blockquote><h4>Outbox Pattern Ne Zaman Kullanılır?</h4><p>Outbox Pattern, özellikle e-ticaret gibi mikroservis tabanlı sistemlerde, bir servisin kendi veritabanına (örneğin Order tablosuna) veri yazdığı ve aynı işlem kapsamında OrderCreated gibi olayların yayınlanmasının gerektiği senaryolarda tercih edilmektedir. Bu tür durumlarda ortaya çıkan temel problem, aynı anda hem veritabanına hem de mesajlaşma sistemine veri yazılmasını gerektiren Dual Write yaklaşımıdır. Dual Write kaynaklı tutarsızlıklar kısa vadede fark edilmese de, sistem büyüdükçe ve yük arttıkça kendisini daha belirgin şekilde göstermektedir. Bu nedenle Outbox Pattern, özellikle Dual Write gereksiniminin bulunduğu senaryolarda değerlendirilmesi gereken kritik bir yaklaşımdır.</p><h4>Outbox Pattern ve Event Sourcing Arasındaki Kavramsal Ayrım</h4><p>Outbox Pattern ile Event Sourcing sıklıkla karıştırılsa da, bu iki yaklaşım aynı değildir. Event Sourcing’de bir veriye ait tüm olaylar kalıcı olarak saklanırken, Outbox Pattern’da mesajlar yalnızca güvenli iletim sağlanana kadar tutulur ve işlem tamamlandıktan sonra silinir veya güncellenir. Dolayısıyla Event Sourcing sistemin geçmişini modellemeyi amaçlarken, Outbox Pattern mesajlaşma sürecinin güvenilirliğine odaklanır.</p><h4>Outbox Pattern için Publish Yöntemleri</h4><p>Outbox Pattern’da mesajların yayınlanması için temel olarak iki farklı yöntem bulunmaktadır. Bu yöntemlerden ilki Pulling (Polling) yöntemidir.</p><p>Pulling yöntemi, Outbox tablosunda yer alan kayıtların belirli aralıklarla okunarak hedef servise ya da message broker’a publish edilmesi esasına dayanır. Okuma periyodunun sıklaştırılması, mesajların daha hızlı iletilmesini sağlasa da, veritabanı üzerindeki yükü artırarak ek maliyetlere yol açabilir. Bu durum, Pulling yönteminin temel dezavantajı olarak değerlendirilmektedir.</p><p>Özellikle sistemin ölçeklendiği senaryolarda, birden fazla publisher bileşenin aynı kayıtları eş zamanlı olarak okuması (multiple read) riski ortaya çıkabilir. Bu tür tutarsızlıkların önüne geçebilmek için veritabanı seviyesinde çeşitli senkronizasyon ve kontrol mekanizmalarının uygulanması gerekmektedir. Örneğin, MSSQL ortamlarında UPDLOCK, ROWLOCK veya READPAST gibi kilitleme yaklaşımları kullanılarak eş zamanlı okuma işlemleri sınırlandırılabilirken, PostgreSQL tarafında SELECT … FOR UPDATE SKIP LOCKED yapısı tercih edilebilir. MongoDB tarafında ise findAndModify operasyonu ile atomik okuma ve güncelleme işlemleri gerçekleştirilebilir. Buna ek olarak, durum bazlı işaretleme, lease/timeout mekanizmaları ve idempotent consumer tasarımı, Pulling yönteminde sıklıkla başvurulan tamamlayıcı önlemler arasında yer almaktadır.</p><p>İkinci yöntem ise Transaction Log Tailing (CDC — Change Data Capture) yaklaşımıdır. Bu yöntemde, Outbox tablosunun bulunduğu veritabanına ait transaction logları takip edilerek gerçekleşen veri değişiklikleri yakalanır ve ilgili message/event’ler hedef servise ya da message broker’a publish edilir. Bu yaklaşımda uygulama seviyesinde aktif bir polling mekanizmasına ihtiyaç duyulmaz; değişiklikler veritabanı logları üzerinden asenkron olarak izlenir.</p><p>Transaction Log Tailing yaklaşımına örnek olarak Debezium ve Eventuate Tram gibi araçlar gösterilebilir. Bu yöntem, veritabanı üzerindeki okuma yükünü azaltması ve daha düşük gecikme süreleri sunması nedeniyle yüksek hacimli sistemlerde sıklıkla tercih edilmektedir.</p><h4>Outbox Pattern Gerektiren Örnek Senaryolar</h4><p>Outbox Pattern, bir işlemin başarıyla tamamlanmasının ardından birden fazla dış sistemle asenkron iletişim kurulmasının gerektiği senaryolarda etkin biçimde kullanılmaktadır. Aşağıda, bu duruma örnek teşkil eden bazı senaryolar yer almaktadır:</p><ul><li><strong>Uçak bileti satın alma işlemi sonrasında</strong>, kullanıcıya bilgilendirme amaçlı e-posta gönderilmesi</li><li><strong>Uçak bileti kaydının oluşturulmasının ardından</strong>, ilgili olayın mesajlaşma aracısı (broker) üzerinden diğer servislerle paylaşılması</li><li><strong>Bilet satın alma işlemi tamamlandıktan sonra</strong>, uçuşa ait kabin bilgilerinin başka bir servis aracılığıyla güncellenmesi</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1021/1*k8_rpj4MDE4pYwUo44SZQQ.png" /></figure><h3>Idempotent Sorunu</h3><p>Outbox Pattern’da, mesaj başarıyla publish edildikten sonra ilgili kaydın Outbox tablosunda işaretlenmesi veya silinmesi aşamasında oluşabilecek olası bir veritabanı hatası, aynı mesajın yeniden publish edilmesine yol açabilir. Bu durumun sistem genelinde tutarsızlığa sebep olmaması için, mesajları tüketen consumer bileşenlerin idempotent olarak tasarlanması kritik öneme sahiptir. Bu bağlamda Inbox Pattern, tekrar eden mesajların güvenli şekilde işlenmesini sağlayarak idempotency probleminin çözümünde Outbox Pattern ile tamamlayıcı (akraba) bir yaklaşım olarak değerlendirilmektedir.</p><h3>Inbox Pattern</h3><p>Inbox Pattern, dağıtık sistemlerde mesajların en az bir kez (at-least-once) iletilmesi durumunda ortaya çıkabilecek tekrar işleme (duplicate processing) problemini önlemek amacıyla kullanılan bir tasarım desenidir. Bu yaklaşımda, message broker’dan alınan her mesaj, işlenmeden önce alıcı servisin kendi veritabanındaki Inbox tablosuna kalıcı olarak kaydedilir.</p><p>Mesaj işleme süreci, Inbox kaydı ile aynı transaction kapsamında gerçekleştirilir. İlgili mesaj daha önce Inbox tablosuna eklenmişse, mesaj tekrar işlenmez ve bu sayede idempotent bir tüketim modeli sağlanmış olur. Servis çökmesi, yeniden deneme (retry) veya ağ kesintileri gibi durumlarda mesajın tekrar iletilmesi söz konusu olsa dahi, sistem bütünsel tutarlılığını korur.</p><p>Inbox Pattern, Outbox Pattern ile birlikte kullanıldığında; mesajların güvenilir şekilde üretilmesini (reliable send) ve güvenilir şekilde tüketilmesini (reliable receive) sağlayarak, dağıtık sistemlerde pratikte en yaygın tercih edilen teslimat modeli olan at-least-once + idempotency yaklaşımını mümkün kılar.</p><p>Bununla birlikte, iletilen mesajların boyutunun zamanla artması performans ve ağ maliyetleri açısından bir risk oluşturabilir. Bu tür senaryolarda Claim Check Pattern, büyük veri payload’larının mesajdan ayrıştırılarak yalnızca bir referans bilgisinin iletilmesini sağlayarak Inbox ve Outbox desenleriyle birlikte etkin biçimde kullanılabilir.</p><h3>Claim Check Pattern</h3><p>Mesaj boyutunun büyük olduğu durumlarda entegre edilebilir. Bu pattern, büyük boyutlu event payload’larının message broker’lar üzerinden taşınması yerine, ilgili payload verisinin external bir storage üzerinde saklanmasını ve buna referans eden bir token veya key’in (claim-check) oluşturulmasını önermektedir.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*SHgqbM3jlwou5OmK.png" /></figure><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FX7ZXi5-upe8%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DX7ZXi5-upe8&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FX7ZXi5-upe8%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/6d6a020d3f64dcc23bbb76819d3f4e4b/href">https://medium.com/media/6d6a020d3f64dcc23bbb76819d3f4e4b/href</a></iframe><p>Yüzeysel olarak ilişkili yaklaşımlara değindiğimize göre, Outbox Pattern’in uygulanması sırasında dikkat edilmesi gereken bazı pratik noktaları ele almakta fayda vardır. Bu noktalar, desenin gereksiz karmaşıklıklardan arındırılarak sürdürülebilir ve etkin biçimde uygulanmasını amaçlayan temel tüyolar niteliğindedir.</p><h3>Outbox Pattern için Temel Tüyolar</h3><h4>Keep It Simple</h4><p>Outbox Pattern’in temel sorumluluğu mesajları saklamak ve iletmektir. Outbox Publisher bileşeninin iş akışı yönetimi, state machine veya ek iş mantıklarıyla zenginleştirilmesi; zamanla hata üretmeye ve operasyonel karmaşıklığa neden olabilir. Basit bir veri modeli ve sade bir publish süreci, desenin sürdürülebilirliğini artırır.</p><h4>Veritabanı Kilitlenmelerine Dikkat</h4><p>Sistemi ölçeklerken birden fazla publisher örneğinin aynı Outbox tablosunu eş zamanlı okuması, veritabanı üzerinde ciddi kilitlenmelere ve performans düşüşlerine yol açabilir. Her API pod’una bir publisher bağlamak yerine, kontrollü ve sınırlı sayıda worker ile ilerlemek çoğu senaryoda daha sağlıklı sonuç verebilir.</p><h4>Veritabanı Bir Queue Gibi Kullanılmamalıdır</h4><p>Outbox tablosu, kalıcı bir kuyruk (queue) değildir; yalnızca kısa süreli bir buffer görevi görmelidir. Mesajlar mümkün olan <strong>en kısa sürede asıl mesajlaşma altyapısına (Kafka, RabbitMQ vb.) aktarılmalı ve yüksek hacimli trafik bu sistemler tarafından karşılanmalıdır. </strong>Aksi takdirde, veritabanı ölçeklenebilirlik açısından darboğaz hâline gelebilir.</p><h4>Outbox Tablosunun Bakımı</h4><p>Outbox tablosundaki eski kayıtların tek tek DELETE işlemleriyle temizlenmesi, yüksek kilitlenme maliyetlerine ve transaction log şişmesine neden olabilir. Bunun yerine batch silme, zaman bazlı partitioning veya partition truncate/drop yaklaşımları tercih edilmelidir. Bu yöntemler, hem bakım süreçlerini hızlandırır hem de veritabanı performansını korumaya katkıda bulunur.</p><h4>Monitoring</h4><p>Publish gecikmeleri gibi hususlar için Monitoring mutlaka yapılmalıdır ve hata durumları kontrol edilmelidir.</p><h4>Anti Pattern</h4><p>Retry ve işleme sorumlulukları alıcı servislerin kendi sınırları içinde kalmalıdır.</p><h3>Son Söz</h3><p>Sevgili Dostlar. Bu yazıda, mikroservis mimarilerinde asenkron iletişimin neden doğal olarak hataya açık olduğunu ve bu problemi pratikte nasıl ele alabileceğimizi Outbox Pattern odağında inceledik. Outbox ve Inbox Pattern’lerinin birlikte kullanımıyla güvenilir mesaj üretimi ve tüketiminin nasıl sağlanabildiğini; Claim Check, CDC ve benzeri tamamlayıcı yaklaşımlarla hangi noktalarda desteklenebileceğini ele aldık.</p><p>Amaç belirli bir teknoloji ya da araç tanıtmak değil, dağıtık sistemlerde sıkça karşılaşılan tutarlılık problemlerine karşı uygulanabilir ve sürdürülebilir bir bakış açısı sunmaktı. Anlatılan desenler, kullanılan tech stack’ten bağımsız olarak farklı mimarilere uyarlanabilir niteliktedir.</p><p>İlerleyen yazılarda; daha ileri seviye event-driven mimari pratiklerine değinmeyi planlıyorum. Umarım faydalı bir içerik olmuştur. Bir sonraki yazıda görüşmek üzere, herkese iyi çalışmalar 🙂</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3deead79dee2" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Saga Pattern Nedir]]></title>
            <link>https://medium.com/@basrioglumehmet/saga-pattern-nedir-c677b9d7e565?source=rss-cb4f2f54355f------2</link>
            <guid isPermaLink="false">https://medium.com/p/c677b9d7e565</guid>
            <category><![CDATA[distributed-systems]]></category>
            <category><![CDATA[saga-pattern]]></category>
            <category><![CDATA[rabbitmq]]></category>
            <category><![CDATA[microservices]]></category>
            <dc:creator><![CDATA[Mehmet Basrioglu]]></dc:creator>
            <pubDate>Mon, 26 Jan 2026 23:55:57 GMT</pubDate>
            <atom:updated>2026-01-26T23:55:57.137Z</atom:updated>
            <content:encoded><![CDATA[<p>Merhaba; biliyorsunuz ki, biz yazılım geliştiriciler olarak karmaşık problemleri çözmek için yıllar içinde kanıtlanmış design pattern’lardan sıkça faydalanıyoruz. Bu pattern’lar yalnızca monolitik yapılarda değil, günümüzün vazgeçilmezi haline gelen Microservice mimarilerinde de kendini güçlü bir şekilde gösteriyor. Özellikle sistem büyüdükçe ve servisler birbirinden bağımsız çalışmaya başladıkça, karşılaşılan problemler de kaçınılmaz olarak daha karmaşık hale geliyor.</p><p>Bu noktada en kritik başlıklardan biri, dağıtık sistemler (Distributed Systems) içerisinde transaction yönetimi ve veri tutarlılığı(Data Consistency) oluyor. Tek bir veritabanı ve tek bir transaction sınırı olmadığında, “her şey yolunda mı?” sorusu çok daha zor cevaplanıyor. İşte tam da burada, bizi kurtaran önemli tasarım yaklaşımlarından biri devreye giriyor: Saga Pattern.</p><p>Saga Pattern, kısaca bir servisin client tarafından tetiklenip başarılı olduğu durumunda, diğer ilgili servislerin sırayla tetiklenmesi ve işleme devam etmesidir. Eğer bir servis başarısız olursa, önceki servisler telafi (<strong>Compensating Transaction</strong>) yani geri alma işlemleri yaparak sistemi tutarlı hale getirir. İki tip saga söz konusudur:</p><ol><li>Choreography-Based Saga</li><li>Orchestration-Based Saga</li></ol><h3>Choreography-Based Saga</h3><p>Choreography-Based Saga’da her mikroservis ilgili işlerini tamamladıktan sonra event publish(yayınlamak) eder. Diğer servislerde bu eventi consume(dinlemek) ederek kendi adımını başlatır. Her servis yalnızca kendi sorumluluğunu bilir.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/722/1*G7Zu1kdxsg4E7DhYbOMYdw.png" /></figure><h4>Choreography-Based Saga’nın Avantajları</h4><ol><li>Loosely Coupled(Servisler bağımsızdır ve daha modüler bir yapıdadır).</li><li>Decentralized Coordination(Saga’ları yöneten bir orkestrator yoktur).</li><li>Independent Scaling (Yüklenmeye bağlı olarak bağımsız ölçeklendirme yapılabilir).</li><li>Event-Driven Architecture (Olay bazlı mimaridir).</li><li>Resilience and Fault Tolerance (Her servis kendi transactionını yönetir, arıza kapsamını azaltır ve geri alma yani <strong>Compensating Transaction</strong> işlemi yapılarak sistemin dayanıklılığı sağlanmaktadır).</li><li>Flexibility and Agility (Orkestrator olmadığından değiştirebilirlik rahattır, servisler orkestrator ihtiyaç duymadan yeni olayları yayınlayıp dinleyebildikçe iş akışı dinamik olarak gelişebilir).</li></ol><h4>Choreography-based Saga Ne Zaman Seçilmeli/Kullanılmalıdır ?</h4><ol><li><strong>Microservice Mimarisi: </strong>Sisteminiz microservices olarak tasarlanmışsa, Choreography-Based Saga doğal bir uyum sağlar. Bu yaklaşım, loose coupling ve service autonomy destekleyerek her servisin bağımsız çalışmasına olanak tanır.</li><li><strong>High Scalability Requirements:</strong> Her servisin bağımsız olarak ölçeklenmesi gerektiğinde, choreography yaklaşımı, merkezi bir orkestrator olmadan hizmetlerin yük değişimlerine cevap vermesini sağlar.</li><li><strong>Resilience: </strong>Sistem hatalarının kaçınılmaz olduğu durumlarda, Choreography-Based Saga, sistemi kırmadan <strong>Eventual Consistency(Gecici Tutarsizlik yani her iki bankada yer alan hesaptaki para miktarı farklı olabilir lakin kısa bir zaman içerisinde düzelir)</strong> sağlamaya ve hataları yönetmeye yardımcı olur.</li><li><strong>Dynamic Business</strong>: İş süreçleriniz sık sık değişiyorsa, bu yaklaşım merkezi bir orkestratorı büyük ölçüde yeniden yazmaya gerek kalmadan esneklik sunar gelgelelim ki esnekliğin yanında iş akışının takibi zorlaşmaktadır.</li></ol><p>Compensating ve Eventual’dan sık sık bahsettik, farkları şunlardır:</p><p><strong>Compensating Transaction</strong></p><ul><li>Saga’da her adim icin bir <strong>compensating transaction</strong> (telafi edici islem) tanimlanir.</li><li>Chain’de bir adim başarısız olursa, önceki adımlardaki işlemler geri alınır.</li></ul><p><strong>Eventual Consistency</strong></p><ul><li>Eventual Consistency, verinin anlik tutarliligini garanti etmez.</li><li>BASE uyumludur. BASE, sistemin her zaman kullanılabilir olmasını sağlar. Kısa Süreli tutarsızlıkları kabul eder lakin sonunda verilerin tutarlı olmasını hedefler.</li></ul><h3>Orchestration-Based Saga</h3><p>Orchestration-Based Saga’da ise tüm işlem adımlarının merkezi bir Saga Orchestrator/Coordinator tarafından yönetildiği yaklaşımdır. Bu orkestratör, gerekli servisleri çağırır ve bir hata durumunda compensating transaction’ları tetikleyerek sistemi tutarlı hâle getirir.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/731/1*jCOoqSeXLAVuhSF3_iOWkQ.png" /></figure><h4>Choreography-Based Saga’yı Diğer Saga Patternleriyle Karşılaştıralım</h4><p><strong>Orchestration-Based Saga</strong></p><ul><li>Merkezi Orkestrator vardır, iş akışından sorumludur.</li><li>Logging ve Debugging kolaydır.</li><li>Yönetilebilirlik yüksektir.</li><li>Loose Coupling azalır ve Dependency artar.</li><li>Koordinatör fazla sorumluluk alır ve God Object riski doğurur.</li></ul><p><strong>Traditional Distributed Transactions</strong></p><ul><li><strong>Strong Consistency (Güçlü Tutarlılık):</strong> Servisler arasında güçlü tutarlılık sağlar, ancak dağıtık sistemlerde karmaşık ve performans açısından maliyetli olabilir.</li><li><strong>Two-Phase Commit (2PC):</strong> Sıkça kullanılır, fakat performans darboğazı yaratabilir ve tek bir hata noktası (single point of failure) oluşturur.</li><li><strong>Use Case</strong>: ACID özelliklerinin kesinlikle gerekli olduğu sistemlerde ve dağıtık kilitlemenin (distributed locking) performans etkilerinin kabul edilebilir olduğu durumlarda uygundur.</li></ul><p><strong>Karşılaştırma Tablosu</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1002/1*bMJ3dI_lyFYVrHFSlU5vLQ.png" /></figure><h3>Choreography-Based Saga Tasarlayalım</h3><p><em>Teknolojiler: .NET Core, MassTransit 8 (9+ Enterprise olarak ücretlidir), Mediator ve RabbitMQ.</em></p><h4><strong>Mikroservis Sorumlulukları</strong></h4><p><strong>Account Microservice:</strong> Kullanıcı üyeliklerinin oluşturulması, silinmesi ve dondurulmasından sorumludur. Kullandığı event’ler sırasıyla:</p><ul><li><strong>account-created (Producer):</strong> Yeni bir kullanıcı üyeliğinin başarıyla oluşturulduğunu bildirir.</li><li><strong>welcome-mail-send-failed (Consumer – Compensating Transaction):</strong> Hoş geldin e-postasının gönderilememesi durumunda ilgili üyelik için geri alım (Compensating Transaction) işlemlerini gerçekleştirir.</li></ul><p><strong>Mail Microservice: </strong>Hoş geldin e-postalarının gönderilmesinden ve e-posta gönderim hatalarının yönetiminden sorumludur. Kullandığı event’ler sırasıyla:</p><ol><li><strong>account-created (Consumer):</strong> Yeni bir kullanıcı üyeliğinin oluşturulduğunu dinleyerek hoş geldin e-postası gönderim sürecini başlatır.</li><li><strong>welcome-mail-send-failed (Producer):</strong> Hoş geldin e-postasının gönderilemediği durumları sistem geneline bildirir.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*odLDnY9OnGDmXyYV88wD_A.png" /></figure><h3>Rollback ve Retry Mantığı</h3><p>Rollback, Saga kapsamında başarısız olan bir adım sonrasında, daha önce başarıyla tamamlanan işlemleri telafi etmek (compensating transaction) için kullanılan mekanizmadır. Retry ise bir adımın geçici bir hata nedeniyle başarısız olması durumunda, işlemin belirlenen sayıda yeniden denenmesini ifade eder.</p><h3><strong>Son Söz</strong></h3><p>Bu yazıda, microservice mimarilerinde dağıtık transaction yönetiminin neden zor bir problem olduğunu ve bu problemi çözmek için kullanılan <strong>Saga Pattern</strong>’i detaylarıyla ele aldık. Özellikle <strong>Choreography-Based</strong> ve <strong>Orchestration-Based Saga</strong> yaklaşımlarını; avantajları, dezavantajları ve hangi senaryolarda tercih edilmeleri gerektiğiyle birlikte inceledik. Ayrıca <strong>Compensating Transaction</strong>, <strong>Eventual Consistency</strong>, <strong>Rollback</strong> ve <strong>Retry</strong> kavramlarının Saga içerisindeki rollerine değindik.</p><p>Anlatımı somutlaştırmak adına Account ve Mail mikroservisleri üzerinden event-driven bir örnek senaryo kurguladık. Buradaki amaç belirli bir ürün ya da teknoloji tanıtımı yapmak değil, Saga Pattern’in temel mantığını ve dağıtık sistemlerde nasıl konumlandığını anlaşılır bir şekilde aktarmaktı. Kendi projelerinizde kullandığınız tech stack’e ve ihtiyaçlarınıza göre bu yapıyı rahatlıkla uyarlayabilirsiniz.</p><p>Bu konunun bir ileri aşamasında; <strong>observability</strong>, <strong>idempotency</strong>, <strong>retry–backoff stratejileri</strong>, <strong>dead-letter queue</strong> kullanımı ve daha kompleks Saga senaryoları gibi başlıklara da değinilebilir. İlerleyen yazılarda bu konuları daha derinlemesine ele almayı planlıyorum.</p><p>Umarım sizler için faydalı ve yol gösterici bir içerik olmuştur. Bir sonraki yazıda yeni konularla tekrar buluşmak üzere…<br>Herkese iyi çalışmalar 🙂</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c677b9d7e565" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AWS Elastic Compute Cloud — EC2]]></title>
            <link>https://medium.com/@basrioglumehmet/aws-elastic-compute-cloud-ec2-62b90e636b33?source=rss-cb4f2f54355f------2</link>
            <guid isPermaLink="false">https://medium.com/p/62b90e636b33</guid>
            <category><![CDATA[backend-development]]></category>
            <category><![CDATA[windows-server]]></category>
            <category><![CDATA[aws-ec2]]></category>
            <category><![CDATA[deployment]]></category>
            <category><![CDATA[aws]]></category>
            <dc:creator><![CDATA[Mehmet Basrioglu]]></dc:creator>
            <pubDate>Sat, 24 Jan 2026 02:20:32 GMT</pubDate>
            <atom:updated>2026-01-24T02:40:22.149Z</atom:updated>
            <content:encoded><![CDATA[<h3>AWS Elastic Compute Cloud — EC2</h3><p>Amazon EC2 (Elastic Compute Cloud), AWS’nin bulut tabanlı sanal sunucu hizmetidir. Fiziksel sunucu satın almak ve kurmak yerine, dakikalar içinde bulutta çalışan sanal sunucular oluşturabilirsiniz.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/0*lbcWcZEN6r0GLQKB.png" /></figure><p>İhtiyaçlarınız doğrultusunda ölçeklendirme yapabilir; dilediğiniz gibi kaynakları azaltabilir ya da instance kaynaklarınızı artırabilirsiniz.</p><p>Instance kavramından bahsetmişken, “Instance nedir?” sorusuna kısaca değinelim. Sevgili dostlar, instance; EC2 üzerinde çalışan sanal makinelere verilen isimdir. Tıpkı fiziksel bir bilgisayar gibi, kendi içerisinde bellek (RAM), işlemci (CPU), depolama, işletim sistemi(AMI/OS) ve ağ (network) gibi bileşenlere sahiptir.</p><p><em>Not: Servis ile Instance’ları karıştırmayın. EC2, S3 gibi diğer Amazon Web Services hizmetleriyle birlikte sunulan bir hizmettir. EC2 veya başka bir hizmeti kullandığımızda, bunu bir örnek üzerinden kullanırız; örneğin, EC2&#39;deki t3.micro örneği vb.</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/791/1*X6VrVqA9n0-I3tn7Jmz05w.png" /></figure><p><strong>Neden EC2 ?</strong></p><p>Kendi sunucularınızı satın alıp bağımsız çalışabilirsiniz; ancak bu durumda güvenlik güncellemeleri, bakım, arıza giderme ve altyapı yönetimi gibi birçok ek sorumluluk da size ait olur. Bunlar için ya zaman harcamanız ya da ekstra personel istihdam etmeniz gerekir.</p><p>AWS EC2 kullandığınızda ise bu altyapı süreçlerinin tamamı Amazon tarafından yönetilir. Siz yalnızca uygulamanıza odaklanırsınız ve üstelik bunu çok daha düşük maliyetle yaparsınız.</p><p><strong>Maliyet Avantajı Kısaca:</strong></p><ol><li>Fiziksel sunucularda altyapıyı yönetmek için bir IT ekibi gerekirken, EC2’de bu sorumluluk AWS tarafından üstlenilir.</li><li>Fiziksel sunucularda donanım arızaları ve kesintiler ek maliyet oluşturur; yüksek erişilebilirlik için yedek sistemler gerekirken, EC2 esnek ve kolay ölçeklenebilir yapısıyla öne çıkar.</li><li>Fiziksel sunucularda satın alınan donanımlar zamanla değer kaybederken, EC2’de zaman geçtikçe daha güçlü donanımlar daha düşük maliyetlerle sunulur.</li></ol><p>Neden EC2 kullanmalıyız konusuna değindik. Şimdi ise instance tiplerini inceleyelim.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*5Nn0ayA-J3SlLQnE.png" /></figure><p><strong>t3,t4g: </strong>Genel amaçlı kullanımlar için tercih edilir. Ne eksik ne fazla; günlük iş yükleri için dengeli performans sunan, “her işe yeterim” diyen instance tipleridir.</p><p><strong>c6g,c7i:</strong> CPU ağırlıklı işlemler içindir.</p><p><strong>r6i, r7g: </strong>Database ağırlıklı işlemler için kullanabilirsiniz. RAM Ağırlıklı olanlar için tercih edilir.</p><p><strong>p4,g5: </strong>GPU ağırlıklıdır.</p><h4>Burstable Performance Instances (T2 / T3 / T4g)</h4><p>T2 Instance’ları Burstable Performance’lara sahiptir. CPU’nun belirli seviyede çalıştığı anlamına gelir lakin daha fazla işlem gücü gerektiğinde kısa süreliğine burst moduna geçer ve yüksek verim sağlar.</p><ul><li>CPU Boşta ise Credit kazanırsınız.</li><li>Kullanılmayan Credit’lar hesapta birikir.</li><li>Credit bakiyenize göre scale-up veya down kararı verebilirsiniz.</li><li>Her burst işlemi sırasında Credit’lar harcanır; yani her şeyin maliyeti olduğu gibi burst’un da maliyeti söz konusudur.</li></ul><h4>Elastic Block Storage Optimized Instances</h4><p>C4, M4 ve D2 instance’ları varsayılan olarak EBS optimized gelir.<br>EBS (Elastic Block Storage), AWS tarafından sunulan ve yüksek IOPS değerlerine sahip bir depolama servisidir. Bu sayede EBS volume’leri optimize edilmiş instance’lara bağlandığında tek haneli milisaniye gecikmeler elde edilebilir.</p><blockquote><strong>IOPS(Input/Output Operations Per Second):</strong> Depolama sistemlerinin saniyede gerçekleştirebildiği okuma/yazma işlem sayısını ifade eden bir performans ölçütüdür.</blockquote><h4>Cluster Networking Instances</h4><p>X1, M4, C4, C3, I2, G2 ve D2 instance’ları cluster networking desteği sunar.<br>Aynı placement group içinde başlatılan instance’lar, yüksek bant genişliği ve düşük gecikme süresi sağlayan mantıksal bir gruba yerleştirilir. Bu sayede grup içindeki tüm instance’lar arasında hızlı ve düşük gecikmeli ağ iletişimi sağlanır.</p><p>Placement group, belirli EC2 instance’larının bir araya getirildiği mantıksal bir kümedir. Bu gruba dahil olan instance’lar, tek akışta (single-flow) 10 Gbps, çoklu akışta (multi-flow) ise her yönde 20 Gbps’ye kadar ağ bant genişliğinden faydalanabilir.</p><p>Placement group’a dahil olmayan instance’lar ise çoklu akış trafiğinde 5 Gbps ile sınırlandırılır.</p><p>Cluster Networking, yüksek performans gerektiren analitik sistemler, HPC (High Performance Computing) ve büyük ölçekli veri işleme senaryoları için idealdir.</p><p><strong>Dedicated Instances</strong></p><p>Tek bir müşteriye ait single-tenant donanım üzerinde çalışan instance’lardır. Kurumsal politikalar veya sektörel regülasyonlar gereği, iş yüklerinin diğer müşterilerin instance’larından tamamen izole edilmesi gereken senaryolar için idealdir; ancak maliyetleri yüksektir.</p><p>Bu modelde instance’lar donanım seviyesinde izole edilir ve müşteriye özel fiziksel makineler üzerinde çalışır. Özellikle yüksek güvenlik, uyumluluk (compliance) ve izolasyon gereksinimi olan kurumlar tarafından tercih edilir.</p><p><strong>Dedicated Hosts</strong></p><p>Dedicated Host’lar, AWS üzerinde tamamen size ayrılmış fiziksel sunuculardır. Dedicated Instance’lara kıyasla daha fazla kontrol sunar ve daha pahalıdır.</p><p>Bu modelde fiziksel sunucu üzerindeki instance yerleşimini siz yönetirsiniz. Özellikle lisanslama (BYOL) gereksinimi olan yazılımlar, donanım seviyesinde detaylı kontrol isteyen ve sıkı kurumsal politikaları bulunan yapılar için tercih edilir.</p><h4>EC2 Instance Oluşturma</h4><ul><li>AWS üyeliğinize giriş yapınız, arama kutucuğuna ec2 yazarak ilgili yere tıklayınız.</li><li>Launch Instance basınız.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*QePLyRJI1IPC4wmzyIZERg.png" /></figure><ul><li>Açılan ilgili sayfada bir takım bilgileri girmeniz/seçmeniz gerekmektedir.,</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*MKEHF6GMeLMT68qCprMcpg.png" /></figure><ul><li>Name and tags bölümünde sunucu adınızı belirleyebilirsiniz.</li><li>Application ve OS Image seçmeniz gerekmektedir. Peki, AMI nedir? Gelin bunu yüzeysel olarak öğrenelim. AMI (Amazon Machine Image), bir EC2 instance’ı başlatmak için gerekli olan işletim sistemi, uygulamalar ve temel yapılandırmaları içeren hazır bir şablondur. Kısaca, EC2 instance’ınızın başlangıç noktasıdır. AMI’ler iki şekilde kullanılabilir: önceden yapılandırılmış AMI’ler veya kendi ihtiyaçlarınıza göre yapılandırdığınız AMI’ler.</li><li>Instance type olarak örnek amaçlı t3.micro kullanacağız; ancak ihtiyaçlarınıza göre farklı bir instance tipi de tercih edebilirsiniz.</li><li>Key Pair tanımını yapmanız gerekmektedir; önceden oluşturduğunuz bir key pair’i kullanabilir ya da yeni bir key pair oluşturabilirsiniz. Create new key pair butonuna tıklayarak devam edelim. Açılan pencerede (modal) sizden Key pair name istenir.</li><li>Key pair name, anahtarın adıdır ve oluşturulacak EC2 instance’ına bağlanırken kimlik doğrulama amacıyla kullanılır. Bu anahtar, instance’a güvenli şekilde erişim sağlamanızı mümkün kılar. Create key pair butonuna tıklayıp .pem formatını seçtikten sonra işleminize devam edebilirsiniz.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*4f8pf421bOij4zY9oIRddw.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/644/1*7GZp-GhqE_YVzlDaMcQuIQ.png" /></figure><ul><li>Network, VPC gibi yapılandırmaların seçilmesi gerekmektedir. Yüzeysel olarak VPC şu anlama gelir: VPC (Virtual Private Cloud), AWS üzerinde size özel, izole bir sanal ağ ortamıdır. EC2 instance’larınızı bu ağ içinde konumlandırır, IP adresleme, subnet, routing ve güvenlik kurallarını kontrol etmenizi sağlar. Bununla birlikte, zaten bir security group’unuz varsa onu kullanabilirsiniz.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Kt89XjZ7aYt4PShDSfhXSQ.png" /></figure><ul><li>Storage bölümünde EC2 instance’ınız için kullanılacak depolama alanı yapılandırılır. Bu depolama alanı EBS (Elastic Block Storage) kullanılarak sağlanır. Disk türü (gp2, gp3 vb.), disk boyutu ve gerekirse IOPS değerleri belirlenir. Varsayılan ayarlar çoğu senaryo için yeterlidir; ancak uygulama ihtiyacına göre depolama kapasitesi ve performans ayarları özelleştirilebilir. Advanced yazan butona tıklayarak daha detaylı depolama ayarlarına erişebilirsiniz.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*or0HIa_guy3HY9ZPlLSN6Q.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bl7pa53mBS3eUN_rx41akA.png" /></figure><p><strong>Delete on termination: </strong>Bu ayar, EC2 instance silindiğinde (terminate) bağlı olan EBS volume’un otomatik olarak silinip silinmeyeceğini belirler.</p><ul><li><strong>Enabled (Varsayılan):</strong> Instance silindiğinde volume da silinir.</li><li><strong>Disabled:</strong> Instance silinse bile volume AWS hesabınızda kalır ve manuel olarak silinmesi gerekir.</li></ul><p><strong>Size (GiB):</strong> EBS volume’un disk boyutunu belirtir.</p><p><strong>IOPS (Input/Output Operations Per Second):</strong> Volume’un saniyede gerçekleştirebileceği okuma/yazma işlem sayısını ifade eder.</p><ul><li><strong>gp3,gp2:</strong> Genel amaçlı volume tipleridir. Saniyede 3.000 ile 16.000 arasında işlem yapabilir. Fiyat olarak ortalama bir fiyat kullanmaktadır. Web server olarak rahatlıkla kullanabilirsiniz.</li><li><strong>io1,io2:</strong> Provisioned SSD olarak geçmektedir ancak yüksek performans gerektiren durumlarda kullanılır ve saniyede 64.000 işlem yapabilir. Production database’lerde yaygın kullanılır(MongoDB).</li><li><strong>st1(Throughput Optimized HDD),sc1(Cold HDD):</strong> Disklerde performans IOPS yerine MiB/s üzerinden ölçülür. Büyük ve ardışık veri okuma/yazma işlemleri için uygundur. Saniyede 500 MB/s(st1) ile 250 MB/s(sc1) işlem yaparlar. Big Data, data warehouse gibi sistemlerde kullanılır.</li></ul><p>Son olarak, Launch Instance butonuna tıklayarak instance oluşturma işlemini tamamlayınız. İşlem başarıyla tamamlandığında, oluşturulan instance’a ait Instance ID ekranda görüntülenecektir. Bu ID’ye tıklayarak ilgili sayfaya geçebilir ve sunucuya ait tüm detaylı bilgilere ulaşabilirsiniz.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*hoOKTcRNi1xcugDZwSRFXA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*rOJJsvkwQFo4wmVikAQEBQ.png" /></figure><p>EC2 instance’ınızı oluşturduğunuza göre, şimdi EC2 Fiyatlandırma (Pricing) konusuna geçelim ve AWS’in sunduğu farklı ücretlendirme modellerini inceleyelim.</p><h4>EC2 Fiyatlandırma</h4><p><strong>Free Tier</strong></p><p>Free Tier, ay bazlı 750 saat EC2 kullanım hakkı sunar. Bu ücretsiz kullanım, AWS platformuna kayıt olduğunuz tarihten itibaren 1 yıl boyunca geçerlidir.</p><p>EC2 fiyatlandırmasını basitçe 3 başlık altında inceleyebiliriz:</p><p><strong>Spot Instances</strong></p><p>Spot Instances, AWS’nin kullanılmayan EC2 kapasitesini daha düşük maliyetle kullanmanızı sağlayan bir fiyatlandırma modelidir. Spot instance’ların saatlik fiyatı AWS tarafından belirlenir ve bulunduğu Availability Zone’daki kapasite durumuna göre değişkenlik gösterir. Bu modelde, bir instance için ödemek istemediğiniz maksimum saatlik fiyatı belirlersiniz. Spot fiyat bu belirlediğiniz değerin üzerine çıktığı anda, ilgili instance otomatik olarak durdurulur. Bu nedenle Spot Instance’lar, kesintiye toleransı olan iş yükleri için uygundur.</p><p><strong>On-Demand Instances</strong></p><p>On-Demand Instances, herhangi bir uzun vadeli taahhüt veya peşin ödeme olmadan, saatlik bazda ödeme yaparak kullanılan instance’lardır. Trafiği öngörülemeyen uygulamalar veya ilk kez yayına alınan test ve development uygulamaları için oldukça uygundur.</p><p><strong>Reserved Instances</strong></p><p>Reserved Instances, On-Demand Instance’lara kıyasla önemli maliyet avantajları sunar. Bu modelde, belirli bir süre boyunca instance kullanımını rezerve edersiniz ve bunun karşılığında indirimli fiyatlardan yararlanırsınız. Reserved Instance’lar için üç farklı ödeme seçeneği bulunmaktadır:</p><ul><li><strong>No Upfront: </strong>Peşin ödenek yoktur, saatlik ücret söz konusudur.</li><li><strong>Partial Upfront: </strong>Bir kısmını peşin, bir kısmını saatlik indirimli olarak ödediğiniz modeldir.</li><li><strong>All Upfront:</strong> Sözleşmeyle tek ödenek alınır ve ilgili süre boyunca kullanılır. Taahüt sürenize bağlı kaldığınız modeldir, genellikle production ortamları için tercih edilir.</li></ul><p>EC2 Reserved Instance’larda üç farklı ödeme seçeneğine ek olarak iki farklı tür (type) bulunmaktadır:</p><ul><li><strong>Standard Reserved Instances:</strong> Indirim oranların yüksek olduğu instance’lardır. Instance tipi, işletim sistemi, bölge ve tenancy değiştirilemez. Uzun süre değişim yapmak gibi derdiniz yoksa kullanabilirsiniz.</li><li><strong>Convertible Reserved Instances:</strong> Standard Reserved’lara göre indirim oranları biraz daha düşüktür. Instance tipi, işletim sistemi, bölge ve tenancy için değişim imkanı verir. Zaman içerisinde mimarisi değişebilecek sistemler için uygundur.</li></ul><h4>Ephemeral Storage</h4><ul><li>Fiziksel olarak Instance’ın olduğu sunucuya bağlıdır.</li><li>Milyonlarca IOPS yeteneği vardır.</li><li>Boyutu seçtiğiniz Instance göre sabittir.</li><li>Buffering, Caching yada tmp data için kullanılır.</li><li>Kalıcı değildir, kapatıp açıldığında silinir.</li></ul><h4>Elastic File System (Network File System)</h4><ul><li>Dosya sistemi (file-based) depolamadır.</li><li>Aynı anda birden fazla EC2 instance tarafından kullanılabilir. Peki ne anlama geliyor? Bir sunucuda dosya oluşturulduğu anda diğer sunucuya yansıtılır.</li><li>Otomatik ölçeklenir (boyut yönetimi gerekmez).</li><li>NFS protokolü üzerinden erişilir.</li><li>Paylaşımlı dosya yapıları için idealdir.</li><li>Birden fazla Availability Zone(AZ)’da çalışabilir.</li></ul><p><strong>Kullanım Alanları: Mikroservisler, Content Management Sistemleri ve Container Storage.</strong></p><h4>EBS ve EFS Farkı</h4><ul><li>Tek instance + yüksek performans gereksinimi için EBS tercih edilir.</li><li>Birden fazla instance + paylaşımlı dosya sistemi ihtiyacı için ise EFS kullanılır.</li></ul><h3>Bonus: Windows Server ile Remote Desktop Connection</h3><p>Bir EC2 Windows Server Instance oluşturduktan sonra sunucuya bağlantı kurmanız gerekir. Bu bağlantıyı sağlamak için Remote Desktop Connection (RDP) kullanılır. RDP, Windows işletim sistemlerinde varsayılan olarak yüklü gelir ve ek bir kurulum gerektirmez. Velhasıl kelam, bu uygulama sayesinde Windows Server instance’ınıza kolayca bağlanabilirsiniz.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/399/1*0TyG_E22BCJbskIfActA4g.png" /></figure><p>VPC security group yapılandırmaları doğru şekilde yapılmadığı takdirde troubleshoot gibi sorunlar yaşayabilirsiniz.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Eo8Y7zjKma38IcX6doaQIQ.png" /></figure><ul><li><strong>Type:</strong> RDP olarak ayarlanmalıdır.</li><li><strong>Source:</strong> Anywhere IPv4 seçilebilir; bu ayar, sunucuya her yerden erişime izin verir. Ancak güvenlik açısından önerilen yöntem, erişimi yalnızca kendi IP adresinizle sınırlandırmaktır.</li></ul><p>Ek olarak HTTP (80) ve HTTPS (443) için gerekli Security Group kurallarını eklemeyi unutmayınız.<br>Windows Server instance’larda varsayılan olarak dış erişim kapalı gelebilir; bu nedenle web uygulamanızın dış dünyadan erişilebilir olması için bu portların Inbound Rules altında açık olması gerekmektedir.</p><p>Doğru VPC yapılandırması sayesinde Windows Server instance’a başarıyla bağlantı sağlandığını gösteren görüntü:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2JfaovgVQ1TFbn38OSUo7Q.png" /></figure><h3>Son Söz</h3><p>Bu yazıda AWS EC2’nin ne olduğunu ve instance’ların nasıl oluşturulduğunu adım adım ele aldık. Kişisel projelerimde .NET/Java ve React uygulamalarını deploy ederken Windows Server + IIS veya Ubuntu + Nginx gibi teknolojiler kullandım; siz de ihtiyaçlarınız ve planlarınız doğrultusunda en uygun tech stack’i tercih edebilirsiniz.</p><p>Elbette bu anlatılanların bir ileri seviyesi olarak, container teknolojileri kullanılarak yapılan auto — scaling ve deploy süreçleri de bulunmaktadır. Bu konulara ilerleyen makalelerde değineceğiz.</p><p>Umarım sizler için faydalı ve yol gösterici bir içerik olmuştur. Bir sonraki yazıda yeni konularla tekrar buluşmak üzere…<br>Herkese iyi çalışmalar 🙂</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=62b90e636b33" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AWS RDS]]></title>
            <link>https://medium.com/@basrioglumehmet/aws-rds-52dd05886a7e?source=rss-cb4f2f54355f------2</link>
            <guid isPermaLink="false">https://medium.com/p/52dd05886a7e</guid>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[net-core]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[aws-rds]]></category>
            <category><![CDATA[amazon-web-services]]></category>
            <dc:creator><![CDATA[Mehmet Basrioglu]]></dc:creator>
            <pubDate>Thu, 22 Jan 2026 03:43:51 GMT</pubDate>
            <atom:updated>2026-01-22T03:43:51.239Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/700/0*RhZbAQIW6QqGy56X.png" /></figure><p>Bu makalede Amazon İlişkisel Veritabanı Hizmeti (Amazon RDS) ele alınacaktır.</p><p>AWS RDS, ilişkisel bir veritabanının kurulumunu, işletimini ve ölçeklendirilmesini kolaylaştıran bir web hizmetidir. Sektör standardı ilişkisel veritabanları için uygun maliyetli ve yeniden boyutlandırılabilir kapasite sunar ve yaygın veritabanı yönetim görevlerini otomatik olarak yönetir.</p><h4>Detaylı Olarak AWS İlişkisel Veritabanı Hizmeti Kullanmanın Faydaları</h4><ol><li>Multiple Database Engine desteği sunar (SQL Server, Oracle, MySQL, PostgreSQL vb.).</li><li>Managed Service olarak; otomatik veritabanı yedekleme, patch ve versiyon güncellemeleri, monitoring ve logging hizmetleri sağlar ve failover desteği sunar.</li><li>Multi-AZ mimarisi sayesinde kesintilere hızlı yanıt verir ve yüksek erişilebilirlik sağlar.</li><li>Replikasyon hizmetlerini destekler.</li><li>VPC ile entegre edilebilir.</li><li>IAM (Identity and Access Management) ile erişim kontrolleri sağlanabilir.</li><li>Encryption ile veriler şifrelenebilir.</li><li>Kullandıkça öde fiyatlandırma modeli sunar; yalnızca kullanılan kaynaklar kadar ödeme yapılır. Uzun vadeli tasarruf için Reserved Instances seçenekleri de mevcuttur.</li></ol><p><strong>Peki ne anlama geliyor ?</strong></p><p>Kurumsal şirketlerde sıkça karşılaşılan fault detection, yazılım / patch / versiyon güncellemeleri ve yedek alma gibi operasyonel süreçler, AWS RDS gibi managed servisler sayesinde otomatik olarak yönetilir. Böylece bu süreçlerden kaynaklanan sorunlar ortadan kaldırılır, operasyonel yük azalır ve iş sürekliliği sağlanmış olur.</p><h4>Limitler</h4><ul><li>Storage Limiti: RDS veritabanlarının maksimum boyutu ve bölge başına örnek sayısı için belirli sınırlar vardır.</li><li>Root erişimi yoktur: RDS, veritabanının altında çalışan işletim sistemine doğrudan root erişimi sağlamaz.</li><li>Tam özelleştirme sınırlıdır: RDS birçok yönetimsel detayı soyutladığı için, tam sistem kontrolü gerektiren senaryolar için uygun olmayabilir.</li></ul><h4>AWS RDS için Use Case’ler</h4><ol><li>Web Uygulamaları: Güvenilir bir arka uç veritabanına ihtiyaç duyan dinamik web siteleri.</li><li>Mobil Uygulamalar: Kullanıcı verilerinin ve uygulama durumunun saklanması.</li><li>Analitik: Yapılandırılmış veriler üzerinde sorgular ve analizler çalıştırmak.</li><li>Kurumsal Uygulamalar: Güçlü ve ölçeklenebilir veritabanlarına ihtiyaç duyan iş uygulamala</li></ol><h4>SQL Server Database Oluşturalım</h4><p>Sevgili dostlar, yukarıda AWS RDS’in temel faydalarından bahsettik. Şimdi ise SQL Server Database nasıl oluşturulur ve nasıl bağlanılır sorularına adım adım yanıt verelim.</p><p>1. Arama kutucuğuna RDS yazarak Aurora and RDS servisine tıklayınız.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/826/1*X7LxDzK3wws9R_3UL6Hz4A.png" /></figure><p>2. Create database butonuna tıklayınız.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/642/1*tLV1i_0Z2vzox_ES_Atu2w.png" /></figure><p>3. Easy Create seçeneğini seçiniz. Bu seçenekle best-practice ayarları varsayılan olarak gelir. Alternatif olarak Full configuration, detaylı yapılandırma yapmak isteyenler için kullanılabilir.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*GsaAmiuVp8gb_yS9O46xhQ.png" /></figure><p>4. DB instance identifier alanında veritabanına bir isim veriniz. Her veritabanı isminin benzersiz (unique) olması gerekmektedir.</p><p>5. Veritabanına bağlanabilmek için bir Master kullanıcı adı belirleyiniz. Güvenlik sebebiyle admin gibi tahmin edilebilir kullanıcı adlarından kaçınılmalıdır.</p><p>6. Credential Management alanında iki seçenek bulunmaktadır:</p><ul><li>Secrets Manager: Şifrelerin AWS Secrets Manager ile yönetilmesi.</li><li>Self Managed: Şifrenin manuel olarak belirlenmesi.</li></ul><p>Self Managed seçeneğini seçerek Master password alanında şifrenizi belirleyiniz.</p><p>7. EC2 ile bağlantı kurulabilir; ancak bu adım opsiyoneldir.</p><p>8. Create database butonuna tıklayınız. Veritabanı yaklaşık 1–5 dakika içerisinde oluşturulacaktır.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*yHIgHLwd_JW3rjDuXyb10w.png" /></figure><p>9. Instance listesinden CPU kullanımı gibi metrikleri görüntüleyebilirsiniz.</p><h4>SSMS (SQL Server Management Studio) ile Bağlanalım</h4><p>1. Veritabanına tıklayınız.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*YFL5Ce3of0aIVi8IPFd8bw.png" /></figure><p>Endpoint: SQL Server bağlantı adresidir.</p><p>Port: SQL Server’ın çalıştığı port numarasıdır.</p><p>2. VPC Security Group tanımına yeni bir kural eklenmelidir. Bunun için default security group’a tıklayınız ve açılan sayfada ilgili Security Group ID’ye giriniz.</p><p>3. Edit inbound rules butonuna tıklayınız.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*1iYlhf3Hh6iOvexP40quJg.png" /></figure><p>4. Add rule ile yeni bir kural ekleyiniz:</p><ul><li>Protocol: TCP</li><li>Port range: 1433</li><li>Source: My IP olarak işaretleyiniz. Bu işlem, mevcut IP adresinizin otomatik olarak tanımlanmasını sağlar ve external bağlantıya izin verir (public erişim gerektirir).</li></ul><p>Save rules ile kaydediniz.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*4-fZdzWyXJCJeFIlupQupA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/143/1*7XY5MkUZkadOog7doaJ1tA.png" /></figure><p>5. Public erişim izni vermek için Modify butonuna basınız.</p><ul><li>Connectivity — Additional configuration bölümünde<br>Not publicly accessible değerini Publicly accessible olarak değiştiriniz.</li><li>Continue ile kaydediniz. Yaklaşık 5 dakika içinde erişim aktif olur.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*49S993nSvag3FcnCKvgbxw.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*GvVgjyp8E3zueICmXx_O7A.png" /></figure><p>6. SQL Server Management Studio’yu açınız ve AWS üzerinden kopyaladığınız endpoint’i Server Name alanına yapıştırınız.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/486/1*L2W_Sd9ifNCFy5Hr4NZzaw.png" /></figure><p>7. Authentication tipini SQL Server Authentication olarak seçiniz ve Master kullanıcı adı ile şifreyi giriniz.</p><p>8. Connect butonuna basınız. Tüm adımlar doğruysa bağlantı başarılı bir şekilde kurulacaktır.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/271/1*q21DmQ4SbbhE3b-vB8bI1w.png" /></figure><h4>Son Söz</h4><p>Bu yazıda, AWS RDS (Amazon İlişkisel Veritabanı Hizmeti)’nin ne olduğunu, sağladığı temel faydaları ve SQL Server veritabanının nasıl oluşturulup SSMS üzerinden nasıl bağlanılacağını adım adım ele aldık.</p><p>Umarım sizler için faydalı ve yol gösterici bir içerik olmuştur. Bir sonraki yazıda yeni konularla tekrar buluşmak üzere…<br>Herkese iyi çalışmalar 🙂</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=52dd05886a7e" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AWS Secrets Manager]]></title>
            <link>https://medium.com/@basrioglumehmet/aws-secrets-manager-24a3be7cc1df?source=rss-cb4f2f54355f------2</link>
            <guid isPermaLink="false">https://medium.com/p/24a3be7cc1df</guid>
            <category><![CDATA[aws-secrets-manager]]></category>
            <category><![CDATA[net-core]]></category>
            <category><![CDATA[aws]]></category>
            <dc:creator><![CDATA[Mehmet Basrioglu]]></dc:creator>
            <pubDate>Tue, 20 Jan 2026 03:09:47 GMT</pubDate>
            <atom:updated>2026-01-20T03:16:50.399Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*cmOsCJG5dIhp30uQcEodhA.jpeg" /></figure><p>Bu makalede, AWS Secrets Manager kullanılarak veritabanı bağlantı bilgileri veya encryption master key gibi hassas değerlerin nasıl güvenli bir şekilde saklandığını ele alacağız.</p><p>AWS Secrets Manager; credential’ların yönetilmesini, credential rotation süreçlerini ve gizli bilgilerin güvenli şekilde saklanmasını sağlar. Ayrıca OAuth token’ları veya özel API key’ler (örneğin Turkcell API) gibi hassas verilerin tutulmasına imkân tanır.</p><p><strong>Peki ne anlama geliyor ?</strong></p><p>Uygulama içinde credential’ları hard-code etmenize gerek kalmadan, bu bilgileri güvenli ve merkezi bir şekilde yönetebileceğiniz anlamına gelmektedir.</p><h4>AWS Secrets Manager Dashboard’unu Keşfedelim</h4><p>AWS Secrets Manager Dashboard’unu keşfetmeye başlamadan önce AWS Management Console giriş yapalım ve secrets manager yazarak aratalım;</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/894/0*FacD1jp0bSh8ILD5.png" /></figure><p>Ardından açılan sayfada <strong>“Store a new secret”</strong> butonuna tıklayarak ilgili sayfaya geçelim. Secret type alanında <strong>“Other type of secret”</strong> seçeneğini seçelim.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/932/1*fKv6NpAru1y8hhA0szF2gQ.png" /></figure><p><strong>Key/Value Pairs</strong> alanı, gizli bilginin <strong>anahtar/değer (Key/Value)</strong> şeklinde mi yoksa <strong>Plaintext</strong> olarak mı tutulacağına karar verdiğimiz bölümdür. .NET tarafında generic sınıfları kullanacağımız için <strong>Plaintext</strong> seçeneğini tercih etmemiz daha doğru olacaktır. Elbette ihtiyaç duyulması halinde <strong>Key/Value</strong> formatı da kullanılabilir; bu tamamen opsiyoneldir.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/621/1*P1S5lN57gHqbwAHwxHYiEg.png" /></figure><p><strong>Plaintext Değeri</strong></p><pre>{<br>  &quot;ConnectionStrings&quot;: {<br>    &quot;CatalogueDB&quot;: &quot;Server=HP\\SQLEXPRESS;Database=dotnetmicroservice;Trusted_Connection=True;TrustServerCertificate=True;Encrypt=False;&quot;,<br>    &quot;RedisConnection&quot;: &quot;localhost:6379&quot;<br>  }<br>}</pre><p>Bu yapılandırma bizim için yeterli olacaktır. Ancak çalışma sürecinde bu hassas veriye daha kolay erişebilmek adına bir sonraki adımda <strong>secret name</strong> değerini tanımlayacak ve isteğe bağlı olarak kısa bir açıklama ekleyebiliriz.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/632/1*h1aBIARGE0ML7_iRYpwN7w.png" /></figure><p>Ayrıca yüksek erişilebilirlik sağlamak için aşağıdaki gibi <strong>Replicate secret</strong> kısmında yapılandırmada bulunabilir ve böylece diğer AWS region’larında hassas verilerin read-only kopyalarını oluşturabilirsiniz. Unutmayın! Sizlere sunulan ek özelliğin bir maddi karşılığı vardır. Bu husus dikkate alınarak planlamalar yapılmalıdır. Rotation’ları şimdilik atlayacağız, sonraki makalelerde ayrı ele alıyor olacağız.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/626/1*aqhrW01xBIUsoTDYPMM-iA.png" /></figure><p>Store diyerek işlemi tamamlayalım. Bu adımın ardından AWS Secrets Manager üzerindeki secret değerlerimizi oluşturmuş olacağız.</p><h4><strong>.NET Tarafında Nasıl Bir Yol İzleyeceğiz ?</strong></h4><ol><li><strong>Shared</strong> isimli bir class library oluşturacağız. Eğer hâlihazırda bir <strong>Core</strong> veya <strong>Infrastructure</strong> katmanınız varsa onu da kullanabilirsiniz; ancak bu anlatımda <strong>Shared</strong> üzerinden devam edeceğiz.</li><li><strong>AWS</strong> isimli bir klasör ekleyeceğiz. Bu klasör, AWS ile ilgili tüm altyapı desteğinin sağlandığı alan olacaktır.</li><li><strong>AWS</strong> klasörü içerisinde <strong>SecretsManager</strong> isimli bir alt klasör oluşturacağız. Bu alt klasör, <strong>AWS Secrets Manager</strong> altyapısını barındıracaktır. Bu yapı altında, ilgili sorumluluklara göre ayrılmış başka alt klasörlerimiz de yer alacak ve <strong>separated</strong> yapıyı korumaya özen göstereceğiz.</li><li><strong>Provider</strong>, <strong>Extension </strong>ve <strong>ConfigurationSource </strong>yapılarını aktif olarak kullanacağız. Extension aracılığıyla <strong>IConfigurationBuilder’ı </strong>genişletecek ve <strong>AddAwsSecretsManager </strong>metodunu kullanarak istediğimiz generic tipte configuration property kayıtlarını gerçekleştireceğiz.</li></ol><p>Temel olarak yol haritamızın nasıl ilerleyeceğini artık büyük ölçüde anladığınızı varsayıyorum.</p><h4>.NET Yol Haritasının Uygulanması</h4><p>Yol haritamızı uygulamaya başlayalım. <strong>S3</strong> oluşturmayınız; çünkü kişisel projemde S3, depolama amacıyla kullanılmaktadır. Bu adımda projedeki altyapıyı birlikte inceleyip uygulayacağız, ancak <strong>S3</strong> konusu başka bir makalede detaylı olarak ele alınacaktır.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/371/1*iR2JcExBe1u6zg261ti5pw.png" /></figure><p><strong>Configurations/ApplicationSettings.cs</strong></p><pre>using Shared.AWS.SecretManagers.Model;<br><br>namespace Shared.AWS.SecretManagers.Configurations<br>{<br>    public class ApplicationSettings<br>    {<br>        public ConnectionStrings ConnectionStrings { get; set; }<br>    }<br>}</pre><p><strong>ConfigurationSources/AwsSecretsManagerConfigurationSource.cs</strong></p><pre>using Microsoft.Extensions.Configuration;<br>using Shared.AWS.SecretManagers.Providers;<br><br>namespace Shared.AWS.SecretManagers.ConfigurationSources<br>{<br>        public class AwsSecretsManagerConfigurationSource&lt;T&gt; : IConfigurationSource where T : class<br>        {<br>            private readonly string _region;<br>            private readonly string _secretName;<br>            private readonly string _sectionName;<br><br>            public AwsSecretsManagerConfigurationSource(string region, string secretName, string sectionName = null)<br>            {<br>                _region = region;<br>                _secretName = secretName;<br>                _sectionName = sectionName;<br>            }<br><br>            public IConfigurationProvider Build(IConfigurationBuilder builder)<br>            {<br>                return new AwsSecretsManagerConfigurationProvider&lt;T&gt;(_region, _secretName, _sectionName);<br>            }<br>        }<br>}</pre><p><strong>Extensions/AwsSecretManagerExtension.cs</strong></p><pre>using Amazon.S3;<br>using Microsoft.Extensions.Configuration;<br>using Shared.AWS.SecretManagers.ConfigurationSources;<br>using System;<br>using System.Collections.Generic;<br>using System.Linq;<br>using System.Runtime.CompilerServices;<br>using System.Text;<br>using System.Threading.Tasks;<br><br>namespace Shared.AWS.SecretManagers.Extensions<br>{<br>    public static class AwsSecretsManagerExtensions<br>    {<br>        public static IConfigurationBuilder AddAwsSecretsManager&lt;T&gt;(<br>            this IConfigurationBuilder builder,<br>            string region,<br>            string secretName,<br>            string sectionName = null) where T : class<br>        {<br>            return builder.Add(new AwsSecretsManagerConfigurationSource&lt;T&gt;(region, secretName, sectionName));<br>        }<br>        public static IConfigurationBuilder AddAwsSecretsManager(<br>            this IConfigurationBuilder builder,<br>            string region,<br>            string secretName)<br>        {<br>            return builder.Add(new AwsSecretsManagerConfigurationSource&lt;Dictionary&lt;string, string&gt;&gt;(region, secretName));<br>        }<br>    }<br>}</pre><p><strong>Models/ConnectionStrings.cs</strong></p><pre>namespace Shared.AWS.SecretManagers.Model<br>{<br>    public class ConnectionStrings<br>    {<br>        public string CatalogueDB { get; set; }<br>        public string RedisConnection { get; set; }<br>    }<br>}</pre><p><strong>Providers/AwsSecretsManagerConfigurationProvider.cs</strong></p><p>AWS Secrets Manager’daki verileri .NET uygulamasında kullanabilmek için temel bir <strong>provider’dır</strong>. Generik tipi sayesinde secret’lar tip güvenli bir şekilde deserialize edilir; eğer T tipi Dictionary&lt;string, string&gt; ise JSON doğrudan key-value formatında işlenir, aksi takdirde FlattenObject metodu ile nested yapılar düz key-value çiftlerine dönüştürülür. Load() metodu, GetSecret() aracılığıyla AWS Secrets Manager’a istek gönderir ve verileri çeker; hem string hem de binary format desteklenir. Bu sayede hassas bilgiler hard-code edilmeden, güvenli ve kolay erişilebilir hale gelir.</p><pre>using Amazon;<br>using Amazon.SecretsManager;<br>using Amazon.SecretsManager.Model;<br>using Microsoft.Extensions.Configuration;<br>using System.Text;<br>using System.Text.Json;<br><br>namespace Shared.AWS.SecretManagers.Providers<br>{<br>    public class AwsSecretsManagerConfigurationProvider&lt;T&gt; : ConfigurationProvider where T : class<br>    {<br>        private readonly string _region;<br>        private readonly string _secretName;<br>        private readonly string _sectionName;<br><br>        public AwsSecretsManagerConfigurationProvider(string region, string secretName, string sectionName = null)<br>        {<br>            _region = region;<br>            _secretName = secretName;<br>            _sectionName = sectionName;<br>        }<br><br>        public override void Load()<br>        {<br>            try<br>            {<br>                var secretString = GetSecret();<br><br>                if (string.IsNullOrWhiteSpace(secretString))<br>                {<br>                    Console.WriteLine(&quot;Secret is empty or null&quot;);<br>                    return;<br>                }<br><br>                // Generic tip Dictionary&lt;string, string&gt; ise direkt deserialize et<br>                if (typeof(T) == typeof(Dictionary&lt;string, string&gt;))<br>                {<br>                    var secrets = JsonSerializer.Deserialize&lt;Dictionary&lt;string, string&gt;&gt;(secretString);<br>                    if (secrets != null)<br>                    {<br>                        Data = secrets.ToDictionary(<br>                            kvp =&gt; kvp.Key.Replace(&quot;__&quot;, ConfigurationPath.KeyDelimiter),<br>                            kvp =&gt; kvp.Value,<br>                            StringComparer.OrdinalIgnoreCase<br>                        );<br>                    }<br>                }<br>                // Strongly-typed object ise flatten et<br>                else<br>                {<br>                    var configObject = JsonSerializer.Deserialize&lt;T&gt;(secretString);<br>                    if (configObject != null)<br>                    {<br>                        Data = FlattenObject(configObject, _sectionName);<br>                    }<br>                }<br>            }<br>            catch (JsonException jsonEx)<br>            {<br>                Console.WriteLine($&quot;JSON Deserialization error: {jsonEx.Message}&quot;);<br>                throw;<br>            }<br>            catch (Exception ex)<br>            {<br>                Console.WriteLine($&quot;Error loading AWS secret: {ex.Message}&quot;);<br>                throw;<br>            }<br>        }<br><br>        private Dictionary&lt;string, string&gt; FlattenObject(object obj, string prefix = null)<br>        {<br>            var result = new Dictionary&lt;string, string&gt;(StringComparer.OrdinalIgnoreCase);<br>            FlattenObjectRecursive(obj, prefix, result);<br>            return result;<br>        }<br><br>        private void FlattenObjectRecursive(object obj, string prefix, Dictionary&lt;string, string&gt; result)<br>        {<br>            if (obj == null) return;<br><br>            var properties = obj.GetType().GetProperties();<br><br>            foreach (var property in properties)<br>            {<br>                var value = property.GetValue(obj);<br>                var key = string.IsNullOrEmpty(prefix)<br>                    ? property.Name<br>                    : $&quot;{prefix}{ConfigurationPath.KeyDelimiter}{property.Name}&quot;;<br><br>                if (value == null)<br>                {<br>                    result[key] = null;<br>                }<br>                else if (value is string || value.GetType().IsPrimitive || value.GetType().IsEnum)<br>                {<br>                    result[key] = value.ToString();<br>                }<br>                else if (value is Dictionary&lt;string, string&gt; dict)<br>                {<br>                    foreach (var kvp in dict)<br>                    {<br>                        result[$&quot;{key}{ConfigurationPath.KeyDelimiter}{kvp.Key}&quot;] = kvp.Value;<br>                    }<br>                }<br>                else if (value.GetType().IsClass)<br>                {<br>                    FlattenObjectRecursive(value, key, result);<br>                }<br>            }<br>        }<br><br>        private string GetSecret()<br>        {<br>            var request = new GetSecretValueRequest<br>            {<br>                SecretId = _secretName,<br>                VersionStage = &quot;AWSCURRENT&quot; //VARSAYILAN<br>            };<br><br>            var regionEndpoint = RegionEndpoint.GetBySystemName(_region);<br><br>            using (var secretsManagerClient = new AmazonSecretsManagerClient(regionEndpoint))<br>            {<br>                var response = secretsManagerClient.GetSecretValueAsync(request).Result;<br><br>                if (response.SecretString != null)<br>                {<br>                    return response.SecretString;<br>                }<br>                else<br>                {<br>                    using var memoryStream = response.SecretBinary;<br>                    using var reader = new StreamReader(memoryStream);<br>                    return Encoding.UTF8.GetString(Convert.FromBase64String(reader.ReadToEnd()));<br>                }<br>            }<br>        }<br>    }<br>}</pre><p>Artık altyapımız hazır. Şimdi, Program.cs yapılandırmasını yapalım.</p><p><strong>Program.cs</strong></p><pre>builder.Services.AddDefaultAWSOptions(builder.Configuration.GetAWSOptions());<br>builder.Services.AddAWSService&lt;IAmazonS3&gt;();<br>builder.Configuration.AddAwsSecretsManager&lt;ApplicationSettings&gt;(<br>    region: &quot;eu-central-1&quot;, //Dikkat! AWS Region doğru olduğundan emin olunuz.<br>    secretName: &quot;ApplicationSettings&quot; // AWS üzerinde oluşturulan SecretName değeridir.<br>);<br>//DI<br>builder.Services.Configure&lt;ApplicationSettings&gt;(builder.Configuration);</pre><p><strong>Controller Örneği</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*jujUdqSuM-7mbJhNSm7-lw.png" /></figure><pre> [HttpGet(&quot;connection-string&quot;)]<br> public async Task&lt;IActionResult&gt; ReadDatabaseConnectionString()<br> {<br>     return Ok(new<br>     {<br>         catalogueDb = _applicationSettings.ConnectionStrings.CatalogueDB,<br>         redisConnection = _applicationSettings.ConnectionStrings.RedisConnection<br>     });<br> }</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BfSsm9qRM9RjFJSa_GTACQ.png" /></figure><h4>Kurulması Gereken NuGet Paketleri</h4><ul><li><a href="https://www.nuget.org/packages/AWSSDK.Core/4.0.3.9?_src=template">https://www.nuget.org/packages/AWSSDK.Core/4.0.3.9?_src=template</a></li><li><a href="https://www.nuget.org/packages/AWSSDK.SecretsManager/4.0.4.4?_src=template">https://www.nuget.org/packages/AWSSDK.SecretsManager/4.0.4.4?_src=template</a></li><li><a href="https://www.nuget.org/packages/AWSSDK.Extensions.NETCore.Setup/4.0.3.20?_src=template">https://www.nuget.org/packages/AWSSDK.Extensions.NETCore.Setup/4.0.3.20?_src=template</a></li></ul><h4>Son Söz</h4><p>Bu yazıda, AWS Secrets Manager kullanarak uygulamalarımızın hassas verilerini nasıl güvenli bir şekilde depolayabileceğimizi gördük ve ASP.NET Core ile AWS SDK entegrasyonunu adım adım inceledik. Artık ihtiyaç duyduğumuz her an AWS’nin sunduğu bu güçlü servisi rahatlıkla kullanabiliriz. 🙂</p><p>Umarım faydalı olmuştur. Bir sonraki yazıda yeni konularla tekrar buluşmak üzere…<br>Herkese iyi çalışmalar!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=24a3be7cc1df" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Barlas Geliştirme Günlükleri#2]]></title>
            <link>https://medium.com/@basrioglumehmet/barlas-geli%C5%9Ftirme-g%C3%BCnl%C3%BCkleri-2-96edb482bfda?source=rss-cb4f2f54355f------2</link>
            <guid isPermaLink="false">https://medium.com/p/96edb482bfda</guid>
            <category><![CDATA[yerli-ve-milli]]></category>
            <category><![CDATA[nextjs]]></category>
            <category><![CDATA[headless-cms]]></category>
            <category><![CDATA[cms]]></category>
            <category><![CDATA[barlas]]></category>
            <dc:creator><![CDATA[Mehmet Basrioglu]]></dc:creator>
            <pubDate>Thu, 08 Jan 2026 12:44:13 GMT</pubDate>
            <atom:updated>2026-01-08T14:53:31.063Z</atom:updated>
            <content:encoded><![CDATA[<p>Selamlar 👋<br>Bu yazı serisinde sizlerle birlikte Barlas’ın geliştirme sürecini, mimari kararlarını ve zaman içinde geçirdiği evrimi paylaşmaya devam edeceğim. İlk yazıda ise en temel yerden başlamıştık. Şimdi ise biraz daha işin mutfağına geçiş yapıyor olacağız.</p><h3>Mimariyi Tasarlarken Çıkış Noktası</h3><p>Barlas’ı geliştirirken en başta kendime şu soruyu sordum:</p><blockquote>“Günümüz CMS teknolojilerinden ne bekliyoruz ?”</blockquote><p>Bu sorunun cevabı genellikle şunlar oldu:</p><ul><li>SEO uyumluluğu</li><li>Yüksek performans</li><li>Ölçeklenebilirlik</li><li>Geliştirici dostu bir altyapı</li><li>Modern front-end teknolojileriyle uyum</li></ul><p>Bu ihtiyaçlar doğrultusunda mimari kararlar şekillenmeye başladı.</p><h3>Neden Next.js ?</h3><p>Barlas’ın temelinde Next.js bulunmasının sebebi, sunduğu esneklik ve modern web gereksinimlerine doğrudan cevap verebilmesi.</p><p>Next.js sayesinde:</p><ul><li>SSR (Server Side Rendering) ile SEO dostu sayfalar</li><li>SSG (Static Site Generation) ile yüksek performans</li><li>API Routes ile backend ihtiyaçlarının karşılanması</li><li>Dosya tabanlı routing ile sade bir yapı</li></ul><p>tek bir çatı altında toplanabiliyor. Bu da Barlas’ın hem headless CMS yaklaşımına yakın durmasını hem de klasik CMS’lerin güçlü yönlerini bir araya getirmesini sağlıyor.</p><h3>Klasik CMS Yaklaşımlarından Barlasın Farkı</h3><p>Barlas, “tema + eklenti” mantığından ziyade, projeye özel mimariler kurulmasını teşvik eder. Bu da onu:</p><ul><li>Daha esnek</li><li>Daha performanslı</li><li>Daha uzun ömürlü</li></ul><p>bir CMS hâline getirir.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*PUiec6d0esmmWpIG6a6Zag.png" /></figure><h3>Bonus</h3><p>Tema altyapısının nasıl çalıştığına dair ufak bir gösterim.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/1*IlZnBMX4dGyHKMbVh3T9JA.gif" /></figure><h3>Sonuç</h3><p>Barlas’ın mimarisi, bugünün değil yarının web projeleri düşünülerek tasarlandı. Next.js seçimi, modüler yapı ve geliştirici odaklı yaklaşım; bu vizyonun doğal bir sonucu.</p><p><strong>Okuduğunuz için teşekkürler 🙌<br>Bir sonraki günlükte görüşmek üzere 🚀</strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=96edb482bfda" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Barlas Geliştirme Günlükleri #1]]></title>
            <link>https://medium.com/@basrioglumehmet/barlas-geli%C5%9Ftirme-g%C3%BCnl%C3%BCkleri-1-bfe7cbb8adbc?source=rss-cb4f2f54355f------2</link>
            <guid isPermaLink="false">https://medium.com/p/bfe7cbb8adbc</guid>
            <category><![CDATA[açık-kaynak]]></category>
            <category><![CDATA[yerli-ve-milli]]></category>
            <category><![CDATA[nextjs]]></category>
            <category><![CDATA[open-source]]></category>
            <category><![CDATA[cms]]></category>
            <dc:creator><![CDATA[Mehmet Basrioglu]]></dc:creator>
            <pubDate>Wed, 07 Jan 2026 10:52:44 GMT</pubDate>
            <atom:updated>2026-01-07T10:52:44.426Z</atom:updated>
            <content:encoded><![CDATA[<p>Selamlar 👋<br>Bu yazı serisinde sizlerle birlikte Barlas’ın geliştirme sürecini, mimari kararlarını ve zaman içinde geçirdiği evrimi paylaşacağım. İlk yazıda ise en temel yerden başlamak istiyorum: Barlas nedir ve ne değildir?</p><h3>Barlas</h3><p>Barlas, Türkiye’de geliştirilen yerli ve milli bir Content Management System (CMS)’tir. Temel amacı; modern web projeleri için hızlı, ölçeklenebilir, geliştirici dostu ve wordpress alternatifi bir içerik yönetim altyapısı sunmaktır.</p><p>Barlas’ın altyapısı Next.js üzerine inşa edilmiştir. Bu sayede:</p><ul><li>Sunucu tarafı ve istemci tarafı render seçenekleri</li><li>Self Hosting</li><li>Yüksek performans</li><li>Seo Uyumluluğu</li><li>Modern Frontend Ekosistemi</li><li>Plugin Sistemi</li><li>No-Code Tema Sistemi</li><li>Development Ready State Yönetim Sistemi</li></ul><p>gibi avantajları doğal olarak beraberinde getirir.</p><p>Barlas, klasik CMS yaklaşımlarının ötesine geçerek daha esnek, daha modüler ve günümüz web standartlarına uygun bir yapı sunmayı hedefliyor.</p><h3>Barlas Ne Değildir?</h3><p>Barlas;</p><ul><li>Kapalı Sistem değildir</li><li>Sadece “hazır tema + içerik” mantığıyla çalışan bir yapı değildir</li><li>Geliştiriciyi kısıtlayan, özelleştirmesi zor bir CMS hiç değildir</li><li>Geliştiriciler lisans satın alımına muhtaç değildir</li></ul><p>Aksine, Barlas geliştiricinin kontrolünü ön planda tutar ve projeye göre şekillenebilen özgür bir yapı sunmaktadır.</p><h3><strong>Bu Seride Neler Olacak?</strong></h3><p>Bu günlüklerde;</p><ul><li>Mimari kararlar</li><li>Next.js üzerinde CMS geliştirme deneyimleri</li><li>Karşılaşılan problemler ve çözümleri</li><li>Performans, güvenlik ve ölçeklenebilirlik konuları</li></ul><p>gibi birçok detayı şeffaf bir şekilde paylaşmayı planlıyorum.</p><h3>Ekran Görüntüsü</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*avWJFkRjwXl0ANnhsG-xtA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*s7YeYHcJbRGGZVyi7MkEUw.png" /></figure><h3>Hedefler</h3><p>Barlas’ın geliştirme sürecinde yalnızca teknik yeterlilikler değil, aynı zamanda topluluk, ekosistem ve yerli yazılım bilinci de önemli bir yer tutuyor. Bu nedenle erken dönem hedefleri belirlerken, ürünün geleceğini şekillendirecek stratejik adımlara odaklandım.</p><h4>Vercel Community ile İletişim ve Aksiyonlar</h4><p>Barlas’ın altyapısında Next.js bulunması, doğal olarak Vercel ekosistemiyle güçlü bir bağ kurulmasını gerektiriyor. Bu kapsamda erken dönem hedeflerimden biri, Vercel Community ile doğrudan iletişime geçmek ve bu doğrultuda çeşitli aksiyonlar almak.</p><p>Bu aksiyonlar arasında:</p><ul><li>Projenin Vercel topluluğuna tanıtılması</li><li>Teknik geri bildirimlerin toplanması</li><li>Open-source katkı süreçlerinin değerlendirilmesi</li><li>Olası iş birlikleri ve görünürlük fırsatları</li></ul><p>yer alıyor. Amaç, Barlas’ı yalnızca yerel ölçekte değil, küresel ölçekte de bilinir ve takip edilir bir proje hâline getirmek.</p><h4>Yerli ve Özgür Yazılımın Benimsenmesini Sağlamak</h4><p>Barlas’ın en temel motivasyonlarından biri, yerli ve özgür yazılım kültürünün yaygınlaşmasına katkıda bulunmak. Türkiye’de geliştirilen projelerin yalnızca tüketilen değil, aynı zamanda üreten, katkı sağlayan ve sürdürülebilir yapılar hâline gelmesi gerektiğine inanıyorum.</p><p>Bu doğrultuda Barlas:</p><ul><li>Açık kaynak felsefesini benimser</li><li>Geliştiricilerin projeye katkı sağlamasını teşvik eder</li><li>Yerli yazılım ekosistemine örnek bir CMS olmak hedefler arasındadır</li></ul><p>Barlas’ın sadece bir ürün değil, aynı zamanda bir <strong>topluluk projesi</strong> olması bu vizyonun doğal bir sonucudur.</p><p>Bir sonraki yazıda Barlas’ın mimari yapısına ve neden bu teknolojilerin seçildiğine daha derinlemesine gireceğiz.</p><p><strong>Okuduğunuz için teşekkürler 🙌<br>Görüşmek üzere!</strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=bfe7cbb8adbc" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[OpenTelemetry Giriş]]></title>
            <link>https://medium.com/@basrioglumehmet/opentelemetry-giri%C5%9F-da4399963dd9?source=rss-cb4f2f54355f------2</link>
            <guid isPermaLink="false">https://medium.com/p/da4399963dd9</guid>
            <category><![CDATA[monitoring]]></category>
            <category><![CDATA[opentelemetry]]></category>
            <dc:creator><![CDATA[Mehmet Basrioglu]]></dc:creator>
            <pubDate>Sat, 03 Jan 2026 08:26:29 GMT</pubDate>
            <atom:updated>2026-01-03T08:26:29.662Z</atom:updated>
            <content:encoded><![CDATA[<p>OpenTelemetry, genellikle junior veya başlangıç seviyelerinde çok sık karşılaşılan bir konu değildir; yazılımda ilerledikçe daha fazla önem kazanır. En temel seviyede loglama kullanılırken, daha ileri aşamalarda metrikler ve distributed tracing devreye girer. Telemetry sayesinde; hangi verilerin gönderildiği, işlemlerin ne kadar sürede tamamlandığı ve hangi hataların alındığı gibi bilgiler izlenebilir. Bu gözlemler loglar, metrikler ve tracing aracılığıyla yapılır.</p><h3>Instrumentation</h3><p>Instrumentation, bir uygulamanın çalışması sırasında telemetri verisi (log, metric, trace) üretmesini sağlamak için koda eklenen ölçüm noktalarıdır. Telemetry verisi nedir sorusunun cevabına aşağıda değinmiş olacağım.</p><h3>Telemetry Data</h3><p>Telemetri verileri, uygulamalarınız tarafından oluşturulan tüm günlükleri, ölçümleri, olayları ve izleri kapsamaktadır. Telemetre verileri üç ana başlıktan toplanmaktadır.</p><p><strong>Log:</strong> Zaman damgalı metin kayıtlarıdır.</p><p><strong>Metrik: </strong>Uygulamanın davranışını sayısal (numerik) olarak zaman içinde izlememizi sağlar(performans vb.).</p><p><strong>Tracing: </strong>Tek bir isteğin (request) sistem içindeki uçtan uca yolculuğunu detaylı şekilde izlemeyi sağlar.</p><ul><li>Arada bir verilerin temizlenmesi şarttır bellek şişmesi yaşansın istenmez.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*5uDBjT22SGnHuz452sZL9Q.png" /></figure><h3>Open Telemetry Collector</h3><p>Open Telemetry Collector, Verileri alır, Jaeger veya Prometheus gibi monitoring toollara gönderen bir proxy’dir. Verileri yönetmek için sorumluluğu üstlenir.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/0*a4J9yTl6StE_-HL0.png" /></figure><p>Open Telemetry Collector’ün üç ana bileşeni vardır:</p><ol><li><strong>Receiver: </strong>Verilerin toplayıcıya gelmesini sağlar. Birden çok veri kaynağından gelen verileri alır.</li><li><strong>Processor: </strong>Verilerin ilgili monitoring toollara gönderilmeden önce manipüle edebilmemizi sağlar.</li><li><strong>Exporter:</strong> Telemetri verilerini OTLP, Prometheus veya Jaeger gibi monitrong toollara gönderir.</li></ol><h3>Open Telemetry Protocol</h3><p>Open Telemetry Protocol(OTLP), telemetri verilerini aktarmak için kullanılan bir protokoldür. İki çeşit desteklenen protokol vardır:</p><ol><li>OTLP/HTTP(protobuf)</li><li>gRPC</li></ol><p>Open Telemetry Protocol(OTLP), telemetri verilerini seri hale getirmek için Protocol Buffers(Protobuf) ve verileri göndermek için gRPC veya HTTP’yi kullanır.</p><p>Bir sonraki makalede görüşmek üzere…</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=da4399963dd9" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>