GH GambleHub

→ Technologie i infrastruktura opóźnień i optymalizacja odpowiedzi API

Optymalizacja opóźnień i odpowiedzi API

1) Co to jest „opóźnienie” i dlaczego ma znaczenie

Opóźnienie - całkowite opóźnienie żądania: sieć (DNS + TCP + TLS + RTT), balancer/brama, aplikacja, DB/caches/kolejki, integracje zewnętrzne. P95/P99 są krytyczne dla biznesu, a nie przeciętne: to „ogon” niszczy UX, CR i SLO.

Podstawowe SLIs:
  • „SLI _ latency _ P95 = P95 (response _ time)” w 5/30 minut
  • „SLI _ latency _ P99 = P99 (response _ time)”
  • „SLI _ queue _ time = P95 (worker _ queue _ time)”
  • „SLI _ ext _ call _ P95 = P95 (external _ provider _ latency)”

2) Mapa źródła opóźnienia (i gdzie kopać)

1. Sieć i protokoły: DNS, uściski dłoni TCP, TLS, head-of-line (HTTP/1. 1), utrata pakietów, BBR/ECN.
2. Brama/balancer: powolna kontrola stanu zdrowia, nieprawidłowe timeouts, gorące dno.
3. Zastosowanie: zamki, GC/stop-the-world, synchroniczne I/O, contention.
4. Repozytoria: powolne zapytania bazy danych, brak indeksów, zimne strony.
5. Usługi zewnętrzne: PSP/KYC, API osób trzecich (wąskie SLA).
6. Kolejki i tło jabs: przeciążeni pracownicy, bez ciśnienia pleców.
7. Pamięć podręczna/krawędź: brak pamięci podręcznej, słaby TTL, nieprawidłowa niepełnosprawność.

3) Sieć i protokoły

3. 1 DNS/TCP/TLS

DNS prefetch/preconnect z przodu, długotrwały IP do PSP.
Utrzymanie-Alive/łączenie połączeń w klientach; na serwerze - połączenia zbiorcze.
TLS: wznowienie/bilety sesyjne, nowoczesny pakiet szyfrów; unikać 0-RTT do niebezpiecznych operacji idempotentnych.
TCP: wyłączyć Nagle ('TCP _ NODELAY') dla czatów/małych pakietów; tune 'initial window', w stosownych przypadkach włączyć BBR.

3. 2 HTTP/2 - HTTP/3

HTTP/2: multipleksowanie zmniejsza HTTP/1 blokad HOL. 1; monitorować priorytety nici.
HTTP/3/QUIC: niższy wpływ strat/RTT; przydatne w sieci mobilnej/międzynarodowej.
Kompresja nagłówka: HPACK/QPACK, ale zachować rozsądny rozmiar nagłówka.

3. 3 Bilansowanie/routing

Miejscowość-świadomość (zagospodarowanie przestrzenne), EWMA/najmniej żądane w porównaniu z gorącymi instancjami.
Przyklejanie sesji - tylko wtedy, gdy istnieje stan; w przeciwnym razie bezpaństwowiec + wspólna pamięć podręczna/sesje.

4) Formaty, ładunek użytkowy, kompresja

Squeeze: Brotli (tekst), Gzip jako fallback; formaty binarne: Protobuf/Avro dla gRPC/wewnętrznych API.
Zmniejsz obciążenie użytkowe: pola selektywne ('fields =...'), pagination, conditional GET (ETag/If-None-Match), odpowiedzi delta.
GraphQL: ciągłe pytania, zakaz „tłuszczu” fragmentów, granice głębokości i złożoności.
Unikaj N + 1: Joyns/przyimek, punkty końcowe masła dla kruszyw.

5) Timeouts, rekolekcje, idempotencja

Timeouts klient <gateway <appa <storage/external call.
Retrai z backoff + jitter, tylko w przypadku błędów tymczasowych; ujawnić budżety na retreaty.
Idempotence: klucz zapytania/token + zapisz wynik; rekolekcje nie powinny powielać operacji (zwłaszcza finansów).
Wyłącznik: Otwórz po zdegradowaniu; żądania hedged/backup dla ogonów (wyślij duplikat za pośrednictwem P95).

