
Bu makalede şu sorulara cevap vermeye çalışacağız: Stream veri işleme (stream data processing) nedir, neden önemlidir, Apache Flink bu konuda diğer sistemlerden ne farkla öne çıkar? Ardından iç mimariye, temel kavramlara ve kullanımı örneklerle göreceğiz.
1. Stream İşleme Nedir? (What Is Stream Processing)
Veri dünyasında genellikle iki yaklaşım vardır: toplu işlem (batch processing) ve akış (stream) işleme. Toplu işleme, belirli bir zaman aralığındaki verileri biriktirip, topluca işler eder. Ancak günümüzde pek çok iş durumu/ihtiyacı “verinin geldikçe işlenmesini gerektiriyor”; işte stream işleme burada devreye giriyor.
Stream işleme, verilerin sürekli akış (continuous flow) halinde işlenmesi demektir. Yani veriler biriktirilip, sonra topluca işlenmez; gelen her olay (event) anında işlenebilir. Bu şekilde, sistemler düşük gecikmeyle (low latency) tepki verebilirler.
Fakat pratikte olayların sırası karışabilir (örneğin bir sensör verisi geç gelebilir), hatta çok geç gelebilen veriler (late events) olabilir. Bu yüzden stream işleme sistemleri “zaman (time) kavramı”, “watermark”, “pencere (window)” gibi kavramları desteklemelidir.
Apache Flink, tam da bu amaçla geliştirilmiş bir çerçevedir (framework / engine). Hem sınırsız (unbounded) veri akışlarını hem de sınırlı (bounded) verileri işleyebilir. (Amazon Web Services, Inc.)
2. Neden Stream İşleme? (Why Stream Processing Matters)
Peki neden verileri gecikmeli değil, canlı işlemek gerekli olsun? İşte bazı örnek senaryolar:
- Kredi kartı ile uzak bir ülkede hileli bir işlem yapılırsa bunu anında algılayıp kullanıcıyı uyarmak istersin.
- E-ticarette sipariş verdin, teslimat tahmini istiyorsun — teslimat gecikme ihtimali olursa seni haberdar eden sistemler olmalı.
- IoT (Nesnelerin İnterneti) cihazlarından gelen sensör verilerini anlık analiz etmek, alarm üretmek.
- Gerçek zamanlı gösterge tabloları (dashboard), metrik bildirimleri.
- Oyunlar, sosyal medya sistemleri, reklam hedefleme gibi süreçler, “veri geldikçe tepki ver” ister.
Bu tür talepler, gecikmesiz (low latency), yüksek hacimli (high throughput), doğru sonuç (exactly-once semantics vb.) isteyen sistemler gerektirir. Apache Flink bu gereksinimleri karşılayabilecek kabiliyete sahiptir. (flink.apache.org)
Ayrıca Flink, toplu veriyi işleme (batch) ile akış veriyi işleme arasında bir ayrım yapmadan tek bir programlama modeli sunar (unified processing). Yani batch veriyi “sınırlı bir akış (bounded stream)” olarak görebilirsin. (Amazon Web Services, Inc.)
3. Flink Nedir? (What Is Apache Flink)
Apache Flink, açık kaynak (open source), dağıtık (distributed) ve durum (stateful) işleme (processing) destekleyen bir motor (engine). Hem sınırsız (unbounded) hem sınırlı (bounded) veri akışlarını işleyebilir. (flink.apache.org)
Flink’in bazı öne çıkan özellikleri:
- Durumlu işlem (stateful computation): Analiz, agregasyon gibi işlemler için önceki olay verisini tutabilirsin.
- Hata toleransı (fault tolerance): Checkpointing, savepoint gibi mekanizmalarla sistem çökse bile eksik kalmadan devam edebilirsin. (Amazon Web Services, Inc.)
- Zaman temelli işlem (event time processing): Olayların gerçek zamanına (event time) dayalı işlem yapabilme yeteneği.
- Paralellik ve ölçeklenebilirlik (parallelism & scalability): Veri akışı bağımsız alt akışlara (sub-streams) bölünür, her biri ayrı düğümde (node) işlenebilir.
- API çeşitliliği: Java, Python, SQL destekler.
- Kaynaktan (source) hedefe (sink) veri akışı: Kafka, veritabanı, dosya sistemleri gibi çeşitli kaynak ve hedeflerle entegre çalışabilir. (Wikipedia)
Özetle: Flink, modern veri sistemlerinde “canlı veri işlemeyi” mümkün hâle getiriyor.
4. Temel Kavramlar (Core Concepts)
Apache Flink’in gücünü anlamak için önce birkaç temel kavramı iyi oturtmamız gerekiyor. Flink, veriyi kaynaklardan (sources) alır, bu veriyi operatörler (operators) aracılığıyla işler ve çıktıyı hedeflere (sinks) gönderir. Bu işlem hattına iş grafiği (job graph) denir ve her adım bu grafikteki bir düğüm (node) olarak temsil edilir.
Bu grafikteki veri akışı her zaman yönlüdür; yani kaynaklardan başlayıp hedeflere doğru ilerler. Bu nedenle Flink’in veri hattı bir yönlü çevrimsiz grafik (Directed Acyclic Graph – DAG) biçimindedir. Her düğüm, akıştaki olayları (events) alır, üzerinde işlem yapar ve bir sonraki düğüme gönderir. Bu yapı, hem sistemin modüler hem de ölçeklenebilir olmasını sağlar.
Flink’in mimarisindeki en küçük yapı taşı operatör (operator)’dür. Her operatör, veriyi bir biçimde dönüştürür. Bu dönüşüm, filtreleme (filter), eşleme (map), gruplayarak toplama (aggregate), birleştirme (join) gibi birçok farklı şekilde olabilir. Örneğin; bir e-ticaret uygulamasında “ürün rengine göre gruplama” ve “her renkten gelen siparişleri sayma” işlemleri ardışık iki operatör olarak çalıştırılabilir.
Veri bir operatörden diğerine geçerken, bu geçişin nasıl olacağı performans açısından çok önemlidir. Flink bu konuda birkaç strateji sunar:
- İletme (Forwarding): En basit geçiş biçimidir. Veri herhangi bir yeniden düzenleme olmadan bir sonraki operatöre aktarılır.
- Yeniden bölümlendirme (Repartition / Shuffle): Veriler belirli bir özelliğe göre yeniden gruplanır. Örneğin rengine göre gruplanmış olaylar aynı düğümde işlenir.
- Yük dengeleme (Rebalancing): Akış farklı operatörlere eşit olarak dağıtılır.
- Yayınlama (Broadcast): Aynı veri kümesi tüm düğümlere gönderilir.
- Birleştirme (Join): İki veya daha fazla veri akışı birleştirilir.
Bu geçişlerin her biri farklı maliyetlere sahiptir. Özellikle yeniden bölümlendirme (shuffle) ve dengeleme (rebalance) gibi işlemler, verinin seri hale getirilip ağ üzerinden taşınmasını gerektirir. Bu yüzden sistemin performansını doğrudan etkiler. İyi bir Flink uygulaması, yalnızca gerektiğinde shuffle yapar ve veri hareketini minimumda tutar.
Bir başka önemli kavram paralelliktir (parallelism). Flink’te veri akışları, “alt akışlar (sub-streams)” hâlinde bölünür. Her alt akış bağımsız olarak işlenir. Bu sayede aynı işin farklı bölümleri farklı işlemcilerde eşzamanlı çalışabilir. Örneğin 10 milyon olay içeren bir akış, paralellik değeri 5 olan bir Flink job’unda beş farklı görev olarak çalıştırılabilir. Böylece sistem yatayda ölçeklenir (scale-out) ve iş yükü daha verimli dağılır.
Bu paralel yapıda operatörler birbirinden bağımsızdır, yani paylaşımsız (shared nothing) mimari kullanılır. Böylece her operatör kendi alt akışını işler, verimlilik maksimuma çıkar. Bu tasarım, Flink’in “büyük ölçekli ve düşük gecikmeli” sistemlerde başarılı olmasının temel nedenidir.
Bir Flink uygulamasının içinde veri yalnızca akmaz; aynı zamanda bazı operatörler, geçmiş olayların bilgisini saklar. Buna durum (state) denir. Durum, akıştaki her olayın önceki değerlerle ilişkilendirilmesini sağlar. Örneğin, “şu ana kadar kaç mavi sipariş geldi?” sorusunun cevabı bir durum bilgisine dayanır. Bu durum bellekte (heap state backend) veya diskte (RocksDB state backend) tutulabilir. Flink, bu durumu düzenli aralıklarla anlık görüntüler (snapshots) olarak saklar. Böylece sistem beklenmedik bir hata yaşadığında kaldığı yerden devam edebilir.
Bu sürece checkpointing (denetim noktası alma) denir. Checkpoint’ler otomatik olarak oluşturulur ve genellikle dağıtık bir dosya sisteminde (örneğin HDFS veya Amazon S3) saklanır. Eğer sistem çökerse, Flink son başarılı checkpoint’ten itibaren tüm işlemleri yeniden yürütür ve böylece veri kaybı olmadan “tam olarak bir kez (exactly-once)” işlem garantisi sağlar. Bu garanti, Flink’in endüstriyel uygulamalarda tercih edilmesinin en büyük nedenlerinden biridir [1][3].
Zaman kavramı da Flink’in kalbinde yer alır. Her olayın bir zaman damgası (timestamp) vardır ve sistem üç farklı zaman türüyle çalışabilir:
- Olay zamanı (Event Time): Olayın gerçekten gerçekleştiği zaman.
- İşlem zamanı (Processing Time): Olayın Flink tarafından işlendiği zaman.
- Alım zamanı (Ingestion Time): Olayın sisteme girdiği zaman.
Bu ayrım, özellikle geç gelen olaylar (late events) için çok önemlidir. Flink, watermark adını verdiği bir mekanizma ile gecikmeli olayların bile doğru pencere (window) içinde işlenmesini sağlar. Bu sayede “son 10 saniyede gelen siparişlerin toplamı” gibi gerçek zamanlı analizler gerçeğe en yakın biçimde yapılabilir [2][5].
Son olarak, Flink hem akış (stream) hem de toplu (batch) veriyi tek bir model altında işler. Toplu veriler aslında belirli bir başlangıç ve bitiş zamanına sahip “sınırlı akışlar (bounded streams)” olarak ele alınır. Bu, veri mühendislerinin aynı API’leri kullanarak hem geçmiş veriyi yeniden işleyebilmesini hem de gerçek zamanlı akışları yönetebilmesini sağlar [4][6].
Özetle, Flink’in mimarisi şu dört temel ilkeye dayanır:
- Akış (Streaming): Veriler sürekli akar ve anında işlenir.
- Durum (State): Her operatör, geçmişe dair bilgi tutabilir.
- Zaman (Time): Gerçek zamanlı ve olay zamanlı işlemler yapılabilir.
- Anlık Görüntüler (Snapshots): Hata durumunda geri dönüş için güvenli noktalardır.
Bu dört kavramın bir araya gelmesi, Flink’i yalnızca bir stream işleme aracı olmaktan çıkarıp, gerçek zamanlı veri ürünlerinin (real-time data products) temelini oluşturan bir platform hâline getirir.
5. Apache Flink Mimarisi (Apache Flink Architecture)
Apache Flink’in en güçlü yanlarından biri, yüksek ölçeklenebilirliği (scalability) ve düşük gecikme (low latency) ile dağıtık (distributed) ve durumlu (stateful) akışları yönetebilmesidir. Bunu başarabilmek için altında iyi tasarlanmış bir mimari yatar. Gelin bu mimariyi adım adım inceleyelim.
5.1. Genel Bakış (Overview)
Bir Flink uygulaması (Flink job), temel olarak üç katmandan oluşur:
- İşlem Hattı (Dataflow / Job Graph):
Uygulamanın veri akışını ve işlem adımlarını tanımlar. Kaynak (source) → Operatör (operator) → Hedef (sink) zincirinden oluşur. - Küme Katmanı (Cluster Layer):
Flink’in bileşenlerinin dağıtık biçimde nasıl çalıştığını belirler. Bu katmanda JobManager ve TaskManager gibi bileşenler vardır. - Depolama Katmanı (State & Checkpoint Storage):
Flink’in durum bilgilerini (state) ve hata tolerans mekanizmalarını (fault tolerance) yönettiği yerdir.
Bu yapıyı anlamak, hem performans hem de hata dayanıklılığı açısından kritik önemdedir [1][4].
5.2. Flink Küme Bileşenleri (Cluster Components)
Bir Flink kümesinde (cluster), her işin yönetimi ve yürütülmesinden sorumlu birkaç temel bileşen bulunur:
🧠 JobManager (İş Yöneticisi)
JobManager, Flink kümesinin beynidir. Görevleri şunlardır:
- Kullanıcının yazdığı uygulamayı alır, job graph (iş grafiği) oluşturur.
- Görevleri (tasks) alt parçalara ayırır ve hangi TaskManager’da çalışacaklarını belirler.
- Checkpoint (denetim noktası) süreçlerini koordine eder.
- Hatalı durumlarda görevleri yeniden başlatır.
JobManager, küme içinde yüksek erişilebilirlik (High Availability) modunda birden fazla örnekle çalışabilir. Böylece bir JobManager düşerse, diğeri devralabilir.
⚙️ TaskManager (Görev Yöneticisi)
TaskManager, Flink işinin kas gücüdür. JobManager’ın verdiği görevleri (task) yürütür.
Her TaskManager, birden fazla slot barındırır. Her slot, bir görev (task) veya operatör zincirini (operator chain) çalıştırır.
Slot sayısı, paralellik (parallelism) değerini belirler. Örneğin üç TaskManager varsa ve her biri dört slot barındırıyorsa, toplam paralellik 12 olabilir. Bu sayede aynı iş farklı düğümlerde paralel biçimde çalışır [2][5].
🧩 ResourceManager (Kaynak Yöneticisi)
ResourceManager, Flink’in kullandığı CPU ve bellek gibi kaynakları yönetir.
YARN, Kubernetes, Mesos veya Standalone modunda çalışabilir.
Yani Flink ister kendi kümesi üzerinde (standalone), ister bulut tabanlı bir kaynak yöneticisi üzerinde koşsun, bu katman kaynak tahsisini kontrol eder.
5.3. İş Akışı (Job Lifecycle)
Bir Flink uygulaması çalıştırıldığında, şu adımlar gerçekleşir:
- Job Submission (İşin Gönderilmesi):
Geliştirici, Flink uygulamasını JobManager’a gönderir (CLI, REST API veya Flink Dashboard üzerinden). - Job Graph Oluşturma:
Flink, kullanıcı kodunu optimize eder, DAG (Directed Acyclic Graph) biçiminde bir job graph oluşturur.
Bu grafikte her düğüm bir operatör, her ok (edge) bir veri akışını temsil eder. - Görev Dağıtımı (Task Deployment):
JobManager, grafiği daha küçük task’lara böler ve TaskManager’lara gönderir. - Çalışma (Execution):
TaskManager’lar görevleri çalıştırır. Aralarındaki veri akışı, ağ (network stack) üzerinden gerçekleşir. - Checkpointing:
Uygulama çalışırken belirli aralıklarla durum (state) snapshot’ları alınır. - Tamamlama veya Yeniden Başlatma:
Tüm görevler tamamlanırsa sonuçlar sink’e yazılır.
Eğer hata olursa, sistem son checkpoint’ten yeniden başlatılır [3][6].
Bu süreç, Flink’in “kesintisiz ve güvenilir stream işleme” yeteneğinin kalbidir.
5.4. Operatör Zincirleri (Operator Chains)
Flink, benzer paralellikteki operatörleri tek bir zincir hâlinde çalıştırarak verimliliği artırır.
Örneğin, bir map → filter → flatMap ardışığı tek bir Task slot içinde çalıştırılabilir.
Bu sayede gereksiz ağ aktarımı (network shuffle) engellenir ve CPU kullanımı optimize edilir.
Ancak operatörlerin paralellik derecesi farklıysa, Flink otomatik olarak zinciri kırar ve yeni bir “shuffle” noktası oluşturur. Bu durumda veri yeniden bölümlendirilir (repartition) ve ağ üzerinden taşınır.
Bu ayrım, performans tuning sürecinde çok önemlidir.
5.5. Durum Yönetimi ve Checkpoint’ler (State Management & Checkpoints)
Flink, durumlu işlem (stateful processing) yaparken her operatörün içindeki durumları (örneğin sayaçlar, pencereler, ara sonuçlar) tutar.
Bu durum, “state backend” adı verilen bir bileşen tarafından saklanır.
Flink’te üç yaygın state backend vardır:
- HashMapStateBackend: Durum verisini JVM heap üzerinde tutar. Küçük işler için uygundur.
- EmbeddedRocksDBStateBackend: Durumu RocksDB içinde tutar. Disk tabanlıdır, büyük state’ler için idealdir.
- Custom / Remote Backends: Harici sistemlerle (örneğin S3, GCS) entegre biçimde kullanılabilir.
Checkpoint işlemi sırasında bu state verisi snapshot olarak saklanır.
Checkpoint verileri genellikle S3, HDFS veya başka bir uzak dosya sistemine yazılır.
Bu, Flink’in exactly-once işleme garantisini sağlar [1][7].
5.6. Zaman Yönetimi (Time Management)
Flink’te olayların işlendiği zaman kavramı oldukça esnektir.
Üç temel zaman türü vardır:
- Event Time (Olay Zamanı): Gerçek olayın oluştuğu an.
- Processing Time (İşlem Zamanı): Olayın Flink operatörüne ulaştığı an.
- Ingestion Time (Alım Zamanı): Olayın sisteme girdiği an.
Olaylar bazen gecikmeli (late events) gelebilir.
Flink, watermark adını verdiği zaman sinyalleriyle bu durumu kontrol eder.
Watermark’lar sayesinde “şu ana kadar gelen olayların zamanı 12:35’e kadar tamamlandı” gibi bir çıkarım yapılır.
Bu özellik, pencereli işlemlerde (windowing) doğru sonuç alınmasını sağlar [4][8].
5.7. Flink’in Çalışma Modları (Deployment Modes)
Flink, farklı altyapılarda esnek biçimde çalışabilir. Üç temel dağıtım modu vardır:
- Uygulama Kümesi (Application Cluster):
Her uygulama kendi JobManager’ı ve TaskManager’larıyla bağımsız çalışır. İzolasyon yüksektir. - Oturum Kümesi (Session Cluster):
Birden fazla uygulama aynı kümeyi paylaşır. Daha az kaynak kullanır ama izleme karmaşıklaşabilir. - Per-Job Mode (Tek İşlik Küme):
Her job kendi kısa ömürlü kümesini oluşturur. Özellikle bulut üzerinde otomatik ölçeklendirme (auto-scaling) için tercih edilir.
Flink, bu modlarda Kubernetes, YARN veya bulut ortamlarında (AWS Kinesis Data Analytics, Confluent Cloud Flink vb.) çalıştırılabilir [5][9].
5.8. Mimarinin Gücü: Dayanıklılık + Performans
Tüm bu bileşenler bir araya geldiğinde ortaya çok güçlü bir sistem çıkar:
- Veriler paralel biçimde akar,
- Operatörler bağımsız ve durumsaldır,
- Checkpoint mekanizmasıyla hata durumunda güvenli geri dönüş sağlanır,
- Zaman yönetimiyle gerçek dünyaya en yakın analiz yapılır,
- Ve tüm bunlar milisaniyeler seviyesinde gecikmeyle olur.
Bu mimari yapı sayesinde Flink; Netflix, Uber, Alibaba ve Goldman Sachs gibi dev şirketlerin gerçek zamanlı işleme (real-time stream processing) sistemlerinin kalbinde yer alır [6][10]..
6. Apache Flink ile Neler Yapabiliriz (Apache Flink Use Cases)
Apache Flink, yalnızca bir veri işleme aracı değil, birçok sektörde “gerçek zamanlı zekâ” sağlayan bir altyapıdır.
Artık veriye saatler sonra değil, olduğu anda tepki vermek (react to data as it happens) gerekiyor.
Flink tam da bunu mümkün kılar: veriler akar, işlenir, zenginleştirilir (enrich) ve saniyeler içinde karar alınabilir hale gelir.
Aşağıda, Flink’in en sık kullanıldığı alanlara ve her birinin ardındaki mantığa birlikte bakalım.
6.1. Gerçek Zamanlı Dolandırıcılık Tespiti (Real-Time Fraud Detection)
Finans dünyasında her saniye binlerce işlem gerçekleşiyor.
Bu işlemler arasında olağan dışı bir davranış tespit etmek, birkaç saniye bile gecikirse milyonlarca lira zarara yol açabilir.
İşte bu noktada Flink devreye girer.
Flink, akış verilerini (event streams) sürekli izleyebilir,
önceden tanımlanmış kurallara (rules) veya makine öğrenmesi modellerine göre olağan dışı örüntüleri (patterns) anında fark edebilir.
Örneğin bir kullanıcı aynı dakika içinde üç farklı ülkeden giriş yaptıysa,
Flink bu olayları bir pencerede (window) toplayarak anomali tespiti yapabilir ve alarm oluşturabilir.
Bunun avantajı, sonuçları gecikmeden üretmesidir (low-latency processing).
Yani “veri geldi, depolandı, sonra analiz edildi” döngüsüne gerek kalmaz — analiz, akış sırasında olur [1][2].
6.2. E-Ticaret ve Müşteri Deneyimi (E-commerce & Customer Experience)
Flink’in en popüler kullanım alanlarından biri e-ticaret platformlarıdır.
Bir e-ticaret sitesinde her saniye yüzlerce tıklama, sepet ekleme ve sipariş olayı yaşanır.
Bu olaylar bir Kafka topiğine (Kafka topic) akar; Flink bu akışı okur, filtreler, zenginleştirir ve anında karar üretebilir.
Örneğin:
- Bir ürün stok dışı kalmak üzereyse, site anında “sınırlı stok” etiketi gösterebilir.
- Bir kullanıcı belirli bir ürün kategorisinde çok zaman geçiriyorsa, kişiselleştirilmiş öneriler (personalized recommendations) üretilebilir.
- Kampanyaların performansı, anlık olarak izlenebilir.
Flink’in SQL API’si sayesinde bu akışlar üzerinde gerçek zamanlı sorgular (real-time queries) yazmak da mümkündür:
örneğin “son 10 dakikada en çok satan ürünler” sorgusu, her an güncel kalır [3][5].
6.3. Telekom ve IoT Uygulamaları (Telecom & IoT Applications)
Telekom şirketleri ve IoT (Nesnelerin İnterneti) çözümleri için,
milyonlarca sensörden gelen veriyi eşzamanlı işleyebilmek kritik önemdedir.
Flink bu alanda yüksek hacimli veri akışlarını (high-throughput streams) yönetmede mükemmeldir.
Örneğin bir enerji dağıtım şirketi:
- Her akıllı sayaçtan saniyede bir veri alabilir.
- Bu verileri Flink ile analiz ederek ani tüketim sıçramalarını fark edebilir.
- Gecikme veya arıza ihtimalinde otomatik uyarı sistemi devreye girebilir.
Benzer şekilde, telekom operatörleri Flink ile ağ trafiğini izleyebilir,
şebeke yoğunluğunu (network congestion) tespit edip yönlendirmeleri otomatik yapabilir.
Tüm bu analizler, milisaniyeler içinde gerçekleşir [4][6].
6.4. Gerçek Zamanlı ETL ve Veri Zenginleştirme (Real-Time ETL & Data Enrichment)
Klasik ETL (Extract, Transform, Load) işlemleri genellikle toplu (batch) biçimde çalışır.
Ama modern veri platformlarında “gerçek zamanlı ETL (real-time ETL)” artık standart hale geldi.
Flink, akış halindeki veriyi kaynak sistemlerden (örneğin Kafka, CDC – Change Data Capture, REST API vb.) alır,
veriyi dönüştürür (transform), zenginleştirir (enrich) ve hedef sistemlere (sink) yazar.
Bu hedef bir veri ambarı (data warehouse), bir göl (data lake) ya da analitik motor (analytical engine) olabilir.
Örneğin:
- Kafka → Flink → Amazon S3 hattında veriler anında temizlenip, dönüştürülüp yazılabilir.
- PostgreSQL’deki değişiklikler (CDC events) Flink üzerinden BigQuery veya Snowflake’e aktarılabilir.
Bu yaklaşım, veri mühendisliğini “gerçek zamanlı hale getiren köprü” olarak tanımlanabilir [1][7].
6.5. Gerçek Zamanlı Gösterge Tabloları (Real-Time Dashboards & Monitoring)
Flink, operasyonel sistemlerle analitik sistemleri birbirine bağlar.
Yani veriler üretildiği anda analiz edilebilir hâle gelir.
Örneğin bir lojistik şirketi:
- Tüm sevkiyat olaylarını Flink üzerinden işler.
- Her gecikme, rota değişikliği, araç arızası anında sistem tarafından algılanır.
- Sonuçlar bir BI aracı (business intelligence tool) veya gösterge paneli (dashboard) üzerinde canlı güncellenir.
Böylece “son durum ne?” sorusunun cevabı her saniye değişebilir.
Bu, özellikle karar destek sistemleri (decision support systems) için büyük avantaj sağlar.
Flink burada “analitik katman (analytics layer)” ile “operasyonel katman (operational layer)” arasında bir köprü görevi görür [5][8].
6.6. Oyun, Sosyal Medya ve Reklam Teknolojileri (Gaming, Social Media & AdTech)
Oyun sektörü, sosyal medya ve reklam teknolojileri (AdTech) Flink’in en yaratıcı kullanımlarına sahiptir.
Burada amaç, kullanıcı davranışlarını anlık analiz ederek tepki vermektir.
- Oyunlarda, Flink “oyuncu skorlarını, etkinliklerini ve hile girişimlerini” gerçek zamanlı takip eder.
- Sosyal medyada, akıştaki içerik popülerliğini (trend detection) analiz eder.
- Reklam teknolojilerinde, açık artırma (real-time bidding) işlemleri milisaniyeler içinde sonuçlandırılır.
Bu sektörlerde karar süresi çok kısadır.
Flink, bu yüzden event-time windowing ve low-latency pipelines sayesinde bu işlemleri gecikmeden yönetebilir [2][9].
6.7. Bulut ve Veri Platformu Entegrasyonları (Cloud & Data Platform Integrations)
Modern dünyada Flink yalnızca bir açık kaynak aracı değil; büyük bulut sağlayıcılarının da stratejik parçası hâline geldi.
- AWS üzerinde “Kinesis Data Analytics for Apache Flink” adıyla tam yönetimli (fully managed) olarak çalışabilir.
- Confluent Cloud, Kafka akışlarını doğrudan Flink SQL üzerinden işleme olanağı sunar.
- Google Cloud Dataflow ve Azure Stream Analytics gibi platformlarda da benzer yeteneklerle entegre edilebilir.
Bu entegrasyonlar sayesinde, ekipler kendi kümesini yönetmeden yalnızca iş mantığına (business logic) odaklanabilir.
Yani “altyapıyı değil, zekâyı kodlarsın.”
Flink’in Table API ve SQL desteği sayesinde bu platformlarda veri analizi yapmak, neredeyse klasik SQL sorgusu yazmak kadar kolaydır [6][10].
6.8. Gerçek Zamanlı Yapay Zeka ve Model Skorlama (Real-Time AI & Model Scoring)
Son yıllarda Flink, yalnızca veri mühendislerinin değil, MLOps ve AI mühendislerinin de favorisi oldu.
Sebebi basit: makine öğrenmesi (machine learning) modelleri, artık gerçek zamanlı veriyle çalışmak zorunda.
Flink, model dosyalarını yükleyip (örneğin TensorFlow, PyTorch veya ONNX modelleri),
gelen olayları anında skorlayabilir (real-time model scoring).
Bu, sahtekarlık tespiti, müşteri terk tahmini, dinamik fiyatlama gibi senaryolarda sıkça kullanılır.
Ayrıca, LLM tabanlı sistemlerde (örneğin arama, öneri, chatbot akışları)
Flink, vektör veritabanlarına (vector databases) akan verileri işleyip, embedding güncellemelerini tetikleyebilir.
Yani “LLM tabanlı akış sistemleri” için de güçlü bir temel oluşturur [4][9].
6.9. Özet
Flink, sektör fark etmeksizin anlık karar almayı (real-time decisioning) mümkün kılar.
Veri nereden gelirse gelsin — sensör, kullanıcı, finans sistemi ya da API — Flink onu yakalar, işler ve doğru yere taşır.
Artık veri sadece depolanmaz; veriyle birlikte düşünülür.
Flink’in bu vizyonu, “veri hareket ederken değer üretmek (value in motion)” felsefesiyle özetlenebilir.
7. Basit Bir Örnek Üzerinden Akış Uygulaması
Apache Flink’i anlamanın en güzel yolu, küçük bir akış (stream) uygulamasını adım adım kurmaktır.
Bu sayede, bir veri kaynağından (source) gelen olayların nasıl işlendiğini, filtrelendiğini, gruplanıp sayıldığını göreceğiz.
Flink’in gücü, bu işlemlerin tamamını gerçek zamanlı (real-time) olarak yapabilmesinden gelir.
7.1. Senaryo (Scenario)
Diyelim ki elimizde bir e-ticaret sisteminden akan sipariş verileri var.
Her sipariş bir “olay (event)” olarak temsil ediliyor ve Kafka üzerinden akıyor.
Her olayda ürün adı, kategori, renk, miktar ve sipariş zamanı gibi alanlar var.
Bizim amacımız:
- Yalnızca “geçerli (valid)” siparişleri işlemek,
- Portakal rengindeki (orange) ürünleri hariç tutmak,
- Kalan siparişleri renklerine göre gruplamak,
- Her renk için kaç sipariş geldiğini saymak,
- Sonuçları bir çıktı tablosuna (sink) yazmak.
Kısacası, renklere göre anlık sipariş sayacı oluşturacağız.
7.2. Veri Akış Modeli (Dataflow Model)
Bu uygulamanın akış modeli şöyle görünebilir:
[Kafka Source] │ ▼ [Filtrele: status='VALID' ve color!='orange'] │ ▼ [Grupla: color] │ ▼ [Sayaç: COUNT] │ ▼ [Sink: PostgreSQL veya Kafka Topic]
Bu zincir, Flink’in iş grafiği (Job Graph) içinde bir DAG (Directed Acyclic Graph) olarak temsil edilir.
Veri yukarıdan aşağıya akar; her düğüm (node) bir operatördür (operator).
7.3. Flink SQL ile Gerçek Zamanlı Akış (Streaming with Flink SQL)
Flink SQL, bu tür uygulamaları yalnızca birkaç satırlık SQL sorgusuyla tanımlamamızı sağlar.
Flink, bu sorguyu otomatik olarak bir streaming job’a dönüştürür.
Bu, Flink’in “veri mühendisleri için SQL gücü” dediği özelliktir [1][4].
Örneğin:
INSERT INTO order_summary SELECT color, COUNT(*) AS order_count FROM orders WHERE status = 'VALID' AND color <> 'orange' GROUP BY color;
Bu sorgunun yaptığı şey:
- “orders” adlı akıştan veri okuyor,
- Geçersiz (invalid) veya turuncu (orange) siparişleri çıkarıyor,
- Renk bazında gruplayıp sayıyor,
- Sonuçları “order_summary” adlı tabloya (sink) yazıyor.
Bu sorgu çalıştırıldığında Flink arka planda bir uygulama oluşturur:
“SELECT-FROM-WHERE-GROUP BY” ifadeleri, operatör zincirleri (operator chains) hâline gelir.
Flink SQL sorgusunun içinden bir streaming pipeline doğar.
Flink, bu sorguda continuous query (sürekli sorgu) mantığını uygular:
veri geldikçe sonuç tablosu anında güncellenir.
Bu yüzden Flink SQL sorguları, klasik veritabanı sorgularından çok farklıdır — sonuçlar “bittiğinde” değil, sürekli akarken oluşur [2][5].
7.4. DataStream API ile Aynı Örneği Kodla (With the DataStream API)
Şimdi aynı işlemi Java veya Python kullanarak DataStream API ile yazalım.
Aşağıda Java benzeri sadeleştirilmiş bir örnek var:
DataStream<Order> orders = env .addSource(new FlinkKafkaConsumer<>("orders", new OrderSchema(), properties)) .filter(order -> order.getStatus().equals("VALID") && !order.getColor().equals("orange")) .keyBy(Order::getColor) .map(new CountByColor()) .addSink(new FlinkKafkaProducer<>("order_summary", new SummarySchema(), properties));
Bu kodda olanlar:
- Source: Kafka’dan sipariş akışı alınıyor.
- Filter: “VALID” olmayan ve “orange” olanlar çıkarılıyor.
- KeyBy: Renge göre gruplama yapılıyor.
- Map: Her renk için sayaç artırılıyor.
- Sink: Sonuç başka bir Kafka topiğine veya veri tabanına yazılıyor.
Buradaki CountByColor
fonksiyonu, her renk için sayaç değerini tutar.
Bu sayaç bilgisi, Flink’in stateful operator (durumlu operatör) özelliği sayesinde RAM’de veya RocksDB üzerinde saklanabilir.
Python tarafında da oldukça benzer bir mantık vardır.
Örneğin PyFlink ile:
from pyflink.datastream import StreamExecutionEnvironment env = StreamExecutionEnvironment.get_execution_environment() orders = env.add_source(kafka_source) \ .filter(lambda o: o.status == "VALID" and o.color != "orange") \ .key_by(lambda o: o.color) \ .map(lambda o: (o.color, 1)) \ .key_by(lambda x: x[0]) \ .reduce(lambda a, b: (a[0], a[1] + b[1])) \ .add_sink(kafka_sink) env.execute("Color Count Stream")
Aynı mantık: filtrele, grupla, say, yaz.
Ama bu kez akış işlemleri doğrudan Python fonksiyonlarıyla tanımlanıyor.
Flink’in arka planındaki DAG (Directed Acyclic Graph), bu fonksiyon zincirinden otomatik olarak oluşturuluyor [3][6].
7.5. Pencereli (Windowed) Akış Analizi
Bazı durumlarda yalnızca “toplam kaç sipariş geldi” değil,
“son 1 dakikada kaç sipariş geldi?” sorusunu da sormak isteriz.
İşte bu tür işlemler pencereleme (windowing) ile yapılır.
Örneğin:
SELECT color, TUMBLE_START(order_time, INTERVAL '1' MINUTE) AS window_start, COUNT(*) AS order_count FROM orders WHERE status = 'VALID' AND color <> 'orange' GROUP BY color, TUMBLE(order_time, INTERVAL '1' MINUTE);
Burada TUMBLE()
fonksiyonu, veriyi 1 dakikalık sabit pencerelere (tumbling windows) ayırır.
Yani her dakika için ayrı bir istatistik oluşturulur.
Bu, canlı raporlar (live dashboards) veya alarm sistemleri için çok kullanışlıdır [5][7].
Aynı pencereleme, DataStream API’de şu şekilde tanımlanabilir:
orders .keyBy(Order::getColor) .window(TumblingEventTimeWindows.of(Time.minutes(1))) .aggregate(new CountAggregate());
Burada her renk için birer dakikalık pencereler açılır ve sayaç tutulur.
Flink, pencere dolduğunda sonucu gönderir, ardından yeni bir pencere başlatır.
7.6. Gerçek Zamanlı Sonuçlar (Real-Time Outputs)
Bu örneğin sonuçları farklı yerlere yönlendirilebilir:
- Kafka Topic: Başka sistemler (örneğin Spark, Superset, BI araçları) tarafından tüketilmek üzere.
- Veritabanı: PostgreSQL, ClickHouse, ElasticSearch vb.
- Dashboard: Flink SQL Gateway veya Grafana ile canlı görselleştirme.
Sonuç: renk bazlı sipariş sayacı, her saniye güncellenir.
Turuncu ürünler filtrelenmiştir, diğer renklerin sayısı akışta artar.
Flink bu işi “tam olarak bir kez (exactly-once semantics)” garantisiyle yapar —
yani her olay yalnızca bir kere sayılır, veri kaybı veya çifte sayım olmaz [2][8].
7.7. Performans, Dayanıklılık ve Genişleme
Bu kadar sade bir akış bile, Flink’in mimari gücünü gösterir.
Çünkü:
- Her aşama (operator) paralel çalışır,
- Her sayaç bilgisi state backend’de güvenle tutulur,
- Checkpoint mekanizması sayesinde sistem çökse bile sayaçlar kaldığı yerden devam eder,
- Rebalancing (yük dengeleme) sayesinde veri otomatik olarak dağıtılır.
Üstelik bu yapı dinamik olarak ölçeklenebilir (scalable).
Yani akış büyüdükçe Flink yeni TaskManager’lar ekleyerek paralelliği artırabilir.
Bu da sistemin “gerçek anlamda bulut uyumlu (cloud-native)” olmasını sağlar [4][9].
7.8. Özet
Bu örnek, Flink’in gücünü sade ama etkili biçimde özetliyor:
- Veri akışını okur,
- Filtreler, dönüştürür, gruplar, toplar,
- Ve sonuçları anında üretir.
Flink ile yazılmış bu tür uygulamalar,
finanstan e-ticarete, IoT’den yapay zekâ sistemlerine kadar her alanda
canlı veriyle akıllı karar almayı (real-time intelligence) mümkün kılar.
Bundan sonraki adımda artık Flink’in state, checkpointing, time, ve windowing kavramlarını derinlemesine öğrenerek
gerçek projelerde nasıl uygulandığını göreceğiz..
8. Flink’in Temel Kavramları: Streaming, State, Time ve Snapshots
Apache Flink’in gücünü anlamak için dört kavramı sağlam şekilde oturtmak gerekiyor:
Streaming (Akış), State (Durum), Time (Zaman) ve Snapshots (Anlık Görüntüler).
Bu dört yapıtaşı, Flink’in neden “sadece bir stream işleme aracı değil, tam bir gerçek zamanlı veri platformu” olarak anıldığını açıklar.
Şimdi gelin, her birini adım adım inceleyelim.
8.1. Akış (Streaming)
Flink’in kalbi, akış (streaming) fikri üzerine atar.
Veriler artık dosya olarak toplanıp toplu halde işlenmez; sistemlere “olaylar (events)” şeklinde akar.
Her sipariş, tıklama, sensör ölçümü veya log kaydı bir olaydır.
Flink bu olayları, sürekli ve sınırsız (unbounded) bir veri akışı olarak ele alır.
Bu akış, her an büyür. Flink, olayları işledikçe yeni veriler gelmeye devam eder.
Yani bir Flink uygulaması hiçbir zaman “tamamlandı” demez — çünkü veri akışı durmaz.
Böylece sistemler anlık tepki verebilir (react in real time).
Toplu veri (batch data) bile Flink’te aslında bir “sınırlı akış (bounded stream)” olarak görülür.
Yani aynı API ile hem geçmiş veriyi (batch) hem de canlı veriyi (stream) işleyebilirsin.
Bu birleşik işlem modeli (unified processing model), Flink’in en sevilen özelliklerinden biridir [1][3].
8.2. Durum (State)
Stream dünyasında, olaylar tek başına yeterli değildir; çoğu zaman geçmişte neler olduğunu da bilmemiz gerekir.
Örneğin:
- “Son 10 dakikada kaç sipariş geldi?”
- “Bu kullanıcı daha önce giriş yaptı mı?”
- “Bu müşterinin toplam bakiyesi nedir?”
Bu soruların yanıtı, sistemin bir durum (state) tutmasını gerektirir.
İşte Flink’in fark yarattığı yer tam burasıdır.
Flink, her operatöre kendi durumunu tutma yeteneği verir — buna stateful operator (durumlu operatör) denir.
Durumlar, RAM’de ya da diskte saklanabilir.
Flink’te durum yönetimini yapan bileşene state backend denir.
Üç temel backend türü vardır:
- HashMapStateBackend:
Durumu doğrudan JVM belleğinde (heap) tutar. Küçük iş yükleri için idealdir. - EmbeddedRocksDBStateBackend:
Durum verilerini disk üzerinde RocksDB içinde saklar.
Büyük veri hacimleri ve yoğun bellek kullanımı olan işler için tercih edilir. - Custom veya Remote State Backend:
Kurumlar kendi depolama altyapılarını (örneğin Amazon S3, Ceph, HDFS) backend olarak tanımlayabilir.
Durum, Flink uygulamasının “hafızası” gibidir.
Uygulama çökse bile bu hafıza kaybolmaz — çünkü Flink, durumu düzenli olarak snapshot’lar hâlinde güvenli yere yazar.
Bu bizi bir sonraki kavrama getiriyor: Snapshots.
8.3. Anlık Görüntüler (Snapshots) ve Checkpointing
Gerçek dünyada hiçbir sistem hatasız değildir.
Sunucu çöker, ağ kopar, veri kaynağı geçici olarak yanıt vermez…
Ama gerçek zamanlı sistemler, bu tür hatalarda kesilmeden devam edebilmelidir (fault tolerance).
Flink bu problemi checkpointing (denetim noktası alma) ile çözer.
Checkpoint, sistemin o anda tuttuğu durumun (state) tutarlı bir fotoğrafıdır.
Belirli aralıklarla (örneğin her 5 saniyede bir) bu fotoğraf çekilir ve uzak bir depolamaya (HDFS, S3, Ceph vb.) kaydedilir.
Bir hata olduğunda, Flink son başarılı checkpoint’i alır,
durumları (state) o noktadan yükler ve veri akışını yeniden oynatarak (replay) kaldığı yerden devam eder.
Bu sayede veri kaybı olmadan (no data loss) ve çifte işlem olmadan (exactly-once semantics) yeniden başlatma yapılır [2][4].
Flink ayrıca savepoint adını verdiği özel snapshot’lar da destekler.
Savepoint, checkpoint’e benzer ama manuel olarak başlatılır.
Genellikle sistem yükseltmesi (upgrade), versiyon geçişi veya taşınma (migration) sırasında kullanılır.
Bu mekanizma, Flink’i “yüksek erişilebilirlik (high availability)” isteyen kurumlar için mükemmel bir seçim haline getirir.
Netflix, Uber ve Goldman Sachs gibi şirketlerin Flink’e güvenmesinin sebeplerinden biri budur [5].
8.4. Zaman (Time)
Zaman, stream işlemede en karmaşık ama en güçlü kavramdır.
Flink, zamanı üç farklı şekilde ele alır:
- Event Time (Olay Zamanı):
Olayın gerçekten gerçekleştiği an.
Örneğin siparişin verildiği tarih-saat bilgisi.
Flink, olayın taşıdığı timestamp değerini kullanır. - Processing Time (İşlem Zamanı):
Olayın Flink operatörüne ulaştığı an.
Yani sistem saati (system clock).
Bu yöntem basit ama gecikmeli olaylarda yanlış sonuç verebilir. - Ingestion Time (Alım Zamanı):
Olayın Flink sistemine girdiği an.
Yani kaynak (source) tarafında alınma zamanı.
Zaman türünün seçimi, sonuçların doğruluğunu doğrudan etkiler.
Özellikle “gecikmeli olaylar (late events)” söz konusu olduğunda, Flink watermark kavramını devreye sokar.
Watermark, “şu ana kadar gelen olaylar en fazla şu zamana kadar tamamlandı” anlamına gelen bir sinyaldir.
Bu sayede Flink, geç gelen olayları bile doğru pencereye (window) yerleştirir.
Örneğin:
- Watermark 12:30’a ulaşmışsa,
- 12:29’da gerçekleşmiş ama geç gelen bir olay hâlâ işlenebilir,
- 12:15’teki bir olay ise artık “late event” olarak kabul edilir.
Bu esnek zaman yönetimi, Flink’i “gerçek zamanlı ama aynı zamanda doğru zamanlı (real-time and event-time accurate)” hale getirir [3][6].
8.5. Pencereler (Windows)
Zamanla yakından ilişkili bir diğer kavram pencereleme (windowing)’dir.
Akışlar sonsuz olduğu için, verileri anlamlı bloklar hâline getirmek gerekir.
İşte pencereler bu işe yarar.
Flink üç temel pencere tipi sunar:
- Tumbling Windows (Yuvarlanan Pencereler):
Sabit aralıklı bloklar. Örneğin “her 1 dakikalık pencere”. - Sliding Windows (Kaymalı Pencereler):
Pencereler belirli aralıklarla üst üste gelir. Örneğin “5 dakikalık pencere, her 1 dakikada bir kayar”. - Session Windows (Oturum Pencereleri):
Aktivite aralıklarına göre otomatik oluşur.
Eğer belirli süre veri gelmezse yeni bir oturum başlar.
Bu pencere türleri, Flink’in event-time işleme yeteneğiyle birleşince çok güçlü analizler sağlar.
Örneğin:
- “Son 5 dakikadaki ortalama sıcaklık nedir?”
- “Her 10 dakikalık aralıkta en çok sipariş edilen ürün hangisi?”
gibi sorular, pencereli işlemlerle kolayca cevaplanabilir [4][7].
8.6. Streaming, State, Time ve Snapshots Arasındaki Bağ
Bu dört kavram birbirinden bağımsız değildir —
tam tersine, Flink’in bütünlüğünü sağlayan dört sütun (four pillars) gibidir:
- Streaming verinin sürekli aktığı dünyayı temsil eder.
- State, sistemin geçmişi unutmamasını sağlar.
- Time, olayların doğru sırayla işlenmesini garantiler.
- Snapshots ise her şeyin güvenle kaydedilmesini.
Bu bütünlük sayesinde Flink, yalnızca hızlı değil, aynı zamanda tutarlı (consistent) sonuçlar üretir.
Gerçek zamanlı finansal işlemler, IoT sensör sistemleri veya canlı analitik platformlar, bu dörtlü yapı sayesinde kusursuz çalışır [5][8].
8.7. Neden Önemli?
Bugün birçok sistem “stream processing” yaptığını söyler ama çoğu, ya zamanı doğru yönetemez ya da hata toleransını sağlayamaz.
Flink’in farkı, bu dört kavramı tek bir model içinde birleştirmesidir.
Bu sayede hem “gecikmesiz (low latency)” hem de “kesintisiz (fault-tolerant)” çalışır.
Kısacası Flink:
- Veriyi durmadan işler,
- Durumunu asla kaybetmez,
- Gecikmeli olaylarla bile başa çıkar,
- Ve her şeyi güvenli biçimde checkpoint’ler.
İşte bu yüzden Flink, modern veri platformlarının kalbinde yer alır.
8.8. Özet
Bu bölümde, Flink’in dört temel kavramını öğrendik.
Artık biliyoruz ki:
- Streaming, verinin sürekli aktığı dünyayı yönetiyor.
- State, sistemin hafızası.
- Time, düzeni sağlıyor.
- Snapshots, dayanıklılığı garanti ediyor.
Bu yapı taşları bir araya geldiğinde ortaya gerçek zamanlı, hataya dayanıklı, ölçeklenebilir (scalable) bir sistem çıkıyor.
Flink’i öğrenirken bu kavramları aklında net tutmak, ileride karmaşık pipeline’lar kurarken büyük kolaylık sağlar.
9. Flink Kullanırken Dikkat Edilmesi Gereken Noktalar & En İyi Uygulamalar
Biraz da deneyim temelli ipuçları:
- Checkpoint sıklığına dikkat et: Çok sık almak performansı düşürür, çok nadir almak risklidir. Denge gerekir.
- State boyutunu kontrol et: Çok büyük durum tutmak disk IO yükünü artırabilir.
- Paralellik ve kaynak planlaması: Yeterli paralellik ayarla; darboğaz olabilecek operatörleri tespit et.
- Shuffle / Repartition maliyetine dikkat et: Ağ aktarımı pahalıdır; gereksiz repartition’dan kaçın.
- Watermark stratejisi belirle: Gecikmeli verileri (late events) nasıl işleyeceğini planla.
- Savepoint ve sürüm geçişleri: Uygulamayı güncelleyeceksen savepoint’lerle durum kaybetmeden geçiş yapabilirsin.
- İzleme & Metric’ler: Backpressure, gecikme, state büyümesi, checkpoint süreleri izlenmeli.
- Kaynak & hedef uyumu: Source ve sink sisteminin throughput kapasitesi Flink tarafına denk olmalı.
- Test & simülasyon: Test verisiyle “dışarıdan gelen geç veriler”, “trafik zirveleri” gibi durumları simüle et.
10. Özet ve İleri Okuma (What Next)
Özetle: Apache Flink, canlı veri akışlarını (stream) gerçek zamanlı olarak işleyebilme gücüne sahip, ölçeklenebilir, durum (state) ve zaman (time) kavramlarını destekleyen bir motor. Video metninden, kavramlardan, mimariden ve örnekten faydalandık. Şimdi bu temel üzerinde derinleşmek lazım: state yönetimi, checkpointing, pencere modelleri, watermark stratejileri gibi.
Bir sonraki adım olarak şu konulara bakabilirsin:
- Flink’in DataStream API veya Table API / SQL kullanım örnekleri
- Zaman yönetimi ve watermark stratejileri
- Checkpoint / Savepoint mekanizmaları
- Yük devretme (fault tolerance) ve yeniden başlatma
- Gerçek vaka çalışmaları (case studies)
- Performans optimizasyonu
Kaynaklar
- Apache Flink resmi sitesi — “Stateful Computations over Data Streams” (flink.apache.org)
- AWS “What Is Apache Flink?” (Amazon Web Services, Inc.)
- Confluent “What Is Apache Flink? — Architecture & Use Cases” (Confluent)
- Ververica “Stream Processing with Apache Flink: Beginner’s Guide” (ververica.com)
- Flink mimari sayfası — Architecture | Apache Flink (flink.apache.org)
- Decodable “Introduction to Apache Flink and Stream Processing” (decodable.co)
- Confluent blog “Apache Flink: Stream Processing for All Real-Time Use Cases” (Confluent)
- O’Reilly “Stream Processing with Apache Flink” içeriği (O’Reilly Media)
- Flink resmi doküman “Overview” sayfası (nightlies.apache.org)
- Apache Flink Wikipedia sayfası (Wikipedia)
- Kapak Görseli: Photo by Fikri Rasyid on Unsplash