Apache Flink'i Ustalıkla Kullanma: Gerçek Zamanlı Veri Boru Hatlarının Omurgası
Modern veri dünyasında toplu işleme artık yeterli değil. Organizasyonlar anlık içgörüler talep ediyor ve olayların gerçekleştiği anda işleyebilen sistemlere ihtiyaç duyuyor. Apache Flink, bu ihtiyaca yönelik varsayılan standart haline gelmiş olup, hem sınırlı hem de sınırsız veri akışları üzerinde durum bilgili hesaplamalar için güçlü ve yüksek performanslı bir motor sunuyor. Bu yazı, Flink'i orta ve ileri düzey geliştiriciler için güçlü bir araç yapan temel mekanizmaları inceliyor.
stream = inputStream.assignTimestampsAndWatermarks(
WatermarkStrategy.forBoundedOutOfOrderness(Duration.ofSeconds(5))
.withTimestampAssigner((event, timestamp) -> event.getTimestamp())
);
```
Yukarıdaki örnekte, 5 saniyeye kadar sırasız olaya tolerans gösteriyoruz. Bu, pencere sisteminin önemli ölçüde geç gelen olayların gelmeyeceğinden emin olana kadar yalnızca kapatılmasını sağlar; bu da gecikmeyi fazla artırmadan doğru toplama işlemlerine olanak tanır.
counts = input
.keyBy(value -> value.getId())
.flatMap(new CountWindowAverage());
public static class CountWindowAverage implements FlatMapFunction, Tuple2> {
private transient ValueState sum;
@Override
public void open(Configuration parameters) {
ValueStateDescriptor descriptor = new ValueStateDescriptor<>("average-sum", Long.class);
sum = getRuntimeContext().getState(descriptor);
}
@Override
public void flatMap(Tuple2 value, Collector> out) throws Exception {
Long currentSum = sum.value();
currentSum += value.f1;
sum.update(currentSum);
// Her 5 elemanda bir ortalama yayınlama
if (/* sayı mantığı */) {
out.collect(Tuple2.of(value.f0, currentSum / 5));
}
}
}
```
Bu kod parçacığı, her anahtar için çalışan bir toplamın nasıl korunacağını gösterir. Durum, Flink’in durum arka ucu (RocksDB veya HashMap) tarafından desteklenir ve hatalara karşı dayanıklıdır.
pattern = Pattern.begin("start")
.where(new SimpleCondition() {
@Override
public boolean filter(Event value) { return value.name().equals("login"); }
})
.next("middle")
.where(new SimpleCondition() {
@Override
public boolean filter(Event value) { return value.amount() > 1000; }
})
.within(Time.seconds(10));
```
Bu desen, 10 saniye içinde bir "giriş" olayını takip eden yüksek değerli bir işlemi arar ve gerçek zamanlı dolandırıcılık tespitini mümkün kılar.