Team A: Metehan GÜNEN, A. Baran DİKMEN, Neriman AKÇA, Mustafa YILDIRIM, H. Melih YEŞİL
Bu proje, modern web uygulamalarında sıkça karşılaşılan uzun süren işlemleri ("örn. harici API çağrıları") kullanıcıyı bekletmeden asenkron olarak işleyen bir web servisi geliştirmeyi amaçlamaktadır. Ayrıca, servisin sağlık durumunu ve performansını gerçek zamanlı olarak izleyebilmek için metrik toplama yetenekleri de entegre edilmiştir.
📌 Son Güncelleme (PR:
feature/k6-load-test-optimization
)
K6 test senaryosu 202 durum kodunu tanıyacak şekilde optimize edildi. Gönderilen isteklerin sonucunu kontrol edenstatus
endpoint'i için, arka planda işlem tamamlanana kadar tekrar eden sorgular (polling) eklendi. Bu sayede daha doğru başarı oranı hesaplandı ve önceki check hataları giderildi. Ayrıca Grafana üzerinden izlenebilen P95/P99 gibi uç değer metriklerine daha sağlıklı veri akışı sağlandı.
- Asenkron İşleme: Gelen istekleri hızlıca kabul edip, asıl işleme mantığını arka plana taşıyarak kullanıcı deneyimini iyileştirmek.
- Durum Takibi: Arka planda işlenilen isteklerin mevcut durumunu sorgulayabilme yeteneği sağlamak.
- Performans İzleme: Uygulama performansını ve kaynak kullanımını izlemek için Prometheus metriklerini toplamak ve sunmak.
- Docker Kullanımı: Tüm bileşenleri (Node.js uygulaması, PostgreSQL veritabanı) izole, tutarlı ve taşınabilir Docker konteynerleri içinde çalıştırmak.
- Node.js & Express.js
- PostgreSQL
- Docker & Docker Compose
- Prometheus (
prom-client
) - Grafana
- k6
- Diğer Kütüphaneler:
pg
,uuid
,dotenv
,axios
src/domain/request.js
içinde immutableRequest
sınıfı tanımlandı.- Nesne değişikliği yerine
with
metotları ile yeni örnekler üretiliyor. Object.freeze()
vedeep clone
teknikleriyle veri güvenliği sağlandı.
- Sabitler:
src/config/constants.js
ile magic number ve stringler merkezileştirildi. - Özel Hata Sınıfları:
src/utils/errors.js
altında kapsamlı hata sınıfları tanımlandı. - Servis Katmanı:
src/services/requestService.js
ile iş mantığıapp.js
’ten ayrıldı. - Altyapı:
src/infrastructure/
klasörü altında DB, mock servis ve metrikler ayrıştırıldı.
app.js
içine global hata yakalayıcı middleware eklendi.- Her hata sınıfı, anlamlı HTTP kodlarıyla istemciye geri dönüyor.
- Adlandırmalar: PascalCase (sınıf), camelCase (değişken), UPPER_SNAKE_CASE (sabit).
- Kapsülleme:
Request
sınıfında özel alanlar (#
) ile iç durum gizlendi. - Bağımlılık Enjeksiyonu: Test edilebilirliği artıracak şekilde uygulandı.
.env
,Dockerfile
,docker-compose.yml
,package.json
vb. dosyalar yeni yapıya uygun hale getirildi.- PostgreSQL şeması
schema.sql
altında tutulmaktadır.
AsyncRequest/
├── load-tests/
│ └── submit-test.js # K6 ile yük testi senaryosu
│
├── node-app/
│ ├── domain/
│ │ └── request.js # Domain nesnesi tanımı
│ │
│ ├── handlers/
│ │ ├── status.js # /status handler
│ │ └── submit.js # /submit handler
│ │
│ ├── infrastructure/
│ │ ├── db.js # Veritabanı bağlantısı
│ │ ├── metrics.js # Prometheus metrik tanımları
│ │ └── mockService.js # Harici servis simülasyonu
│ │
│ ├── services/
│ │ └── requestService.js # İş mantığı servisi
│ │
│ ├── src/
│ │ ├── config/
│ │ │ └── constants.js # Sabitler
│ │ │
│ │ └── utils/
│ │ ├── errors.js # Özel hata sınıfları
│ │ └── logger.js # Loglama mantığı
│ │
│ ├── validators/
│ │ └── submitValidator.js # Submit için doğrulayıcı
│ │
│ ├── app.js # Express sunucusu (main)
│ ├── .env # Ortam değişkenleri
│ ├── Dockerfile # Node.js Docker yapılandırması
│ ├── docker-compose.yml # Tüm bileşenlerin orkestrasyonu
│ ├── package.json # Bağımlılıklar ve script'ler
│ ├── package-lock.json # Bağımlılık kilidi
├── prometheus.yml # Prometheus yapılandırması
├── schema.sql # PostgreSQL şema tanımı
└── README.md # Ana dokümantasyon
Yük testi senaryosu k6
ile yazılmıştır. submit-test.js
dosyasında:
POST /submit
çağrısı 202 döndüğünde geçerli sayılır.- Dönen
requestId
, işlem tamamlanana kadarGET /status/:id
ile 5 defaya kadar sorgulanır. - Test sırasında polling uygulanarak başarı durumları daha doğru şekilde belirlenir.
cd ./load-tests/
docker run --rm -i -v ${PWD}:/scripts grafana/k6 run /scripts/submit-test.js
✅ Gözlemlenen İyileştirmeler:
check failed
oranı azaldıstatus
endpoint'ine zamanında istek gönderilerek gerçek 200 yanıtları alınabildi- Prometheus üzerinden gözlemlenen
http_request_duration_seconds
metrikleri,histogram_quantile
ile P95/P99 latency hesaplamalarına daha doğru veri sağladı
- Test kapsamı ve merkezi loglama
- Dokümantasyon hazırlama ve raporlama