Mimari Bakış

Summary

Üç dağıtılabilir birim, bir felsefe: edge-first. Cloudflare’ın global ağı üzerinde çalışan ince bir API, gerçek işin çoğunu önbellek ve CI’da derlenmiş veri ile halleder.

Sistem Resmi

flowchart LR
  subgraph "İstemciler"
    Web[Web Tarayıcı<br/>React SPA]
    APK[Android Uygulaması<br/>Capacitor WebView]
  end

  subgraph "Cloudflare Ağı"
    Pages[Cloudflare Pages<br/>Statik SPA]
    Worker[Hono Worker<br/>/api/*]
    KV[(KV Önbellek)]
    R2[(R2 Veri Kümeleri)]
  end

  Upstream[Denizli Resmi API]
  Pharmacy[Eczane Sayfası]
  PB[(PocketBase<br/>Geri Bildirim)]

  Web --> Pages
  APK -->|webview| Pages
  Pages -->|binding| Worker
  Worker --> KV
  Worker --> R2
  Worker -->|fetch + cache| Upstream
  Worker -->|scrape + cache| Pharmacy
  Web -->|geri bildirim| PB

Dağıtılabilir Birimler

BirimKoşan YerAmaç
Web SPACloudflare PagesTüm UI’ı barındırır, CDN ile global servis
API WorkerCloudflare WorkersResmi API’nin önünde önbellekli uç proxy
Android ShellPlay Store hazır APKAynı web kodunu native kabukta servis eder

Tasarım Kararları (Özet)

1. Neden Cloudflare Workers?

  • Ücretsiz katmanda küresel uç bilişim.
  • Kullanıcı yakınında çalışır → sub-50ms ilk yanıt.
  • KV önbellek, R2 nesne depolama ve Pages ile entegre.
  • Cold start yok.

2. Neden Önbellek Katmanı?

Yukarı akış API’si bazen yavaş, bazen geçici olarak çöküyor. Önbellek şunları sağlar:

  • Hız: KV okuması mikrosaniyelik.
  • Dayanıklılık: Yukarı akış çöker, biz çalışmaya devam ederiz.
  • Maliyet: Çağrı sayısı azalır → kaynak tasarrufu.
  • CPU bütçesi: 10 ms’lik Workers CPU limiti kolayca karşılanır.

3. Neden CI’da Veri Derleme?

Rota planlayıcı için gereken veri kümesi (duraklar, hatlar, geometriler) statik sayılacak kadar yavaş değişir. CI’da günde bir derlenip R2’ye yüklenir; Worker çalışma zamanında sadece okur.

flowchart LR
  Cron[Zamanlanmış İş<br/>GitHub Actions] --> Fetch[Yukarı Akıştan Çek]
  Fetch --> Compile[Veri Setini Derle]
  Compile --> Validate[Doğrulama]
  Validate --> Publish[R2'ye Yayınla]
  Publish --> Manifest[Manifest'i Güncelle]

4. Neden Tek Kod Tabanı (Web + Android)?

Capacitor 8, mevcut web derlemesini Android WebView içine paketler. Avantaj: UI eşitliği otomatik.

Katmanlar

flowchart TB
  UI["Sunum Katmanı<br/>(React + Tailwind + shadcn/ui)"]
  State[Durum Katmanı<br/>TransitContext + custom hooks]
  API[Veri Katmanı<br/>İnce fetch istemcileri]
  Edge[Uç API<br/>Hono üzerinde Worker]
  Cache[Önbellek<br/>Cloudflare KV]
  Data[Veri<br/>Cloudflare R2 + Upstream]

  UI --> State
  State --> API
  API --> Edge
  Edge --> Cache
  Edge --> Data

Ölçeklenebilirlik

  • Yatay: Cloudflare uç ağı otomatik — yük sunucuya değil, dünyanın her yerindeki edge’e dağılır.
  • Dikey: Gerek yok; her istek birkaç KB veri ve <10 ms CPU tüketir.
  • Trafiğe dayanıklı: Yukarı akış yavaşlasa bile cache TTL dolana kadar kullanıcı etkilenmez.

Dayanıklılık

RiskAzaltma
Yukarı akış API çökerKV’de stale-if-error; kullanıcı eski ama geçerli veri görür
CI veri derleme hatasıÖnceki manifesti geri alma (rollback) tek tıkla
Worker hatası500 → JSON yanıt + Cloudflare dashboard’da stack trace
Kullanıcı çevrimdışıPlanlayıcı tarayıcı içinde çalışır

Güvenlik Duruşu

  • Tüm API public; kimlik doğrulama yok.
  • PII toplanmaz; geri bildirim formunda ad/e-posta opsiyonel.
  • CORS wildcard (*) — API bilinçli olarak topluma açık.
  • Feedback endpoint’i IP bazlı hız sınırlaması ile korunur.

Devamı