identity-service
OpenID Connect sağlayıcısı. Cihaza bağlı session'lar, TOTP ile iki adımlı doğrulama, harici sağlayıcılarla giriş, KVKK ve GDPR'a uygun hesap silme.
Diğer servislerin kullandığı token’ları üretir, session’ları tutar.
- Session açıldığı cihaza bağlıdır; iptal edilen session iptal zamanını ve sebebini tutar.
- TOTP ile iki adımlı doğrulama.
- Harici sağlayıcılarla giriş, sağlayıcı başına bir adapter; sağlayıcı, gerçek sağlayıcıya karşı bir girişle denendikten sonra eklenir.
- Hesabı kullanıcı siler; diğer servisler kendi verilerini
identity.user.deletedevent’iyle siler. - Entegrasyon testleri Postgres ve Redis üzerinde koşar; yük testleri aşağıda.
- Infrastructure reposundan AWS’ye istek üzerine kurulur, iş bitince kaldırılır.
Yük testleri
Her test için AWS instance’larını infrastructure reposu açar: nginx, servis, PostgreSQL 18, Redis ve Mailpit’in birlikte çalıştığı bir makine ve aynı subnet’te ayrı bir yük üreteci. Her adım 60 saniyelik üç çalıştırma; gecikme grafikleri üç p99’un medyanını gösterir. Kapasite, sunucu geri kalmadan limitin altında kalınan en yüksek adım.
Güncel sürüm, c7a.large üzerinde, 2 çekirdek:
- Saniyede 100 parolalı giriş, p99 250 ms’nin altında.
- Saniyede 1.200 token yenileme, p99 50 ms’nin altında; nginx servise Unix socket üzerinden bağlanıyor.
- Her 144 yenilemeye bir giriş düşen karışım saniyede 1.200 istekte tuttu: 600 saniyede bir yenileme yapan yaklaşık 720.000 aktif kullanıcı.
İlk test serisi 2 ve 4 çekirdeği karşılaştırdı:
- c7a.large, 2 çekirdek
- c7a.xlarge, 4 çekirdek
- limit, 250 ms
p99, ms
saniyede giriş
| saniyede giriş | p99, ms |
|---|---|
| 17 | 28,8 |
| 35 | 29,8 |
| 48 | 39,8 |
| 55 | 52,6 |
| 62 | 82,4 |
| 69 | 115,4 |
| 76 | 136,3 |
| saniyede giriş | p99, ms |
|---|---|
| 34 | 23,4 |
| 69 | 28,6 |
| 96 | 33,3 |
| 110 | 38,4 |
| 123 | 45,5 |
| 137 | 55,5 |
| 151 | 68,4 |
Kapasite 2 çekirdekte saniyede 76, 4 çekirdekte 151 giriş: bir sonraki adımda sunucu geri kaldı. Her giriş bir Argon2id hash'i doğruladığı için giriş kapasitesi çekirdek sayısıyla artıyor.
- c7a.large, 2 çekirdek
- c7a.xlarge, 4 çekirdek
- limit, 50 ms
p99, ms
saniyede yenileme
| saniyede yenileme | p99, ms |
|---|---|
| 237 | 6 |
| 474 | 12,3 |
| 663 | 20,8 |
| 758 | 27 |
| 852 | 33,2 |
| 947 | 42,6 |
| 1.042 | 49,9 |
| 1.184 | 92,8 |
| saniyede yenileme | p99, ms |
|---|---|
| 463 | 4,3 |
| 925 | 6,1 |
| 1.295 | 8,9 |
| 1.480 | 11,5 |
| 1.665 | 15,7 |
| 1.850 | 23,2 |
Kapasite 2 çekirdekte saniyede 1.042, 4 çekirdekte 1.850. 2 çekirdekte tavanda bütün makine %96 doluydu: nginx, PostgreSQL ve Redis çekirdekleri tek Node.js süreciyle paylaşıyor.
- TCP
- Unix socket
- limit, 50 ms
p99, ms
saniyede yenileme
| saniyede yenileme | TCP | Unix socket |
|---|---|---|
| 300 | 6 | 6,1 |
| 600 | 12,9 | 13,3 |
| 840 | 24,6 | 21,7 |
| 960 | 29,6 | 26,7 |
| 1.080 | 37 | 32,1 |
| 1.200 | 50,9 | 38,6 |
| 1.320 | 72,4 | 58,9 |
Kapasite TCP'de saniyede 1.080, socket'te 1.200: %11 fazla. nginx ile yayınlanmış port arasındaki her byte'ı kopyalayan docker-proxy tavanda bir çekirdeğin onda birine yakınını kullandı; socket'te bu iş yok.
Giriş kapasitesi aşıldığında ilk sürüm, hash’ini bekleyen her girişi bir kuyrukta tutuyordu. Güncel sürüm kuyruğu sınırlıyor: kapasite aşılınca giriş hemen 503 ve Retry-After ile reddediliyor, bir saniyeden uzun bekleyen giriş de doğrulanmadan reddediliyor.
- Sınırsız kuyruk
- Sınırlı kuyruk
- kapasitenin iki katı
başarılı girişler, %
aşırı yükün başından itibaren saniye, girişin gönderildiği ana göre
| aşırı yükün başından itibaren saniye, girişin gönderildiği ana göre | Sınırsız kuyruk | Sınırlı kuyruk |
|---|---|---|
| -15 | 100 | 100 |
| -10 | 100 | 100 |
| -5 | 100 | 100 |
| 0 | 100 | 50,1 |
| 5 | 67,7 | 52,6 |
| 10 | 0 | 54 |
| 15 | 0 | 54,3 |
| 20 | 0 | 55,7 |
| 25 | 0 | 55,1 |
| 30 | 0 | 55,5 |
| 35 | 0 | 55,8 |
| 40 | 0 | 55 |
| 45 | 0 | 54,2 |
| 50 | 0 | 55,7 |
| 55 | 0 | 57,3 |
| 60 | 0 | 100 |
| 65 | 0 | 100 |
| 70 | 0 | 100 |
| 75 | 0 | 100 |
| 80 | 0 | 100 |
| 85 | 0 | 100 |
| 90 | 0 | 100 |
| 95 | 0 | 100 |
| 100 | 0 | 100 |
| 105 | 0 | 100 |
| 110 | 0 | 100 |
| 115 | 0 | 100 |
| 120 | 0 | 100 |
| 125 | 0 | 100 |
| 130 | 0 | 100 |
| 135 | 0 | 100 |
| 140 | 0 | 100 |
| 145 | 15,3 | 100 |
| 150 | 100 | 100 |
| 155 | 100 | 100 |
| 160 | 100 | 100 |
| 165 | 100 | 100 |
| 170 | 100 | 100 |
| 175 | 100 | 100 |
Sınır yokken 10. saniyeden 145. saniyeye kadar hiçbir giriş başarılı olmadı: servis, çoktan vazgeçmiş istemcilerin parolalarını doğrulamaya devam etti, ardından gelen yarım kapasiteli iki dakika boyunca da. Sınırla birlikte aşırı yük boyunca saniyede yaklaşık 93 girişe hizmet etti, kalanını hemen reddetti, hiçbir istek zaman aşımına uğramadı ve aşırı yükten sonraki ilk beş saniyede gecikme limitinin altına döndü.