Güvenlik

Java’da Öncelik Kuyruğu: Gerçek Zamanlı Tehdit Yönetimi

Bakın şimdi, gerçek zamanlı sistemlerde mesele sadece “veriyi almak” değil… o veriyi doğru sırayla işlemek. Geçen yıl İstanbul’da bir savunma simülasyonu üzerine çalışan küçük bir ekiple sohbet ederken, adamların en büyük derdi tam olarak buydu: ekrana düşen olaylar çok hızlı geliyordu, ama hepsini geliş sırasına göre ele almak sistemi hantallaştırıyordu. İşin aslı şu ki, bazen ilk gelen şey en önemli şey olmuyor.

Java tarafında bu tip senaryolarda PriorityQueue bayağı iş görüyor. Düz bir listeyle arama yapıp her seferinde “en tehlikeli hangisi?” diye bakmak, kalabalık bir otoparkta tek tek plaka okumaya benziyor. Olur mu? Olur. Ama yorar. Bilhassa oyun motoru, uçuş simülasyonu, güvenlik yazılımı ya da yoğun olay akışı olan finans sistemlerinde öncelik mantığı kilit hale geliyor.

Ben bunu ilk kez 2023’te Ankara’daki bir AR-GE toplantısında test etmiştim; ortada askeri kullanım değil ama benzer mantık vardı: alarm, sensör. Uyarı sıralaması. Liste tabanlı çözüm gayet “çalışıyor” gibi görünüyordu, ta ki veri sayısı artana kadar. Sonra işler biraz dağıldı… ve açık konuşayım, gecikme can sıkıcı seviyeye çıktı.

Şimdi gelelim işin can alıcı noktasına.

Neden Düz Liste Yeterli Olmuyor?

Kısaca söyleyeyim: yeterli olmuyor çünkü ölçeklenmiyor. Bir List ya da ArrayList ile çalışınca yeni eklenen her hedef için çoğu zaman tüm yapıyı taramak zorunda kalırsınız — yani mesela yüzlerce aktif nesnenin olduğu bir radar ekranı düşünün; biri 300 metre ötedeyken diğeri 3 kilometre uzakta, bir diğeri de tam sınırda, ve siz her güncelleme döngüsünde bu listeyi baştan sona okuyorsunuz. CPU “ben buna niye yetişiyorum?” demeye başlar. Başlar da.

Bu noktada PriorityQueue devreye giriyor. Altındaki yapı heap; yani kabaca şöyle düşünün: masanın üstüne rastgele kâğıtlar bırakmıyorsunuz, en acil olanı en üste koyan düzenli bir yığın kuruyorsunuz. Bu ne anlama geliyor? Hem ekleme hem de en öncelikli öğeyi alma işi bu sayede çok daha düzgün akıyor.

Ha, küçük projelerde düz liste bazen hâlâ yeterli. Sisteminizde beş altı kayıt dönüyorsa priority queue kurarak işleri gereksiz karmaşıklaştırmanın pek anlamı yok açıkçası. Ama olay büyüdükçe tablo değişiyor — kurumsal ölçekte bu fark minik bir optimizasyon değil, resmen nefes aldıran şey oluyor.

Ve işler burada ilginçleşiyor.

Öncelik kuyruğu size sadece hız kazandırmaz; karar verme biçimini de değiştirir. En önce görüleni değil, en önce ele alınması gerekeni öne çıkarır.

PriorityQueue Nasıl Çalışıyor?

Bilmem anlatabiliyor muyum, Java’daki PriorityQueue varsayılan olarak min-heap mantığıyla çalışıyor. Yani compareTo içinde küçük değer daha yüksek öncelik anlamına geliyorsa, kuyruk otomatik olarak onu tepede tutuyor. Biz tehdit senaryosunda genelde “yakın olan daha tehlikelidir” yaklaşımı kullanıyoruz; mesafe küçüldükçe öncelik artıyor, mantıklı değil mi?

