Kafka Event Streaming Nedir ve Nasıl Çalışır? Kapsamlı Bir Rehber
Günümüzün dijital dünyasında, veri her zamankinden daha hızlı üretiliyor ve tüketiliyor. Uygulamalar, hizmetler ve cihazlar sürekli olarak olaylar (events) üreterek, işletmelerin gerçek zamanlı kararlar almasını ve dinamik olarak değişen pazar koşullarına uyum sağlamasını gerektiren devasa veri akışları oluşturuyor. Bu sürekli ve bitmek bilmeyen veri akışını yönetmek, işlemek ve analiz etmek, geleneksel veri işleme yöntemleriyle giderek zorlaşmaktadır. İşte tam da bu noktada, “event streaming” kavramı ve onun en popüler uygulayıcılarından biri olan Apache Kafka devreye girer.
Bu makalede, event streaming’in temel prensiplerini, Apache Kafka’nın mimarisini, temel bileşenlerini ve çalışma mekanizmalarını derinlemesine inceleyeceğiz. Ayrıca, Kafka’nın sunduğu avantajları, yaygın kullanım alanlarını ve zengin ekosistemini (Kafka Connect, Kafka Streams) detaylandırarak, bu güçlü platformun modern veri mimarilerindeki vazgeçilmez rolünü kapsamlı bir şekilde açıklayacağız.
Event Streaming Nedir?
Event streaming, bir sistemde gerçekleşen olayların sürekli, gerçek zamanlı ve sıralı bir akışını yakalama, depolama ve işleme yeteneğidir. Geleneksel veri işleme yaklaşımları genellikle veriyi belirli aralıklarla (örneğin, günde bir kez) toplu (batch) olarak işlerken, event streaming, veriyi oluştuğu anda, yani “gerçek zamanlı” olarak ele alır.
Geleneksel Batch İşleme ile Farkı
Geleneksel batch işleme, büyük veri kümelerini belirli zaman aralıklarında (gece, hafta sonu vb.) bir araya getirip toplu olarak işler. Bu yaklaşım, geçmişe dönük analizler ve raporlamalar için uygun olsa da, anlık kararlar veya gerçek zamanlı tepkiler gerektiren durumlar için yetersiz kalır. Örneğin, bir bankanın dolandırıcılık tespiti sistemi, işlemleri toplu olarak işlerse, dolandırıcılık fark edildiğinde çok geç olabilir.
Event streaming ise, her bir olayı tek tek ve oluştuğu sırada ele alır. Bu, bir kullanıcının web sitesindeki tıklaması, bir sensörden gelen sıcaklık okuması, bir mikro hizmetten gelen durum güncellemesi veya bir finansal işlem gibi her türlü olayın anında işlenebileceği anlamına gelir.
Event (Olay) Tanımı ve Özellikleri
Bir “event” (olay), bir sistemde gerçekleşen ve anlam taşıyan bir durum değişikliğidir. Örneğin:
* Bir kullanıcının bir ürünü sepete eklemesi.
* Bir siparişin durumunun “beklemede”den “gönderildi”ye değişmesi.
* Bir sensörün belirli bir eşiğin üzerine çıkması.
* Bir sunucunun hata mesajı kaydetmesi.
Olaylar genellikle şu özelliklere sahiptir:
* Değişmez (Immutable): Bir olay oluştuktan sonra değiştirilemez. Olaylar, gerçekleşen bir gerçeğin kaydıdır.
* Zaman Damgalı (Timestamped): Her olayın ne zaman gerçekleştiğini gösteren bir zaman damgası bulunur. Bu, olayların kronolojik sırasını takip etmek için kritik öneme sahiptir.
* Sıralı (Ordered): Olaylar genellikle belirli bir bağlam veya anahtar içinde sıralı bir şekilde işlenir. Bu, olayların neden-sonuç ilişkilerini doğru bir şekilde anlamak için önemlidir.
Event Streaming’in Faydaları
* Gerçek Zamanlı Analiz ve Karar Verme: İşletmelerin anlık veriler üzerinden içgörüler elde etmesini ve hızlı kararlar almasını sağlar.
* Anında Tepki: Sistemlerin ve uygulamaların olaylara anında tepki vermesine olanak tanır (örneğin, dolandırıcılık tespiti, kişiselleştirilmiş öneriler).
* Esneklik ve Ölçeklenebilirlik: Dağıtık mimarilerde, farklı sistemlerin olay akışlarına abone olmasına ve kendi hızlarında işlemesine olanak tanır.
* Veri Entegrasyonu: Farklı sistemler arasındaki veri akışını standartlaştırır ve basitleştirir.
* Olay Kaynaklı Mimari (Event-Driven Architecture – EDA) Desteği: Uygulamaların olaylar üzerinden iletişim kurduğu, daha gevşek bağlı ve dayanıklı sistemler oluşturmayı teşvik eder.
Apache Kafka’ya Derin Bir Bakış
Apache Kafka, event streaming dünyasının tartışmasız lideridir. LinkedIn tarafından geliştirilen ve daha sonra Apache Yazılım Vakfı’na bağışlanan Kafka, yüksek verimli, dağıtık bir event streaming platformudur. Temel amacı, büyük hacimli olay akışlarını güvenilir bir şekilde yayınlamak, abone olmak, depolamak ve işlemek için bir omurga sağlamaktır.
Kafka, sadece bir mesaj kuyruğu olmanın ötesinde, üç temel yeteneği bir araya getirir:
1. Event Yayınlama ve Abone Olma: Binlerce sistemin veya uygulamanın olayları yayınlamasına (producer) ve abone olmasına (consumer) olanak tanıyan, yüksek verimli bir publish/subscribe (yayınla/abone ol) mesajlaşma sistemi.
2. Hata Toleranslı Depolama: Olay kayıtlarını, dağıtık ve hataya dayanıklı bir şekilde uzun süreler boyunca depolayabilen bir “distributed commit log” (dağıtık işlem günlüğü).
3. Gerçek Zamanlı İşleme: Olay akışlarını gerçek zamanlı olarak işlemek için bir platform (Kafka Streams API ve ksqlDB).
Bu yetenekler sayesinde Kafka, veri entegrasyonundan gerçek zamanlı analitiğe, mikro hizmet iletişiminden log toplamaya kadar geniş bir kullanım yelpazesine hitap eder.
Kafka’nın Temel Bileşenleri ve Mimarisi
Kafka’nın gücü, iyi tasarlanmış dağıtık mimarisinden gelir. İşte Kafka’nın temel bileşenleri:
Brokerlar (Sunucular)
Kafka kümesi, bir veya daha fazla sunucudan oluşur ve bu sunuculara “broker” denir. Her broker, Kafka’nın ana işlevlerini yerine getirir:
* Gelen olay kayıtlarını alır ve diske depolar.
* Tüketicilerden gelen isteklere yanıt vererek olay kayıtlarını onlara sunar.
* Olay kayıtlarının replikasyonunu yönetir.
* Her broker, kümedeki diğer broker’lar hakkında meta veri bilgisine sahiptir.
Brokerlar, yatay olarak ölçeklenebilir bir yapıya sahiptir. Kümenize daha fazla broker ekleyerek, Kafka’nın depolama kapasitesini ve işleme gücünü artırabilirsiniz.
Topicler (Konular)
Topicler, Kafka’da olay kayıtlarının mantıksal kategorilerini temsil eder. Bir producer, belirli bir topic’e olay gönderirken, bir consumer da belirli bir topic’ten olayları okur. Örneğin, bir e-ticaret uygulamasında siparisler, urun_goruntulemeleri veya kullanici_hareketleri gibi topic’ler olabilir.
Topicler, Kafka’daki ana veri düzenleme birimidir. Her topic’in benzersiz bir adı vardır ve bir topic’e gönderilen tüm olaylar aynı kategoriye aittir.
Partisyonlar (Bölümler)
Her topic, bir veya daha fazla “partisyona” ayrılmıştır. Partisyonlar, topic’in fiziksel olarak depolandığı ve işlendiği birimlerdir. Bir topic’in partisyonlara bölünmesi, Kafka’nın temel ölçeklenebilirlik ve paralel işleme mekanizmasıdır.
* Paralellik: Her partisyon, bir broker üzerinde bağımsız olarak çalışabilir. Bu, birden fazla producer’ın aynı anda farklı partisyonlara olay göndermesine ve birden fazla consumer’ın aynı anda farklı partisyonlardan olay okumasına olanak tanır.
* Sıralama Garantisi: Kafka, bir partisyon içindeki olayların eklenme sırasını (append-only log) ve tüketim sırasını garanti eder. Ancak, farklı partisyonlar arasındaki olayların global bir sıralaması garanti edilmez. Eğer global sıralama kritikse, tüm ilgili olaylar tek bir partisyonda işlenmelidir.
* Offset: Her partisyondaki olaylar, 0’dan başlayarak artan bir “offset” (konum) ile benzersiz bir şekilde tanımlanır. Consumer’lar, bir partisyonda en son hangi offset’i okuduklarını takip ederler. Bu, kaldıkları yerden okumaya devam etmelerini sağlar.
Producerlar (Üreticiler)
Producer’lar, olay kayıtlarını Kafka topic’lerine gönderen istemci uygulamalarıdır. Bir producer, bir olayı belirli bir topic’e gönderdiğinde, Kafka bu olayı o topic’in uygun bir partisyonuna yazar. Producer’lar, olayları anahtarlı (keyed) veya anahtarsız (unkeyed) olarak gönderebilirler. Eğer olay anahtarlı ise, Kafka aynı anahtara sahip tüm olayları aynı partisyona yönlendirir. Bu, belirli bir anahtara ait olayların sıralı işlenmesini sağlar.
Producer’lar, yüksek verimli veri gönderimi için olayları toplu halde (batching) gönderebilir ve veri sıkıştırma algoritmalarını (gzip, snappy, lz4, zstd) kullanarak ağ bant genişliğini optimize edebilirler.
Consumerlar (Tüketiciler)
Consumer’lar, Kafka topic’lerinden olay kayıtlarını okuyan istemci uygulamalarıdır. Bir consumer, bir topic’e abone olur ve o topic’teki partisyonlardan olayları okur.
* Consumer Group’lar: Kafka’nın önemli bir özelliği “consumer group”lardır. Bir consumer group, aynı uygulamaya ait bir veya daha fazla consumer instance’ından oluşur. Aynı consumer group’taki consumer’lar, bir topic’in partisyonlarını paylaşarak paralel ve hataya dayanıklı bir şekilde olayları tüketirler. Örneğin, bir topic’in 3 partisyonu varsa ve bir consumer group’ta 3 consumer varsa, her consumer bir partisyondan sorumlu olur. Eğer bir consumer kapanırsa, diğer consumer’lar otomatik olarak onun partisyonlarını devralır (rebalancing).
* Offset Yönetimi: Her consumer group, her partisyon için en son okuduğu offset’i Kafka’da özel bir topic olan __consumer_offsets içinde saklar. Bu sayede, consumer’lar yeniden başlatıldığında veya yeni consumer’lar gruba katıldığında, kaldıkları yerden okumaya devam edebilirler.
ZooKeeper (veya KRaft)
Geleneksel olarak, Kafka kümeleri ZooKeeper’ı, küme koordinasyonu ve meta veri yönetimi için kullanmıştır. ZooKeeper’ın görevleri şunlardır:
* Broker’ların durumunu takip etmek (hangi broker’lar aktif, hangi broker’lar kapalı).
* Topic ve partisyon meta verilerini depolamak.
* Controller broker’ı seçmek (kümenin ana yöneticisi).
* Consumer group’ların ve offset’lerin yönetiminde yardımcı olmak.
Ancak, Kafka’nın daha yeni sürümleri (2.8 ve sonrası), ZooKeeper bağımlılığını ortadan kaldıran ve Kafka’yı kendi içinde meta veri yönetimi yapabilen “KRaft” (Kafka Raft) modunu sunmuştur. KRaft, Kafka’yı daha basit, daha ölçeklenebilir ve daha az bağımlılığa sahip hale getirir. Yeni kurulumlarda KRaft tercih edilmektedir.
Kafka Nasıl Çalışır? Adım Adım Akış
Kafka’nın temel çalışma prensibini adım adım inceleyelim:
1. Producer Olayı Gönderir: Bir producer uygulaması, bir olayı (örneğin, bir JSON mesajı) belirli bir Kafka topic’ine gönderir. Olay, isteğe bağlı olarak bir anahtar (key) içerebilir.
2. Partisyon Seçimi: Kafka, olayın gönderileceği partisyonu belirler.
* Eğer olay anahtarlı ise, Kafka anahtarın hash değerini kullanarak belirli bir partisyonu seçer. Bu, aynı anahtara sahip tüm olayların aynı partisyona gitmesini sağlar.
* Eğer olay anahtarsız ise, Kafka olayları partisyonlar arasında round-robin (dönüşümlü) olarak dağıtır.
3. Broker’a Yazma: Seçilen partisyonun lider (leader) replikasına sahip broker, olayı alır ve diske yazar. Bu işlem, diske art arda ekleme (append-only) şeklinde gerçekleşir, bu da çok yüksek yazma performansı sağlar.
4. Replikasyon: Veri dayanıklılığı için, her partisyonun birden fazla replikası bulunur (genellikle 3). Lider replika olayı yazdıktan sonra, takipçi (follower) replikalar da olayı kendi disklerine kopyalar. Producer, olayın kaç replikaya yazıldığını onaylayana kadar bekleyebilir (örneğin, tüm replikalar onaylayana kadar acks=all).
5. Olay Offset Alır: Olay, partisyona yazıldığında, o partisyon içinde benzersiz bir offset numarası alır. Bu offset, olayın partisyon içindeki konumunu belirtir.
6. Consumer Olayı Okur: Bir consumer uygulaması, belirli bir topic’e abone olur ve o topic’in atanmış partisyonlarından olayları okumaya başlar. Consumer, belirli bir offset’ten başlayarak veya en son eklenen olaylardan başlayarak okuyabilir.
7. Offset Güncellemesi: Consumer, olayları başarıyla işledikten sonra, en son okuduğu offset’i Kafka’ya (genellikle __consumer_offsets topic’ine) kaydeder. Bu, consumer’ın kaldığı yerden devam etmesini sağlar ve hata toleransını artırır.
8. Paralel İşleme: Birden fazla consumer, aynı consumer group içinde aynı topic’in farklı partisyonlarından paralel olarak olayları işleyebilir. Bu, tüketim hızını ve sistemin genel verimini artırır.
Bu döngü, milyarlarca olay için saniyede yüz binlerce kez tekrarlanabilir, bu da Kafka’nın neden bu kadar güçlü ve ölçeklenebilir olduğunu gösterir.
Kafka Event Streaming’in Avantajları
Kafka’nın popülaritesi, sunduğu bir dizi önemli avantajdan kaynaklanmaktadır:
* Yüksek Ölçeklenebilirlik: Kafka, yatay olarak ölçeklenebilir bir mimariye sahiptir. İhtiyaç duyulduğunda kümenize daha fazla broker ekleyerek, hem depolama kapasitesini hem de işleme gücünü artırabilirsiniz. Bu, saniyede milyonlarca olayı işleyebilme yeteneği sağlar.
* Yüksek Performans: Düşük gecikme (latency) ve yüksek verim (throughput) ile bilinir. Olayları diske sıralı bir şekilde yazma (append-only log), işletim sistemi sayfa önbelleklerini etkin bir şekilde kullanma ve verimli ağ protokolleri sayesinde bu performansı sağlar.
* Hata Toleransı ve Dayanıklılık: Olay kayıtları, birden fazla broker üzerinde replike edilir. Bir broker arızalandığında, diğer replikalar otomatik olarak devreye girer ve veri kaybı olmadan hizmet kesintisiz devam eder. Bu, yüksek erişilebilirlik (high availability) sağlar.
* Gerçek Zamanlı İşleme: Olaylar oluştukları anda işlenebildiği için, sistemler anında tepki verebilir ve gerçek zamanlı içgörüler elde edilebilir.
* Esneklik ve Ayrışma: Producer’lar ve consumer’lar birbirlerinden bağımsızdır. Bir producer’ın bir olayı göndermesi için bir consumer’ın aktif olması gerekmez ve bir consumer, producer’dan bağımsız olarak olayları kendi hızında tüketebilir. Bu, sistemler arasında gevşek bağlılık (loose coupling) sağlar.
* Veri Bütünlüğü ve Sıralama: Her partisyon içinde olayların eklenme sırası korunur. Bu, olayların kronolojik sırasının kritik olduğu senaryolarda (örneğin, finansal işlemler) veri bütünlüğünü garanti eder.
* Geriye Dönük Uyumluluk ve Tekrar Oynatma: Kafka, olayları belirli bir süre (örneğin, 7 gün) boyunca diske saklar. Bu, consumer’ların geçmiş olayları tekrar okuyabilmesini veya yeni bir uygulamanın mevcut olay akışını baştan işleyebilmesini sağlar.
* Zengin Ekosistem: Kafka, Kafka Connect, Kafka Streams, ksqlDB gibi güçlü araçlarla zengin bir ekosisteme sahiptir. Bu araçlar, veri entegrasyonu ve akış işleme yeteneklerini önemli ölçüde genişletir.
Kafka Kullanım Alanları
Kafka, çok çeşitli endüstrilerde ve uygulama senaryolarında yaygın olarak kullanılmaktadır:
* Gerçek Zamanlı Analitik ve İzleme (Monitoring): Sunucu metrikleri, uygulama logları, ağ olayları gibi verilerin gerçek zamanlı olarak toplanması ve analiz edilmesi. Bu, sistem performansını izlemek, anormallikleri tespit etmek ve uyarılar oluşturmak için kullanılır.
* Log Toplama ve Yönetimi: Farklı sunuculardan ve uygulamalardan gelen logların merkezi bir noktada toplanması, depolanması ve işlenmesi. Kafka, Elasticsearch, Splunk gibi log analiz araçlarına veri akışı sağlamak için ideal bir köprü görevi görür.
* Microservices Mimarileri için Mesaj Kuyruğu: Mikro hizmetler arasında asenkron ve güvenilir iletişim sağlamak. Hizmetler, olayları Kafka topic’lerine yayınlayarak birbirleriyle gevşek bağlı bir şekilde etkileşim kurabilirler.
* Değişiklik Veri Yakalama (Change Data Capture – CDC): Veritabanlarındaki değişikliklerin (ekleme, güncelleme, silme) gerçek zamanlı olarak yakalanması ve Kafka’ya akıtılması. Bu, veri ambarlarını güncel tutmak, önbellekleri senkronize etmek veya diğer sistemleri gerçek zamanlı olarak güncellemek için kullanılır.
* Olay Kaynaklı Mimari (Event-Driven Architecture – EDA): Uygulama bileşenlerinin olaylar aracılığıyla iletişim kurduğu mimarilerin temelini oluşturur. Bu, daha esnek, ölçeklenebilir ve dayanıklı sistemler oluşturmayı sağlar.
* Akış İşleme (Stream Processing): Gerçek zamanlı olay akışlarını dönüştürme, filtreleme, birleştirme ve zenginleştirme. Kafka Streams API ve ksqlDB gibi araçlar, bu tür işlemleri kolaylaştırır.
* IoT (Nesnelerin İnterneti) Veri Alımı: Binlerce IoT cihazından gelen sensör verilerini toplamak ve işlemek için yüksek verimli bir altyapı sağlar.
* Müşteri Deneyimi Kişiselleştirme: Müşteri davranışlarını (tıklamalar, satın almalar, görüntülemeler) gerçek zamanlı olarak analiz ederek kişiselleştirilmiş öneriler sunmak.
Kafka Ekosistemi: Kafka Connect ve Kafka Streams
Kafka’nın gücü, sadece çekirdek platformundan değil, aynı zamanda etrafında oluşan zengin ekosistemden de gelir. Bu ekosistemin en önemli iki bileşeni Kafka Connect ve Kafka Streams’tir.
Kafka Connect
Kafka Connect, Kafka ile diğer veri sistemleri arasında ölçeklenebilir ve güvenilir bir şekilde veri akışı sağlamak için kullanılan bir araçtır. Kod yazmaya gerek kalmadan veya çok az kod yazarak, çeşitli sistemlerden (veritabanları, dosya sistemleri, mesaj kuyrukları, API’ler vb.) Kafka’ya veri almayı (source connectors) ve Kafka’dan diğer sistemlere veri göndermeyi (sink connectors) kolaylaştırır.
* Source Connectors: Harici bir veri kaynağından (örneğin, bir PostgreSQL veritabanı, bir S3 kovası veya bir REST API) veri okur ve bu veriyi Kafka topic’lerine yazar. Örneğin, Debezium gibi bir CDC connector, bir veritabanındaki tüm değişiklikleri gerçek zamanlı olarak Kafka’ya aktarabilir.
* Sink Connectors: Kafka topic’lerinden veri okur ve bu veriyi harici bir veri hedefine (örneğin, bir Elasticsearch kümesi, bir veri ambarı, bir başka veritabanı veya bir HDFS) yazar. Örneğin, bir S3 Sink Connector, Kafka’daki verileri belirli aralıklarla S3’e yedekleyebilir.
Kafka Connect, dağıtık ve hataya dayanıklı bir şekilde çalışır. Connector’lar, worker process’ler üzerinde çalışır ve ölçeklenebilirlik için birden fazla worker arasında dağıtılabilir. Bu, veri entegrasyonu görevlerini basitleştirir ve geliştiricilerin bu karmaşık entegrasyon mantığını sıfırdan yazmaktan kurtarır.
Kafka Streams
Kafka Streams, Java ve Scala dillerinde yazılmış, hafif ve kullanımı kolay bir kütüphanedir. Geliştiricilerin, doğrudan kendi uygulamalarında gerçek zamanlı akış işleme uygulamaları oluşturmasına olanak tanır. Kafka Streams, Kafka’yı hem giriş hem de çıkış olarak kullanarak, olay akışlarını filtreleme, dönüştürme, birleştirme, gruplama ve durum bilgili (stateful) işlemler yapma yeteneği sunar.
* KStream ve KTable: Kafka Streams API’sının temel soyutlamaları KStream ve KTable‘dır.
* KStream: Değişmez bir olay kayıtları akışını temsil eder. Her kayıt, bir olayın gerçekleştiğini gösterir. Bir KStream üzerindeki işlemler, her bir olay için tek tek uygulanır.
* KTable: Bir anahtar-değer çiftinin en son durumunu temsil eder. Bir veritabanı tablosu veya anahtar-değer deposu gibi düşünülebilir. KTable‘daki her güncelleme, o anahtarın yeni durumunu yansıtır.
* Durum Bilgili İşlemler: Kafka Streams, dahili olarak RocksDB gibi gömülü bir anahtar-değer deposu kullanarak durum bilgili işlemleri (örneğin, pencereleme, birleştirme, toplama) destekler. Bu, uygulamaların geçmiş olaylar hakkında bilgi tutmasını ve bu bilgilere dayanarak kararlar almasını sağlar.
* Yerel İşleme: Kafka Streams uygulamaları, Kafka broker’ları üzerinde değil, kendi JVM’lerinde çalışır. Bu, düşük gecikme ve yüksek performans sağlar. Ayrıca, Kafka Streams uygulamaları da ölçeklenebilir ve hataya dayanıklıdır; bir uygulama instance’ı kapanırsa, diğerleri onun partisyonlarını devralır.
Kafka Streams, karmaşık akış işleme senaryolarını, ayrı bir akış işleme kümesi kurmaya gerek kalmadan, doğrudan Kafka’nın kendisiyle entegre bir şekilde çözmek için güçlü bir araçtır.
Sonuç
Apache Kafka, modern veri mimarilerinin temel taşı haline gelmiş, güçlü ve esnek bir event streaming platformudur. Yüksek ölçeklenebilirlik, performans, hata toleransı ve gerçek zamanlı işleme yetenekleriyle, işletmelerin sürekli artan veri akışlarını yönetme ve bu verilerden değerli içgörüler elde etme zorluklarını aşmalarına yardımcı olur.
Event streaming’in gücü, sadece veriyi hızlı bir şekilde taşımakla kalmaz, aynı zamanda olayları sistemlerin “hafızası” olarak kullanarak, uygulamaların daha reaktif, esnek ve dayanıklı olmasını sağlar. Kafka’nın temel bileşenleri (broker’lar, topic’ler, partisyonlar, producer’lar, consumer’lar) ve zengin ekosistemi (Kafka Connect, Kafka Streams), geliştiricilere ve mimarlara, veri entegrasyonundan gerçek zamanlı analitiğe kadar çok çeşitli zorlukları çözmek için kapsamlı bir araç seti sunar.
Gelecekte de veri akışının önemi artmaya devam edecek ve Kafka, bu dinamik veri ortamında merkezi bir rol oynamaya devam edecektir. Veri odaklı her işletme için, Kafka’yı anlamak ve etkin bir şekilde kullanmak, rekabet avantajı sağlamanın ve yenilikçi çözümler geliştirmenin anahtarlarından biri olacaktır.