Bahadır Bilir

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.deleted event’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ı:

Parolalı giriş: gelen yüke göre p99 gecikme
Göster
  • c7a.large, 2 çekirdek
  • c7a.xlarge, 4 çekirdek
  • limit, 250 ms

p99, ms

saniyede giriş

c7a.large, 2 çekirdek
saniyede girişp99, ms
1728,8
3529,8
4839,8
5552,6
6282,4
69115,4
76136,3
c7a.xlarge, 4 çekirdek
saniyede girişp99, ms
3423,4
6928,6
9633,3
11038,4
12345,5
13755,5
15168,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.

Token yenileme: gelen yüke göre p99 gecikme
Göster
  • c7a.large, 2 çekirdek
  • c7a.xlarge, 4 çekirdek
  • limit, 50 ms

p99, ms

saniyede yenileme

c7a.large, 2 çekirdek
saniyede yenilemep99, ms
2376
47412,3
66320,8
75827
85233,2
94742,6
1.04249,9
1.18492,8
c7a.xlarge, 4 çekirdek
saniyede yenilemep99, ms
4634,3
9256,1
1.2958,9
1.48011,5
1.66515,7
1.85023,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.

c7a.large'da token yenileme: yayınlanmış port üzerinden TCP ve Unix socket
Göster
  • TCP
  • Unix socket
  • limit, 50 ms

p99, ms

saniyede yenileme

p99, ms
saniyede yenilemeTCPUnix socket
30066,1
60012,913,3
84024,621,7
96029,626,7
1.0803732,1
1.20050,938,6
1.32072,458,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.

Saniyede Argon2id doğrulama, eşzamanlılık çekirdek sayısı kadar
Göster
  • c7a.large, 2 çekirdek
  • c7a.xlarge, 4 çekirdek
  1. 46 MiB, 1 geçiş74/s124,1/s
  2. 19 MiB, 2 geçiş: önceki105,8/s186,1/s
  3. 12 MiB, 3 geçiş123,2/s211,6/s
  4. 9 MiB, 4 geçiş124,7/s225/s
  5. 7 MiB, 5 geçiş: seçilen129,4/s238,2/s
c7a.large, 2 çekirdekc7a.xlarge, 4 çekirdek
46 MiB, 1 geçiş74/s124,1/s
19 MiB, 2 geçiş: önceki105,8/s186,1/s
12 MiB, 3 geçiş123,2/s211,6/s
9 MiB, 4 geçiş124,7/s225/s
7 MiB, 5 geçiş: seçilen129,4/s238,2/s

OWASP'ın eşdeğer saydığı parametre setleri. 7 MiB ve beş geçiş, 19 MiB ve iki geçişe göre 2 çekirdekte saniyede %22, 4 çekirdekte %28 daha fazla doğruluyor.

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.

c7a.large'da kapasite üstünde giriş: bir dakika boyunca kapasitenin iki katı
Göster
  • 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

başarılı girişler, %
aşırı yükün başından itibaren saniye, girişin gönderildiği ana göreSınırsız kuyrukSınırlı kuyruk
-15100100
-10100100
-5100100
010050,1
567,752,6
10054
15054,3
20055,7
25055,1
30055,5
35055,8
40055
45054,2
50055,7
55057,3
600100
650100
700100
750100
800100
850100
900100
950100
1000100
1050100
1100100
1150100
1200100
1250100
1300100
1350100
1400100
14515,3100
150100100
155100100
160100100
165100100
170100100
175100100

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ü.