Vallahi, Geçen mart ayında İzmir’de bir arkadaşımın oyun projesinde buna benzer bir yapı gördüm. Onlarda düşmanların saldırı menzili farklıydı ve hangi NPC’nin önce işlem göreceği önemliydi. İlk başta random seçim yapmışlardı… sonuç tahmin edersiniz, biraz saçmaydı. Priority queue’ye geçince davranış baya toparladı (inanın bana). Ciddi fark var.

Hmm, bunu nasıl anlatsamdı… Daha fazla bilgi için SolidForge: MagSafe’li dayanıklı power bank neden konuşuluyor? yazımıza bakabilirsiniz.

Kritik Nokta: compareTo

compareTo metodu aslında karar kapısı gibi çalışıyor. Java’ya diyorsunuz ki: “İki hedef karşılaşırsa hangisi öne çıkacak?” Tehdit örneğinde daha yakın olan hedefi öne almak için mesafeyi karşılaştırıyorsunuz.

import java.util.PriorityQueue;
class Target implements Comparable<Target> {
String name;
double distance;
public Target(String name, double distance) {
this.name = name;
this.distance = distance;
}
@Override
public int compareTo(Target other) {
return Double.compare(this.distance, other.distance);
}
}
public class CombatSystem {
public static void main(String[] args) {
PriorityQueue<Target> radarScope = new PriorityQueue<>();
radarScope.add(new Target("Mig-29", 1500.5));
radarScope.add(new Target("Surface-to-Air Missile", 400.2));
radarScope.add(new Target("Unknown Drone", 3000.0));
while (!radarScope.isEmpty()) {
Target highestThreat = radarScope.poll();
System.out.println("Processing Threat: " + highestThreat.name + " at " + highestThreat.distance + "m");
}
}
}

Şahsen, Buradaki güzellik şu: siz her seferinde manuel sıralama yapmıyorsunuz. Yapının kendisi hallediyor bunu. E tabi bedava değil; priority tanımını iyi kurmanız lazım çünkü yanlış compareTo yazarsanız kuyruk da yanlış karar verir — sonra hata datada sanılır ama suç çoğu zaman sıralama mantığındadır. Bunu bir kez yaşayınca bir daha unutmuyorsunuz. Google’ın Tap to Share Hamlesi: NameDrop’a Cevap mı? yazımızda bu konuya da değinmiştik.

💡 Bilgi: PriorityQueue Java’da doğal olarak sıralı liste değildir; yalnızca tepedeki öğeyi garanti eder. İç dizilim tamamen heap kurallarına göre şekillenir ve bu yüzden poll() işlemi özellikle değerlidir.

Ekleme, Alma ve Yeniden Düzenleme Mantığı

Size bir şey söyleyeyim, Peki perde arkasında ne oluyor? Yeni bir hedef eklendiğinde Java onu heap içinde uygun yere doğru yukarı taşıyor; buna kabaca “bubbles up” denebilir. Yani yeni gelen öğe hemen başa geçmiyor — ama hak ettiği konuma tırmanıyor. Bu tırmanma işi, tüm listeyi yeniden taramaktan çok daha az maliyetli tabii ki. Yapay Zekâ Ajanı Ne Yaptı?: Kanıtlayabiliyor musun? yazımızda bu konuya da değinmiştik.

Tuhaf ama, Bir öğeyi poll() ile aldığınızda ise kök düğüm çıkarılıyor ve yapı yeniden dengeleniyor (re-heapify). Kulağa ağır gelebilir. Ama değil aslında — tüm listeyi baştan sona sıralamazsınız, bu önemli.

İşlem Düz Liste PriorityQueue
Ekleme Zor değil ama öncelik yok Siparişli yerleşim için heap düzeni var
En yüksek önceliği bulma Sık sık tarama gerekir Tepedeki öğe hazır gelir
Büyük veri setinde performans Zayıflayabilir Daha stabil kalır
Kod sadeliği Basit görünebilir Daha disiplinli yapı ister