6) Kolejki, asynchrona i ciśnienie wsteczne

Nie blokuj ścieżki synchronicznej: ciężkie operacje (skany KYC, raportowanie) - w tle.
Backpressure: ograniczyć zużycie z kolejki, naprawić równoległość.
Łączenie/koalescowanie - łączenie małych transakcji (na przykład aktualizacja sald z agregacją).
Skrzynka odbiorcza/skrzynka odbiorcza: gwarantowana dostawa zdarzeń w przypadku awarii.

7) Zastosowanie: runtimes i puli

Pula połączeń z bazami danych/buforami/HTTP; ograniczyć je tak, aby nie „udusić” pleców.
JVM: profil GC (G1/ZGC), unikać dużych przydziałów; .NET - gwintowana pula/async; Węzeł. js - nie blokuj pętli zdarzeń, wyjmij CPU-heavy.
Python: sterowniki asynchroniczne (asyncpg/httpx), uvloop; Zadania procesora za pośrednictwem pracownika-puli.
Rozgrzewka: rozgrzewka JIT/bufory, „ciepłe baseny” instancje do szczytów.

8) Bazy danych i bufory

Indeksy i plany: regularne 'EXPLAIN', auto-próżnia/analiza, limit skanowania.
Łączenie połączeń (PgBouncer/Multipleksing), krótkie transakcje.
Strategie pamięci podręcznej: czytanie, zapisywanie/odpisywanie; TTL + niepełnosprawność według zdarzeń.
Shading/repliki: czytanie od niewolników, „gorące klucze” - lokalne bufory (near-cache).

9) Buforowanie i krawędź

CDN/krawędź dla katalogów statycznych/katalogów, odpowiedzi API pamięci podręcznej (jeśli są bezpieczne) dla 'Cache-Control', 'ETag'.
Stale-while-revalidate i stale-if-error dla UX-stabilność.
Przydział geograficzny: najbliższy RRR/region zmniejsza RTT.

10) Wzory architektoniczne kontra ogony P99

Żądania zabezpieczane - Powolne żądanie do innej instancji po progu.
Żądanie upadku: jedno „wiodące” żądanie do bazy danych, reszta czeka na wynik (unika burz).
Priorytet: operacje VIP/operacje krytyczne - specjalna pula/priorytet.
Wdzięczna degradacja: Wycięcie niewielkich pól/widżetów po przeciążeniu.

11) Konfiguracje (w przybliżeniu)

11. 1 NGINX (Timeouts/Compression)

nginx proxy_connect_timeout  1s;
proxy_send_timeout   2s;
proxy_read_timeout   2s;
send_timeout      2s;

gzip on;
gzip_types application/json text/plain text/css application/javascript;

11. 2 Wysłannik (hedge + retry budget)

yaml
RetryPolicy:
retry_on: 5xx,reset,connect-failure num_retries: 2 per_try_timeout: 300ms retry_back_off: { base_interval: 50ms, max_interval: 200ms }
retry_priority:
name: envoy. retry_priorities. previous_priorities
HedgePolicy:
hedge_on_per_try_timeout: true initial_requests: 1 additional_request_chance: 0. 2

11. 3 gRPC (klient)

json
{
"methodConfig": [{
"name": [{"service": "payments. Service"}],
"timeout": "0. 8s",
"retryPolicy": {
"maxAttempts": 3,
"initialBackoff": "0. 05s",
"maxBackoff": "0. 2s",
"backoffMultiplier": 2. 0,
"retryableStatusCodes": ["UNAVAILABLE","DEADLINE_EXCEEDED"]
}
}]
}

12) Obserwowalność: Środek prawidłowo

RED/USE metrics + OTel trails: 'trace _ id' poprzez gateway-service-database-external API.
Poszczególne etykiety: 'api _ version', 'region', 'partner', 'endpoint'.
Deski rozdzielcze: P50/P95/P99, czas kolejki, mieszanka błędów, szybkość ponownego spróbowania, trafienie pamięci podręcznej.
Syntetyka z krajów docelowych/ASN (TR/BR/EU) oraz ścieżkami krytycznymi (reg → depozit, payout).

