Her gün milyonlarca insanın cep telefonunda bildirim olarak düşen namaz vakitleri verisi, aslında bir yazılım mühendisliği mucizesidir: astronomik hesaplama, coğrafi koordinat sistemi, zaman dilimi dönüşümü ve dağıtık sistemlerin aynı anda çalışmasını gerektirir. Bu yazıda, namaz vakitlerini hesaplayan API'lerin arkasındaki algoritmaları, karşılaştığımız veri tutarlılığı sorunlarını ve üretim ortamında bu sistemleri nasıl ölçeklendirdiğimizi anlatacağım.
Namaz Vakitleri Hesaplamasının Temel Algoritmaları
Namaz vakitleri, güneşin ufka göre açısal pozisyonuna dayanan astronomik formüllerle hesaplanır. En yaygın kullanılan algoritmalar arasında Mecca (Makkah) Üniversitesi yöntemi, Mısır Genel Harita Kurumu yöntemi, Islamic Society of North America (ISNA) ve Muslim World League (MWL) bulunur. Her biri farklı açı değerleri kullanır: Örneğin, İmsak vakti için MWL 18 derece, ISNA 15 derece, Diyanet İşleri Başkanlığı ise 18 derece açı kullanır. Bu farklılıklar, aynı koordinat için saat farkına yol açar.
Güneşin merkezi ile ufuk arasındaki açıyı hesaplamak için sun_position kütüphanesi veya astral Python paketi gibi araçlar yaygın olarak kullanılır. Ancak üretim ortamında dikkat edilmesi gereken kritik bir nokta: Atmosferik kırılma (refraction) ve yükseklik (elevation) düzeltmesi. Deniz seviyesinden 2000 metre yükseklikte bir şehirde, standart algoritma 3-5 dakikalık sapma üretebilir. Bu nedenle, astral kütüphanesi kullanırken Elevation parametresini doğru ayarlamak zorunludur.
Koordinat Tabanlı API Mimarisi ve Veri Kaynakları
Namaz vakitleri API'leri genellikle iki katmanlıdır: kullanıcıdan alınan enlem/boylam bilgisini işleyen bir sunucu katmanı ve astronomik hesaplamaları yapan bir hesaplama motoru. Biz üretim ortamında Go dilinde yazılmış, Redis önbellekleme katmanı olan bir mikroservis mimarisi kullandık. Her gün yaklaşık 2 milyon API isteğini karşılamak zorundaydık ve hesaplama süresi 5 ms'nin altına indi.
Veri kaynağı olarak Time and Date astronomik veritabanı ve Aladhan API referans alınabilirAncak bu dış kaynaklara bağımlı kalmak yerine, kendi hesaplama motorumuzu geliştirdik. Bunun nedeni, üçüncü taraf API'lerin günlük istek kotası ve gecikme süreleriydi. Kendi motorumuzu geliştirirken, Astronomical Almanac tarafından yayınlanan standart denklemleri kullandık ve testlerimizi NREL Solar Position Algorithm (SPA) ile doğruladık.
Zaman Dilimi Dönüşümleri ve Yaz Saati Uygulaması
Namaz vakitleri hesaplanırken en sık yapılan hatalardan biri, zaman dilimi dönüşümlerinde ortaya çıkar. UTC'den yerel saate geçerken, yaz saati uygulaması (DST) geçiş günlerinde hesaplamalar 1 saat kayabilir. Örneğin, Amerika Birleşik Devletleri'nde Mart ayının ikinci Pazar günü saat 02:00'de saatler ileri alınırken, Avrupa'da geçiş tarihleri farklıdır. Bu tür hataları önlemek için pytz kütüphanesi veya tzdata veritabanı kullanılmalı, manuel saat ekleme/çıkarma yapılmamalıdır.
Üretim ortamında karşılaştığımız bir vaka: Kullanıcı Londra'dan bir istek gönderdiğinde, yaz saati geçiş gününde öğle vakti 12:05 yerine 13:05 olarak görüntüleniyordu. Sorun, datetime nesnesinin is_dst parametresini doğru işlememekten kaynaklanıyordu. and Çözüm olarak, dateutil kütüphanesindeki tzgettz() fonksiyonuna geçtik ve tüm zaman damgalarını UTC'ye çevirip sonra yerel saate dönüştürdük.
Mobil Uygulamalarda Arka Plan Hesaplama ve Bildirim Yönetimi
Bir mobil uygulamada namaz vakitlerini doğru şekilde göstermek için arka plan görevleri ve bildirim yönetimi kritik öneme sahiptir iOS tarafında BGTaskScheduler, Android tarafında WorkManager kullanarak günde iki kez (gece yarısı ve öğle vakti sonrası) hesaplamaları tazeliyoruz. Ancak işletim sistemi arka plan kısıtlamaları nedeniyle, hesaplamaların %100 doğrulukta çalışması garanti değildir. Bu nedenle, kullanıcı uygulamayı her açtığında son hesaplanan vakitleri kontrol ediyoruz.
Bildirim gönderme zamanlaması da ayrı bir mühendislik problemidir. Namaz vakitlerine birim zamanda duyarlı bildirimler için UNUserNotificationCenter (iOS) veya AlarmManager (Android) kullanılır. Ancak Android 12 ve sonrasında SCHEDULE_EXACT_ALARM izni kaldırıldığından, tam zamanlı bildirimler için AlarmManager setAlarmClock() API'sine geçmek zorunda kaldık.
İmsak ve Güneş Vakti Arasındaki Fark Hesaplama Doğruluğu
İmsak vakti, astronomik alacakaranlık (astronomical twilight) olarak tanımlanır ve genellikle güneşin ufkun 18 derece altında olduğu an olarak hesaplanır. Ancak bazı bölgelerde bu açı 15 dereceye düşebilir. Üretim ortamında, kullanıcının konumuna bağlı olarak dinamik bir açı değeri kullandık. Bunu yaparken, enlem değerine göre açıyı hesaplayan bir fonksiyon yazdık: 60 derece enlem üzerindeki bölgelerde, gece hiç tam karanlık olmadığı için, geleneksel yöntemler geçersiz hale geliyor.
Bu durumda, PrayTimes, and org hesaplama yöntemi referans alınabilirAncak biz kendi testimizde, doğru sonucu almak için nearest_latitude parametresini kullandık ve 48 derece enlem üzerindeki şehirlerde farklı bir algoritma devreye soktuk.
Sunucu Tarafında Önbellekleme ve Trafik Yönetimi
Namaz vakitleri API'si saniyede binlerce istek alabilir. Hesaplama her istek için tekrarlanırsa, CPU yükü ciddi şekilde artar. Bunun önüne geçmek için, Redis ile 24 saatlik önbellekleme kullandık. Her şehir için sabah 03:00 UTC'de hesaplanan vakitler önbelleğe alınır ve gün boyunca aynı veri sunulur. Bu sayede, aynı şehir için gelen 1000 istekten sadece ilki hesaplama yapar, kalan 999'u önbellekten okur.
Redis'te veri yapımız: prayer_times:{city_id}:{date} şeklindedir. TTL (Time To Live) süresi, bir sonraki günün hesaplama zamanına kadar (genellikle 24 saat) ayarlanır. Ancak DST geçiş günlerinde TTL'yi manuel olarak 23 veya 25 saate ayarlamak gerekebilir.
Veri Doğrulama ve Test Stratejileri
Bir namaz vakitleri API'sinin doğruluğunu test etmek kolay değildir. Her şehir, her gün için ayrı bir beklenen değer vardır. Biz testlerimizi iki aşamalı yapıyoruz: birim testler ve entegrasyon testleri. Birim testlerde, belirli bir koordinat ve tarih için hesaplanan değerleri, Diyanet İşleri Başkanlığı'nın resmi yayınladığı verilerle karşılaştırıyoruz. Entegrasyon testlerinde ise, API'nin uçtan uca çalışmasını doğruluyoruz.
Birim testlerde kullandığımız örnek: Ankara (399334° K, 32. 8597° D) için 15 Nisan 2025 tarihinde öğle vakti 12:45 olarak hesaplanmalıdır. Eğer hesaplama 2 dakikadan fazla sapma gösteriyorsa, test başarısız sayılır. Bu tür bir doğrulama için, her gün güncellenen bir referans veri kümesi tutuyoruz.
Namaz Vakitleri API'si İçin Güvenlik ve Otorizasyon
Herkesin erişebildiği bir API, kötüye kullanıma açıktır. Biz API'mizde API key tabanlı otorizasyon kullanıyoruz. Her kullanıcıya bir key veriliyor ve bu key ile günde maksimum 10. 000 istek yapılabiliyor. Ayrıca, rate limiting katmanı olarak Nginx üzerinde limit_req_zone direktifi kullanıyoruz. Bu sayede, tek bir IP'den saniyede 100 istekten fazlası engelleniyor.
Güvenlik açısından dikkat edilmesi gereken bir diğer nokta, kullanıcının konum bilgisinin doğruluğudur. And kullanıcıdan alınan enlem/boylam değerleri, sunucu tarafında doğrulanmalıdırÖrneğin, enlem -90 ile 90 arasında, boylam ise -180 ile 180 arasında olmalıdır. Aksi takdirde, hesaplama motoru çökebilir veya yanlış değer üretebilir.
Sık Sorulan Sorular (FAQ)
- Namaz vakitleri neden şehirden şehire değişir? Namaz vakitleri, güneşin konumuna bağlıdır. Her şehrin enlem ve boylamı farklı olduğundan, güneşin doğuş ve batış saatleri farklılık gösterir. Ayrıca kullanılan hesaplama yöntemi (açı değeri) da sonucu etkiler.
- Hangi namaz vakitleri hesaplama yöntemi daha doğrudur? Hangi yöntemin daha doğru olduğu, coğrafi bölgeye ve dini otoriteye bağlıdır. Türkiye için Diyanet İşleri Başkanlığı'nın kullandığı yöntem (18 derece açı) genellikle referans alınır. Ancak yüksek enlemlerde alternatif yöntemler kullanılmalıdır.
- Kendi namaz vakitleri hesaplama uygulamamı yapabilir miyim? Evet, açık kaynak kütüphaneleri (
astral,praytimes) kullanarak kendi hesaplama motorunuzu yapabilirsiniz. Ancak atmosferik kırılma, yükseklik ve zaman dilimi dönüşümlerini doğru işlemeniz gerekir. - Mobil uygulamada arka planda namaz vakitlerini nasıl güncellerim? iOS'ta
BGTaskScheduler, Android'deWorkManagerkullanarak günde 1-2 kez periyodik güncelleme yapabilirsiniz. Ayrıca uygulama açıldığında son güncellenen veriyi kontrol edin. - Namaz vakitleri API'si için hangi veri kaynağını kullanmalıyım? Aladhan API veya Time and Date astronomik veritabanı gibi dış kaynakları kullanabilirsiniz. Ancak yüksek trafikli uygulamalar için kendi hesaplama motorunuzu geliştirmenizi öneririm.
Gelecek Trendler: Makine Öğrenimi ile Vakit Tahmini
Geleneksel astronomik yöntemlerin yanında, makine öğrenimi modelleriyle namaz vakitleri tahmini yapmak mümkün mü? Biz deneysel olarak, geçmiş 10 yıllık Diyanet verilerini kullanarak bir LSTM
.Need a Custom App Built?
Let's discuss your project and bring your ideas to life.
Contact Me Today →