Açık konuşayım, bu tablo kâğıt üstünde süper duruyor. Ama asıl fark veri büyüdüğünde ortaya çıkıyor. Küçük startup ortamında belki göz ardı edersiniz; enterprise tarafta ise saniyenin kesri bile önemli çünkü log akışı, alarm sistemi (bu konuda ikircikliyim). Mantıklı değil mi? Kullanıcı deneyimi birbirine bağlıdır — birinde gecikme olunca zincirleme etki başlar.

Nerede İşe Yarar, Nerede Sınıfta Kalır?

Küçük ekipler için durum ne?

Küçük projelerde PriorityQueue bazen fazla mühendislik gibi hissedilebilir. Hissedilir, evet. Ama yine de öğretici. Mantıklı değil mi? Temiz bir çözümdür; özellikle olayların önem derecesi varsa — mesela bildirim sistemi, görev planlayıcı ya da oyun içi AI — çok mantıklı bir tercih olduğunu düşünüyorum.

Buna karşılık sadece birkaç öğelik veriyle uğraşıyorsanız basit dizi ya da ArrayList gayet yeterli. Ne yani… her soruna heap mi? Tabii ki hayır.

Büyük sistemlerde neden daha parlak?

Büyük sistemlerde farklı kaynaklardan gelen sinyalleri aynı anda topluyorsunuz ve bunları risk puanı ya da mesafeye göre ayıklıyorsunuz; işte tam burada priority queue ciddi rahatlık sağlıyor çünkü karar mekanizmasını merkezileştiriyor, dağınık if-else yığınlarına gerek kalmıyor. Maaş bordrosu gibi düşünmeyin sadece — kriz yönetimi gibi düşünün. Bir uçuş simülatörü veya güvenlik panelinde yanlış sıralama yüzünden can alıcı uyarının gecikmesi… hoş olmazdı. Düpedüz hayal kırıklığı olurdu.

Neden Bu Yaklaşım Daha Mühendisçe Hissettiriyor?

Şunu fark ettim: Çünkü problemle çözüm arasında doğrudan bağ kuruyorsunuz. Güzel yani tam da burada yatıyor bence. Önce verinin niteliğini düşünüyorsunuz, sonra ona uygun veri yapısını seçiyorsunuz — kopyala-yapıştır çalışan kod yerine niyet taşıyan kod yazmış oluyorsunuz. Bu fark küçük görünür ama ekip içinde okunabilirliği baya artırıyor, bir de kod review’larda “bunu neden böyle yaptın?” sorusunu önlüyor.

Editör masasında bu haberi hazırlarken kendi kendime şunu not ettim: iyi algoritma çoğu zaman ekstra süslü kod değil (yanlış duymadınız). Bazen tam tersine daha sade görünüyor ama arkada daha akıllıca davranıyor. PriorityQueue de öyle işte. Gösterişsiz, fakat gerektiğinde tokat gibi performans veriyor. AI Ajanınıza UX Denetimi Süper Gücü: CLI + MCP ile Hızlı Başlangıç yazımızda da bu konuya değinmiştik. Telefonundan Çalışan Yapay Zekâ: PLC Ustası Olmadan Önce yazımızda da bu konuya değinmiştik.

  • Daha az manuel sıralama ihtiyacı olur.
  • En kritik hedefe hızlı erişirsiniz. (bu kritik)
  • Karmaşık öncelik kurallarını tek yerde toplarsınız. (bu kritik)
  • Büyük ölçekli sistemlerde performans daha tutarlı olur. (bu kritik)

Tasarım İpuçları ve Ufak Tuzaklar!

Şu ufak detaya bakın: birkaç detay var, lafı gevelemeden söyleyeyim. İlki — eşit öncelikli öğeler geldiğinde ne olacağını netleştirmek. Çünkü iki hedef aynı mesafedeyse kuyruk hangisini önce verecek? Bunun cevabı tasarıma bağlı, yoksa sonuçlar bazen şaşırtıcı olabiliyor. Şaşırtıcı derken “vay be” değil, “neden böyle çıktı” türünden şaşkınlık.