Przykład SLO:
  • Rdzeń API: „P95 ≤ 250 ms”, „P99 ≤ 500 ms” (30 dni)
  • Przetwarzanie haków PSP: "P99 ≤ 60s' z przekładkami
  • Katalog świeżości: "P95 lag ≤ 30 s'

13) FinOps - opóźnienie

Milisekundy są warte pieniędzy: oszacować wygrane $/ms w CR/ARPPU.
Prawy rozmiar: zawsze szybszy, droższy; kompetentne pamięci podręcznej/formaty są tańsze i szybsze.
Egress/edge: CDN zmniejsza RTT i koszty ruchu wychodzącego z regionu.

14) Lista kontrolna optymalizacji (krok po kroku)

1. Ustawić SLO i zmierzyć ogony (P95/P99) według punktów końcowych/regionów/partnerów.
2. Włącz HTTP/2/3, wznowienie TLS, długotrwałe połączenia.
3. Wycisnąć i schudnąć odpowiedzi: Brotli/Gzip, fields on demand, pagination, ETag.
4. Ustawić timeouts/retreats/breakers; dodać idempotencję.
5. Pamięć podręczna/krawędź: szybkość trafienia i poprawność TTL; tryby stale.
6. DB: indeksy, plany, puli, repliki; wyeliminować N + 1.
7. Asynchronizować ciężkie: kolejki, butching, backpressure.
8. Zabezpieczenie/upadek/priorytet dla ścieżek krytycznych.
9. Rozgrzewka i prognostyczne skalowanie do wybranych (turnieje/mecze).
10. Syntetyka i wpisy na czas P99 i kolejki; regularne przeglądy perf.

15) Anty-wzory

Jeden globalny czas „dla wszystkich” i niekontrolowane retrasy (sam DDOS).
Trzymanie sesje bez konieczności → gorące węzły.
Duże JWZ bez kompresji i filtrów polowych.
Synchroniczne połączenia w celu spowolnienia zewnętrznych interfejsów API w „gorącej ścieżce”.
Brak indeksów/limitów w bazie danych; N + 1 w ORM.
brak pamięci podręcznej/krawędzi i ETag; uporczywe pełne odpowiedzi.
Mieszanka błędów biznesowych i technicznych w jednym koszyku „chowane”.

16) Kontekst iGaming/fintech: uwagi praktyczne

Reg → depozit (CR): priorytet trasy, pula indywidualna, „P99 ≤ 500 ms”; degradacja - wyłączyć UI „dekoracje”.
Integracje PSP: limity konkarrencji, przekłady według kodów czasu, ciepłe połączenia, regionalny egress-IP.
Operacje VIP: gwarantowana pula/priorytet, omijanie publicznych kolejek.
Turnieje/wydarzenia: skala predykcyjna, cache rozgrzewka, prefetch.
Sprawozdawczość: async i SLA na świeżości, nie blokuje ścieżki produkcji.

Razem

Optymalizacja opóźnień to dyscyplina równowagi: sieć (HTTP/2/3, TLS), protokoły i pamięć podręczna, timeouts/retrays z idempotencją, DB/bufory, asynchroniczne wzory i P95/P99 obserwowalność. Skupiając się na ogonach i eliminując „wąskie szyje”, stabilizujesz reakcję, poprawiasz konwersję i obniżasz koszt na milisekundę - gdzie naprawdę wpływa na biznes.

Contact

Skontaktuj się z nami

Napisz do nas w każdej sprawie — pytania, wsparcie, konsultacje.Zawsze jesteśmy gotowi pomóc!

Telegram
@Gamble_GC
Rozpocznij integrację

Email jest wymagany. Telegram lub WhatsApp są opcjonalne.

Twoje imię opcjonalne
Email opcjonalne
Temat opcjonalne
Wiadomość opcjonalne
Telegram opcjonalne
@
Jeśli podasz Telegram — odpowiemy także tam, oprócz emaila.
WhatsApp opcjonalne
Format: kod kraju i numer (np. +48XXXXXXXXX).

Klikając przycisk, wyrażasz zgodę na przetwarzanie swoich danych.