<?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 Serkan Eren on Medium]]></title>
        <description><![CDATA[Stories by Serkan Eren on Medium]]></description>
        <link>https://medium.com/@serkaneren_77558?source=rss-8867a5548445------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/0*lFGAGh6r5DKI2FHv.</url>
            <title>Stories by Serkan Eren on Medium</title>
            <link>https://medium.com/@serkaneren_77558?source=rss-8867a5548445------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 15 Nov 2026 17:24:11 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@serkaneren_77558/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[Kafka Streams Giriş]]></title>
            <link>https://medium.com/devopsturkiye/kafka-streams-giri%C5%9F-434af6eaca50?source=rss-8867a5548445------2</link>
            <guid isPermaLink="false">https://medium.com/p/434af6eaca50</guid>
            <category><![CDATA[apache-kafka-streams]]></category>
            <category><![CDATA[kafka-streams]]></category>
            <category><![CDATA[apache-kafka]]></category>
            <category><![CDATA[kafka]]></category>
            <category><![CDATA[stream-processing]]></category>
            <dc:creator><![CDATA[Serkan Eren]]></dc:creator>
            <pubDate>Mon, 30 Dec 2019 19:19:54 GMT</pubDate>
            <atom:updated>2019-12-30T19:27:52.055Z</atom:updated>
            <content:encoded><![CDATA[<p><a href="https://medium.com/devopsturkiye/apache-kafkaya-giri%C5%9F-3399e5f33f8e">Önceki yazımda</a> Apache Kafka ile ilgili temel kavramları açıklamıştım. Bu yazıda Apache Kafka Streams API’a giriş yapacağız. Nedir, ne amaçla kullanılır, temel özelliklerini inceleyeceğiz.</p><h3><strong>Kafka Streams nedir, ne amaçla kullanılır?</strong></h3><p>Kafka Streams, Kafka’da depolanan verilerin anlık olarak işlenmesi ve analiz edilmesi için geliştirilmiş bir client kütüphanesidir. Girdi ve çıktı verilerinin Kafka’da saklandığı, ölçeklenebilir, esnek, hataya dayanıklı, dağıtık uygulamalar ve mikro servisler geliştirmek için kullanılır. Kafka Streams API, temel işinize güç katacak gerçek zamanlı uygulamalar oluşturmanıza imkan tanır. Akan veri üzerinden hesaplamalar yapmamızı sağlar. Arkasındaki Kafka Cluster ile entegre çalışır.</p><p>Günümüzde stream processing talebi her geçen gün artmaktadır. Bunun arkasındaki temel neden, yalnızca hacimli verilerin işlenmesinin yeterli olmaması, verilerin daha hızlı işlenmesi, analiz edilmesi ve gerçek zamanlı olarak verilerle ilgili değer üretilmesinin çok önemli olması, böylece kuruluşun değişen iş koşullarına gerçek zamanlı olarak tepki verebilmesidir.</p><p>Kafka Streams API için kullanım örnekleri:</p><ul><li>Finans sektöründe farklı veri kaynaklarının birleştirilerek potansiyel risklerin gerçek zamanlı görülmesi, fraud işlemlerin tespiti ve azaltılması amacıyla kullanılabilir.</li><li>Seyahat şirketleri, bireysel müşteriler için en uygun fiyatı bulmak, ek hizmetlerin çapraz satışı, rezervasyon ve rezervasyonları işlemek gibi gerçek zamanlı karar verecek uygulamaları Kafka Streams API ile geliştirebilir.</li><li>Lojistik şirketleri gönderilerini hızlı, güvenilir ve gerçek zamanlı izlemek için uygulamalar geliştirebilir.</li><li>Perakendeciler bir sonraki en iyi teklife, kişiselleştirilmiş promosyonlara, fiyatlandırma ve envanter yönetimine gerçek zamanlı olarak karar vermek için kullanabilir.</li><li>Otomotiv ve imalat şirketleri, üretim hatlarının en iyi şekilde çalışmasını sağlamak, tedarik zincirlerine gerçek zamanlı bilgi sağlamak için uygulamalar geliştirebilir.</li></ul><p>Kafka Streams API’sinin en önemli özelliklerinden bir tanesi de, onunla oluşturduğunuz uygulamaların normal Java uygulamaları olmasıdır. Bu uygulamalar, benzer amaçla kullanılan ayrı cluster sunucular (Spark vs) veya pahalı altyapı kurmaya gerek kalmadan, diğer uygulamalar gibi paketlenebilir, dağıtılabilir ve izlenebilir.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/961/1*c9v2e0i9eYK8fFTLAKeLng.png" /></figure><p>Kafka Streams, büyük veri özelinde olan Stream Processing (akan veri üzerinden işlem yapma) kavramını uygulama geliştirme dünyasına taşıyarak bu işlemlerin basit ve kolay yapılmasını sağlamıştır. Küçük veya büyük ölçekli stream processing ihtiyaçlarınız için Kafka Streams API kullanarak normal Java uygulamaları geliştirebilir, bu uygulamaları Kafka cluster sunucuları çevresinde client makinelerde koşturabilirsiniz.</p><ul><li>Geliştireceğiniz uygulamalar esnektir: Uygulamanızı tek veya cluster olacak şekilde çalıştırabilirsiniz, bunlar birbirlerini otomatik olarak keşfedecek ve verileri birlikte işleyecektir.</li><li>Geliştireceğiniz uygulamalarınız ayrıca hataya da dayanıklıdır: Uygulama örneklerinden biri ölürse, herhangi bir veri kaybı olmadan kalan örnekler otomatik olarak işini üstlenecektir.</li></ul><h3>Temel Özellikleri</h3><p>Aşağıdaki listede Kafka Streams API’ın bazı temel özellikleri ve yönleri vurgulanmaktadır.</p><h4>Güçlü</h4><ul><li>Uygulamalarınızı yüksek ölçeklenebilir, elastik, dağıtılmış, hataya dayanıklı hale getirir</li><li>Exactly Once Processing (tam olarak bir kez işleme) semantiğini destekler</li><li>Stateful processing (window, aggregation işlemleri vs) ve stateless processing (veriyi zenginleştirme, veri transformasyonu vs)</li><li>Windowing, joins, aggregations ile event-time processing</li><li>Streams ve veritabanlarının dünyalarını birleştirmek için Interactive Queries (Etkileşimli Sorguları) destekler</li><li>Basit declarative functional API yada alt seviye imperative API</li></ul><h4>Lightweight (Hafif)</h4><ul><li>Kolay başlangıç</li><li>Küçük, orta, büyük ve çok büyük kullanım durumları için eşit derecede uygulanabilir</li><li>Local geliştirmeden üretime sorunsuz bir geçiş</li><li>Cluster processing sunucuları gerektirmez</li><li>Kafka harici bir bağımlılığı yoktur</li></ul><h4>Tamamen entegre</h4><ul><li>Kafka 0.11+ ile %100 uyumlu</li><li>Mevcut uygulama ve mikro servislere kolaylıkla entegre olabilme</li><li>Uygulamalarınızı paketleme, dağıtma ve izleme için yapay kurallar yoktur</li><li>Her yerde çalışır: şirket içi, genel bulutlar, özel bulutlar, konteynerler, vb.</li><li>Kafka Connect tarafından gerçekleştirilen sürekli değişiklik veri yakalama yöntemi (CDC) ile veritabanlarıyla bütünleşir</li></ul><h4>Gerçek Zamanlı</h4><ul><li>Milisaniye işleme gecikmesi</li><li>Her seferinde bir kayıt işleme (mikro batching yok)</li><li>Geç gelen ve sırası dışındaki verileri sorunsuz bir şekilde işler</li><li>Yüksek throughput</li></ul><h4>Güvenli</h4><ul><li>Aktarılan verilerin şifrelenmesini destekler</li><li>Kimlik doğrulama ve yetkilendirmeyi destekler</li></ul><p>Özetle, Kafka Streams API aşağıdaki durumlarda alternatiflerine (Spark, Storm vs) göre ideal çözüm olarak düşünülebilir.</p><ul><li>Stream processing uygulamamız kafka’dan kafka’ya pipeline oluşturuyorsa</li><li>Stream processing amacıyla ayrıca cluster yapılar kurmak istenmiyorsa</li><li>Akan veri üzerinde filtreleme, joins, aggregations, veri zenginleştirme gibi basit stream processing fonksiyonları gerçekleştirilmek isteniyorsa</li><li>Hedef kullanıcılar java geçmişleri olan geliştiricilerse</li></ul><p>Bir sonraki yazıda da temel kavramlarını ve mimarisini anlatmayı planlıyorum.</p><p>Kaynaklar:</p><p><a href="https://docs.confluent.io/current/">https://docs.confluent.io/</a></p><p><a href="https://kafka.apache.org/">https://kafka.apache.org/</a></p><p>Apache Kafka ile ilgili önceki yazılarım:</p><ul><li><a href="https://medium.com/devopsturkiye/apache-kafkaya-giri%C5%9F-3399e5f33f8e">Apache Kafka’ya Giriş</a></li><li><a href="https://medium.com/devopsturkiye/apache-kafkaya-giri%C5%9F-2-9455e45d4c0f">Apache Kafka’ya Giriş -2</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=434af6eaca50" width="1" height="1" alt=""><hr><p><a href="https://medium.com/devopsturkiye/kafka-streams-giri%C5%9F-434af6eaca50">Kafka Streams Giriş</a> was originally published in <a href="https://medium.com/devopsturkiye">Devops &amp; AI Türkiye☁️ 🐧 🐳 ☸️</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Apache Kafka’ya Giriş -2]]></title>
            <link>https://medium.com/devopsturkiye/apache-kafkaya-giri%C5%9F-2-9455e45d4c0f?source=rss-8867a5548445------2</link>
            <guid isPermaLink="false">https://medium.com/p/9455e45d4c0f</guid>
            <category><![CDATA[apache]]></category>
            <category><![CDATA[türkçe]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[kafka]]></category>
            <dc:creator><![CDATA[Serkan Eren]]></dc:creator>
            <pubDate>Mon, 06 May 2019 01:48:49 GMT</pubDate>
            <atom:updated>2019-05-17T13:51:52.117Z</atom:updated>
            <content:encoded><![CDATA[<h3>Apache Kafka’ya Giriş — 2</h3><p><a href="https://medium.com/devopsturkiye/apache-kafkaya-giri%C5%9F-3399e5f33f8e">“Apache Kafka’ya Giriş</a>” yazımızın ilk bölümünde broker, topic, partition, offsets, producer, consumer ve consumer group kavramlarını açıklamıştık.</p><h4><strong>Consumer Offsets</strong></h4><p>Kafka, consumer offset bilgilerini “__consumer_offsets” topic içerisinde tutar. Consumer, Kafka topic’ten mesajı okur, mesajı işler ve mesajın offset değerini “__consumer_offsets” topic’ine yazar. Offset bilgilerininin topic’e yazılma işlemi consumer tarafından otomatik yapılır yada programlanabilir. Bir consumer kaybedilse bile, tekrar ayağa kalktığında “__consumer_offsets” içerisinde en son hangi mesajı okuduğu kayıtlı olduğu için kaldığı yerden devam edebilir.</p><h4>Message Delivery Semantics</h4><p>Consumer’ların offset bilgilerini ne zaman yazacağına göre değişen, Kafka tarafından sağlanan 3 farklı mesaj teslim garantisi vardır.</p><p><strong>At most once: </strong>Offset bilgisi mesaj alınır alınmaz yazılır. Mesaj, işlenmesi sırasında bir hata oluşursa kaybedilir. En performanslı ama mesaj kaybı söz konusu olabileceği için pek tercih edilen bir yöntem değildir.</p><p><strong>At least once: </strong>Offset bilgisi mesaj işlendikten sonra yazılır. Mesaj, işlenmesi sırasında bir hata oluşursa tekrar okunur. Mesaj kaybı oluşmaz ama birden fazla mesajları okuma olasılığı vardır. Bu nedenle mesaj işleme sürecimiz idempotent olmalıdır yani duplike durumlarında sistemimiz etkilenmemelidir. En çok tercih edilen yöntemdir.</p><p><strong>Exactly once: </strong>Bu model sadece Kafka - Kafka arasındaki iş akışlarında Kafka Streams API ile sağlanıyor. Mesaj, Kafka topic’ler arasında transfer olurken ve işlenirken transactional producer ve consumer kullanılıyor.</p><h4><strong>Kafka Broker Discovery</strong></h4><p>Yazımızın ilk bölümünde, producer ve comsumer’lar için cluster içerisindeki hangi broker’a yazacağını veya hangi broker’dan okuyucağını bildiklerini belirtmiştik. Cluster içerisindeki her Kafka broker aslında bir “Bootstrap Server” dır. Diğer broker, topic ve partition bilgilerini bilir ve bir consumer veya producer kendisine bağlandığında bu bilgileri paylaşır. Bu bilgiler metadata olarak adlandırılır. Yani, bir Kafka broker’a bağlanmak tüm Kafka cluster’ına bağlanmak anlamına gelir.</p><h4><strong>Zookeeper</strong></h4><p>Kafka broker’larını yönetir. Topic partition’ları için broker lider seçiminine yardımcı olur. Yeni bir broker ayağa kalktığında veya düştüğünde, topic oluşturulduğunda veya silindiğinde, Zookeeper Kafka broker’lara bildirim gönderir. Kafka, ayağa kalkmak için Zookeeper’a ihtiyaç duyar. Bu nedenle önce Zookeeper, sonra Kafka broker ayağa kaldırılır. Kural olarak cluster içerisindeki Zookeeper sayısı tek sayı olmalıdır. Bir lider ve takipçileri vardır. Kafka, cluster içerisindeki herhangi bir Zookeeper’a bağlanması yeterlidir.</p><h4>Kafka neleri garanti ediyor?</h4><p>Mesajlar, topic partition’a gönderildiği sırada eklenir.</p><p>Consumer’lar, mesajları topic partition’dan saklandığı sırada okur.</p><p>Kafka, replication factor N parametresi ile ayağa kaldırıldı ise, producer ve consumer’lar N-1 Kafka broker’a kalana kadar çalışmaya devam ederler. Replication factor için 3 uygun bir seçenek olacaktır. Bir Kafka broker bakım için, bir broker beklenmedik bir hata durumu kapsamında ayakta olmayabilir. Bu durumda tek bir Kafka broker ile o topic işlemleri devam ediyor olacaktır.</p><p>Aynı mesaj anahtarına sahip kayıtlar, aynı topic partition’a yazılır.</p><p>Kaynak:</p><ol><li><a href="https://kafka.apache.org/">https://kafka.apache.org/</a></li></ol><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9455e45d4c0f" width="1" height="1" alt=""><hr><p><a href="https://medium.com/devopsturkiye/apache-kafkaya-giri%C5%9F-2-9455e45d4c0f">Apache Kafka’ya Giriş -2</a> was originally published in <a href="https://medium.com/devopsturkiye">Devops &amp; AI Türkiye☁️ 🐧 🐳 ☸️</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Apache Kafka’ya Giriş]]></title>
            <link>https://medium.com/devopsturkiye/apache-kafkaya-giri%C5%9F-3399e5f33f8e?source=rss-8867a5548445------2</link>
            <guid isPermaLink="false">https://medium.com/p/3399e5f33f8e</guid>
            <category><![CDATA[confluent]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[türkçe]]></category>
            <category><![CDATA[kafka]]></category>
            <category><![CDATA[apache]]></category>
            <dc:creator><![CDATA[Serkan Eren]]></dc:creator>
            <pubDate>Thu, 03 Jan 2019 05:23:15 GMT</pubDate>
            <atom:updated>2019-05-06T01:50:33.884Z</atom:updated>
            <content:encoded><![CDATA[<p>Bu yazıda dağıtık bir veri akış platformu olan Apache Kafka’nın temel kavramlarını anlatmaya çalışacağım.</p><p><strong>Apache Kafka nedir, ne amaçla kullanılır?</strong></p><p>Sadece bir kaynak sisteminiz ve bir hedef sisteminiz olduğunda, bu sistemler arası veri transferi yapmanız gerektiğinde çözüm basittir. Ancak birçok kaynak, birçok hedef sisteminiz olduğunda ve hepsinin birbirleriyle veri transferi yapması gerektiğinde işler gerçekten karmaşık hale gelecek ve herbir sistemin birbiri ile entegrasyonu gerekecektir. Bu entegrasyonlar . protokol seçimi, verilerin nasıl aktarılacağı (TCP, HTTP, FTP, JDBC, REST, SOAP vb), veri formatı, verilerin nasıl parse edileceği (JSON, CSV, XML, Avro, Thrift vb) gibi birçok zorluğu beraberinde getirir. Bunlara ek olarak bir kaynak sisteme yapılan her entegrasyon o sistem üzerinde ek yük yaratacaktır. Apache Kafka bu sorunları aşmak için doğru çözüm olacaktır. Sistemlerin birbirlerine bağımlıklıklarını ortadan kaldırarak, üzerlerindeki yüklerini de düşürür. Apache Kafka, LinkedIn tarafından geliştirilmiş, şu an Apache yönetiminde açık kaynak olarak çoğunlukla Confluent şirketi tarafından bakımı ve geliştirimi yapılan bir projedir. Dağıtık (distrubuted) bir veri akış (streaming) platformudur. Hataya dayanıklı, yatay olarak ölçeklenebilen, esnek bir mimariye sahiptir. Son derece yüksek performans ile bir sistemden diğer sisteme 10 ms’den az bir gecikme(latency) ile neredeyse gerçek zamanlı olarak veri transferini mümkün kılmaktadır. Mesajlaşma sistemi (messaging system) olabilir, etkinlik takibi(activity tracking) için, uygulama loglarını toplamak için, sağladığı API ile stream processing amacıyla kullanılabilir. Big Data entegrasyonları için kullanılabilir. Gerçek zamanlı öneriler, kararlar ve bilgiler(insights) oluşturmak için kullanılabilir.</p><p>Apache Kafka ile ilgili temel kavramlar:</p><h4><strong>Topics, Partitions, Offsets</strong></h4><p>Topic kullanıcı tanımlı kategori ismidir. Mesajların tutulduğu yerdir. Veritabınındaki tabloya benzer. Kafka içerisinde birçok topic olabilir, isim ile tanımlanırlar. Bir veya birden fazla bölümden(partitions) meydana gelirler. Her partition’ın 0 dan başlayan numaraları vardır. Resimde bir topic üzerinde 3 partitions (0, 1 ve 2) görüyoruz. Mesajlar partition’lara sıralı olarak ve değiştirilemez olarak eklenirler ve artan şekilde bir kimlik değeri alırlar. Bu değere offset denir. Bir mesajın partition ve offset değeri değişmez. Mesaj okuma işleminden sonra kaybolmaz, tekrar erişim mümkündür. Topiclerin bu partition özelliği sayesinde yazma ve okuma işlemleri paralel bir şekilde yapılabilir. Topic’ler oluşturulurken kaç partition olacağı belirlenir, istenirse sonradan da değiştirilebilir. Kafka’da mesajların sırası partition içinde garanti edilir. Yani partition 0 daki 4 nolu offset değerine sahip bir mesaj, partition 0 daki 5 no lu offset değerine sahip mesajdan önce yazılmıştır ve önce okunacaktır, Kafka bunu garanti eder. Partition 1 deki 8 no lu offset değerine sahip mesaj ise daha önce yazılmış olabilir. Partition’lar arası mesaj sırası için garanti verilmez.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/416/1*GoRlq7O8qMNui6tvnq30cg.png" /><figcaption>Topic ve Partition Yapısı</figcaption></figure><p>Kafka’da veriler sadece sınırlı bir süre saklanırlar. Varsayılan olarak 1 hafta. Sonrasında bu veriler ve offset değerleri silinecektir. Topic’e eklenen yeni mesajlar bir kural (anahtar) belirtilmemişse rastgele bir partition’a atanır, her zaman partition’ın sonuna eklenir ve eklendikçe offset sürekli artmaya devam eder, 0 a hicbir zaman dönmez.</p><h4><strong>Brokers</strong></h4><p>Broker, topic ve partition’ları tutan sunuculardır. Birçok broker birlikte kafka cluster’ı oluşturur. Bir broker’a bağlandığınızda, buna “bootstrap broker” denir ve tüm cluster’a bağlanmış olursunuz. Her broker sadece belirli topic partitionlarını içerir. Yani tüm veriyi tutmaz, çünkü Kafka dağıtık bir yapıdadır. 3 broker’dan oluşan bir kafka cluster’a sahip olduğumuzu düşünelim. İsimleri Broker 1, Broker 2 ve Broker 3 olsun. 3 partition’dan oluşan transaction-events isminde bir topic oluşturduğumuzda, herbir broker topic’in bir partition’ını tutacak şekilde dağılım yapılır. transaction-events topic’i 5 partition’dan oluşsaydi 2 broker’a 2 partition, 1 broker a 1 partition tutacak şekilde dağılım yapılırdı.</p><h4><strong>Topic Replication</strong></h4><p>Kafka dağıtık(distrubuted) bir sistemdir, bir broker çökse bile veri kaybı olmaması ve işlemlerin devam ediyor olması gereklidir. Replikasyon bu işi yapar. Replication Factor genellikle 2 yada 3 olarak belirlenir, 2 olarak belirlenmesi biraz risklidir. Aşağıdaki resimdeki gibi 3 broker dan oluşan bir kafka cluster yapımız olduğunu düşünelim. 2 partition’dan oluşan Topic-A’i yaratırken, ayrıca replike olmasını istiyoruz. Bu nedenle replication factor bilgisini 2 olarak set ediyoruz. Partition 0, broker 101 e atanıyor, partition 1 ise broker 102 ye atanıyor. Replication factor 2 olarak set edildiği için partition’ların birer kopyası farklı bir broker üzerinde daha tutulacaktır. Resimdeki gibi bir dağılım oluşacaktır. Broker 102 yi keybettiğimizi düşünelim, bu durumda veriler 101 ve 103 te olduğu için kayıp olmayacak, işlemler devam edecektir.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*sAuwhpbIx3lfr_FUKrShyQ.png" /><figcaption>Topic Replication</figcaption></figure><p>Kafka’da belirli bir zamanda bir partition için sadece bir lider(Leader) kavramı vardır. Lider olan broker veriyi alır ve sunar, diğer brokerlar pasif kopyalar olur, sadece verileri senkronize ederler. Yani her partition için bir lider, birçok ISR(in-sync replica) olur. Lider ve ISR’lara karar veren Zookeeper’dir.</p><h4><strong>Producer &amp; Message Keys</strong></h4><p>Topic’lere veriyi yazarlar. Hangi broker ve partitiona yazacağını bilirler, cluster içerisindeki bir broker’a bağlanması yeterlidir. Broker çökse bile otomatik olarak recover olur. Mesaj anahtarı (message key) belirtilmişse, partition’a yazma işlemi anahtar değerine göre yapılır. Aynı anahtar değerine sahip mesajlar, aynı partition’a yazılır. Kafka partition bazında yazma ve okuma işlemini garanti ettiği için, sıranın önemli olduğu durumlarda kullanılabilir. Mesaj anahtarı belirtilmediği durumlarda partition’lara yükü dengelemek için round robin ile yazacaktır.</p><h4><strong>Consumer &amp; Consumer Groups</strong></h4><p>Topic’lerden veriyi okurlar. Hangi broker’dan okuyacağını bilir, broker çökse bile otomatik recover olur. Ayni Partition içerisindeki mesajları sıralı bir şekilde okur. Birden fazla partition’dan okuyabilir. Resimde de görüldüğü gibi her bir consumer, bir consumer group’a aittir. Bir partition’ı bir consumer group içerisinde sadece bir consumer okuyabilir.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/474/1*J-0xbraSo0fbyrrPCXedlg.png" /><figcaption>Consumer Groups</figcaption></figure><p>Yazının devamı:</p><p><a href="https://medium.com/@serkaneren_77558/apache-kafkaya-giri%C5%9F-2-9455e45d4c0f">https://medium.com/@serkaneren_77558/apache-kafkaya-giri%C5%9F-2-9455e45d4c0f</a></p><p>Kaynak:</p><ol><li><a href="https://kafka.apache.org/">https://kafka.apache.org/</a></li></ol><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3399e5f33f8e" width="1" height="1" alt=""><hr><p><a href="https://medium.com/devopsturkiye/apache-kafkaya-giri%C5%9F-3399e5f33f8e">Apache Kafka’ya Giriş</a> was originally published in <a href="https://medium.com/devopsturkiye">Devops &amp; AI Türkiye☁️ 🐧 🐳 ☸️</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Java ile Blockchain Oluşturma]]></title>
            <link>https://medium.com/@serkaneren_77558/java-ile-blockchain-olu%C5%9Fturma-149b50163fec?source=rss-8867a5548445------2</link>
            <guid isPermaLink="false">https://medium.com/p/149b50163fec</guid>
            <category><![CDATA[blockchain]]></category>
            <category><![CDATA[java]]></category>
            <dc:creator><![CDATA[Serkan Eren]]></dc:creator>
            <pubDate>Sun, 29 Jul 2018 20:03:02 GMT</pubDate>
            <atom:updated>2018-07-31T14:46:33.517Z</atom:updated>
            <content:encoded><![CDATA[<p>Sonunda uzun süredir aklımda olan blockchain teknolojisini öğrenme için ilk adımımı attım. En iyi öğrenme yöntemi konu ile ilgili geliştirme yapmak, proje yapmak fikri ile başladım. Öğrendiklerimi önce koda yansıtıp, sonra da kodu buradan açıklamalar ile paylaşmayı hedefliyorum. Bu yazımda blockchain yapısını daha iyi anlayabilmek için java ile çok basit bir blockchain gerçekleştirimi yapacağım.</p><p><strong>Blokchain nedir?</strong></p><p>Blockchain teknolojisi, bitcoin ve diğer kripto paraların arkasındaki teknolojidir. Blockchain, verinin bütünlüğünü sağlayan, merkezi olmayan dağıtılmış bir veritabanıdır. Daha detaylı bilgi için Ahmet Usta ve Serkan Doğantekin tarafından yazılan “Blockchain 101” kitabını okumanızı tavsiye ederim. <a href="https://bkm.com.tr/blockchain-101/">https://bkm.com.tr/blockchain-101/</a> adresinden dilediğiniz tutarda bağış yaparak kitabı indirebilirsiniz. Ben daha çok Java ile blockchain gerçekleştirimi konusunu anlatmaya çalışacağım.</p><h3>BKM on Twitter</h3><p>Ahmet Usta ve Serkan Doğantekin tarafından kaleme alınan &quot;Blockchain 101″ kitabı yeni versiyonu ile BKM Yayınlarında! @BKMExpress ile dilediğiniz tutarda bağış yaparak bu kitaba sahip olabilirsiniz. https://t.co/zvaZzXNbx6</p><p>Blockchain, çok basit olarak bir blok listesidir. Bloklar birbirlerine kriptografi kullanılarak bağlanır. Her blok önceki bloğun hash değerini, bir zaman bilgisi, data ve kendi hash değerini içerir. Kendi hash değeri, içerik ve önceki bloğun hash değeri kullanılarak hesaplanır. Listedeki bir datanın değişmesi hash değerini değiştireceği için, blockchain in geçersiz olmasını sağlayacaktır. Bu şekilde güvenli, değiştirilemeyen bir yapı sağlar. Bu bilgiler kapsamında blockchain i oluşturacak Block sınıfımızı tasarlayalım.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/2bcb94b79085a935da7b237b1a052801/href">https://medium.com/media/2bcb94b79085a935da7b237b1a052801/href</a></iframe><p>Bir blok oluşturulduğunda bloğun hash değeri(digital imzası), sınıfının yapılandırıcısında SHA-256 kriptografi algoritması kullanılarak generateHash metodu çağırılarak hesaplanıyor. Secure hash algoritmaları ile ilgili detaylar için Wikipedia: <a href="https://en.wikipedia.org/wiki/SHA-2">https://en.wikipedia.org/wiki/SHA-2</a></p><p>Java, bu algoritma için MessageDigest sınıfı üzerinden bir implementasyon sağlıyor, aşağıdaki şekilde generateHash metodunu yazıyoruz.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/424a29476db1ffe03fb900624aea47f0/href">https://medium.com/media/424a29476db1ffe03fb900624aea47f0/href</a></iframe><p>Mining (madencilik) İşlemi:</p><p>Bitcoin dünyasında mining işlemi, işlemleri bir blok haline getirme ve sonrasında blockchain üyeleri tarafından doğrulanması için gönderme süreci olarak tanımlanıyor. Blockchain teknolojisinde buna mutabakat(consensus) denir. Birçok farklı dağıtık consensus algoritması vardır. Örneğimizde proof-of-work consensus protokolünü kullanacağız.</p><p>Block sınıfımıza mining işlemini gerçekleştirebilmek için yeni bir metod ekliyoruz. Algoritma basitçe döngü içinde hash hesaplar, gönderilen zorluk seviyesi parametresi kadar ‘0’ ile başlayan hash bulduğunda işlem tamamlanır.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/355df0f2ddbc1b0ef9a938b310b6eb7d/href">https://medium.com/media/355df0f2ddbc1b0ef9a938b310b6eb7d/href</a></iframe><p>Blockchain sınıfımızın tasarımına geçelim. Blockchain sınıfımız, proof-of-work un çözümünde mining işlemi için zorluk seviyesini tanımlayan bir değişkeni ve block sınıfı listesini tutuyor olacak.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/943c1d358a3482c10f60cdaebdb03475/href">https://medium.com/media/943c1d358a3482c10f60cdaebdb03475/href</a></iframe><p>Blockchain sınıfımıza blok işlemleri için yeni metodlar ekliyoruz. Blockchain sınıfımızın yapılandırıcısında createFirstBlock() metodu ile başlangıç(genesis) bloğu oluşturuluyor. İlk blok(genesis) sadece kendi dijital imzasını taşır. newBlock() metodunda, son blok ile ilişkilendirilip yeni bir blok oluşturuluyor. addBlock() metodunda madencilik işlemi yapıldıktan sonra blok listeye ekleniyor.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/4e2e95db76a8cbb64c23320bde42379b/href">https://medium.com/media/4e2e95db76a8cbb64c23320bde42379b/href</a></iframe><p>Blockchain, geçerli olabilmesi için içindeki blok verilerinin bütünlüğünü garanti etmelidir. Doğrulama işlemleri için blockchain sınıfımıza, ilk bloğu kontrol eden, yeni eklenenin bloğu önceki blok bilgisi ile kontrol eden ve blockchain in doğruluğunu kontrol eden metodları ekliyoruz.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/28c299d3aca78b5ee9bfd61a258d48a1/href">https://medium.com/media/28c299d3aca78b5ee9bfd61a258d48a1/href</a></iframe><p>Blockchain sınıfımızı bu şekilde tamamlamış olduk. Şimdi de birkaç blok oluşturup, blockchain e ekleyen ve sonra doğruluğunu kontrol eden sınıfımızı yazalım.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/2e0d6b7a07c2a17661d39e77f4547260/href">https://medium.com/media/2e0d6b7a07c2a17661d39e77f4547260/href</a></iframe><p>Uygulamayı çalıştırdığımızda aşağıdaki gibi bir çıktı oluşacaktır, oluşan çıktıda blockchain in geçerliliğini ve blockchain içerisindeki blokların hash değerleri üzerinden birbirlerine bağlantıları görülebilir.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/974/1*M4H82iNMD7wq1oXIy2jVDw.png" /></figure><p>Java ile blockchain konusuna basit bir giriş yapmış olduk. Detayları öğrendikçe, sonraki yazılarımda P2P networking, wallet, transaction, merkel tree gibi yapıları da ekleyerek kodu ilerletmeyi planlıyorum.</p><p>Kaynak:</p><ul><li>Blockchain 101: Ahmet Usta, Serkan Doğantekin</li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=149b50163fec" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>