İkincisi, comparator ile compareTo uyumunu bozmamak. Bir yerde doğal sıralama, başka yerde özel comparator kullanıp kafa karıştırırsanız debugging işi uzar gider… hani insan bakarken “bu neden böyle oldu?” diye kendi kendine söylenir ya, aynen o mod. Saatlerce sürebilir bu arayış.

Üçüncüsü de şu: PriorityQueue mucize değil. Sadece doğru problemi doğru araçla çözüyor. Eğer sizin senaryonuzda aralık sorguları, kompleks filtreler veya çok boyutlu skorlamalar varsa başka yapıların da devreye girmesi gerekebilir; burada tek kahraman olmuyor yani. Bunu bilerek kullanırsanız, gerçekten güçlü bir araç.

Sıkça Sorulan Sorular

Java PriorityQueue varsayılan olarak nasıl sıralar?

Varsayılan davranış min-heap’tir; yani en küçük değer tepeye çıkar. Eğer kendi sınıfınızı kullanıyorsanız compareTo veya Comparator ile bu düzeni siz belirlersiniz.

Büyük veri setlerinde ArrayList yerine neden PriorityQueue seçilir?

Çünkü en yüksek öncelikli öğeyi bulmak için tüm listeyi taramak yerine tepeden doğrudan erişirsiniz. Bu da özellikle yoğun olay akışında performansı toparlar.

Tie durumlarında ne olur?

Küçük bir detay: Aynı öncelikteki öğelerin sırası garanti edilmez. Eğer kesin sıra istiyorsanız ikincil bir kıstas eklemeniz gerekir ; mesela zaman damgası gibi.

PQ her durumda List’ten iyi midir?

Hayır, değil. Veri azsa ya da özel sıralama gerekmiyorsa düz liste daha basit olabilir. Doğru araç, doğru problemde iyi sonuç verir ; klasik ama gerçek bu.

Kaynaklar ve İleri Okuma

Oracle Java PriorityQueue Dokümantasyonu

Doğrusu, Java Queue Interface Tutorial — Oracle

OpenJDK Kaynak Kodu (GitHub)

Aşkın KILIÇ

20+ yıl deneyimli Azure Solutions Architect. Microsoft sertifikalı bulut mimari ve DevOps danışmanı. Azure, yapay zekâ ve bulut teknolojileri üzerine Türkçe teknik içerikler üretiyor.

AZ-305AZ-104AZ-500AZ-400DP-203AI-102

Bu içerik işinize yaradı mı?

Benzer içerikleri kaçırmamak için beni sosyal medyada takip edin.

Haftalık Bülten

Her pazar özenle seçilmiş teknoloji yazıları doğrudan e-postanıza gelsin.

← Onceki Yazi
Yapay Zekâ Ajanı Ne Yaptı?: Kanıtlayabiliyor musun?
Sonraki Yazi →
AI Ajanınıza UX Denetimi Süper Gücü: CLI + MCP ile Hızlı Başlangıç

Yorum Yaz

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Haftalık Bülten

Azure, DevOps ve Yapay Zeka dünyasındaki en güncel içerikleri her hafta doğrudan e-postanıza alın.

Spam yok. İstediğiniz zaman iptal edebilirsiniz.
📱
Uygulamayı Yükle Ana ekrana ekle, çevrimdışı oku
Kategoriler
Ara
Paylaş
İçindekiler
← Yapay Zekâ Ajanı Ne Yaptı?: Ka...
AI Ajanınıza UX Denetimi Süper... →
📩

Gitmeden önce!

Her pazar özenle seçilmiş teknoloji yazıları ve AI haberleri doğrudan e-postanıza gelsin. Ücretsiz, spam yok.

🔒 Bilgileriniz güvende. İstediğiniz zaman ayrılabilirsiniz.

📬 Haftalık bülten: Teknoloji + AI haberleri