Puncte:0

AWS - Cum să gestionați „Timpul de călătorie” global?

drapel aw

Bună, oameni greșiți de server,

Imaginează-ți o companie generică „Software as a Service” care oferă un serviciu care rulează pe AWS (hei, noi suntem). Nu este implicată nicio știință rachetă, o aplicație web standard își face treaba ca de obicei și o aplicație pentru smartphone pentru utilizatorul final. Aşa cum sunt clienţii din Europa, desigur, regiunea AWS eu-central-1 conține totul pentru mai mulți chiriași.

Acum Sales reușește să câștige un client din Australia - toate bune până acum, deoarece aplicația web poate gestiona deja diferite fusuri orare, valute și localități. Dar: Australia cât de departe poți ajunge de Europa (cel puțin pe pământ), așa că acum este implicat destul de mult timp dus-întors. La cerere, vedem aproximativ 300ms - 400ms în plus pe direcție (EDIT: acest lucru este greșit când vorbim despre RTT, așa cum se subliniază în felicitări, vedem 2x400ms = 800ms în plus pentru primul HTTPS cerere).

Pentru aplicația web menționată, care este folosită de client în scopuri de management, este perfect.HTML-ul redat apare puțin mai târziu, dar datorită CDN-urilor (CloudFront), activele nu reprezintă o problemă.

Dar aplicația pentru smartphone-ul utilizatorului final, care face cereri JSON mai mici, dar mai multe, este afectată. Acolo se simte la marginea „OK-ish”, dar definitiv deloc rapid.

Acum intrebarea este: cum să îmbunătățim timpul din perspectiva utilizatorului final? Ne-am gândit deja la câteva opțiuni aici:

  1. Clonează software-ul complet și găzduiește-l și în AWS ap-southeast-2

    Avantaj: performanță uimitoare, ușor de configurat, CI/CD ar permite implementarea aceluiași cod simultan în UE și AU.

    Dezavantaje: trebuie să întreținem și să plătim pentru două seturi de infrastructură identice, datele nu pot fi partajate cu ușurință, o mulțime de duplicare în toate termenii.

  2. Mutați numai instanțe de calcul în AWS ap-southeast-2

    Nu, nu va funcționa ca bază de date sau interogările redis ar fi afectate și mai mult de timpul dus-întors.

  3. Aveți o replică numai pentru citire în AWS ap-southeast-2 și scrieți în eu-central-1

    Mai bine ca opțiunea 2, dar adaugă multă complexitate în cod, plus numărul de scrieri nu este atât de puține de obicei.

  4. Porniți un echilibrator de încărcare în AWS ap-southeast-2 și conectați la egal VPC-urile

    Idee: utilizatorii se conectează la punctul final AU, iar traficul trece printr-o conexiune robustă către instanțele UE. Cu toate acestea, acest lucru, evident, nu ar reduce distanța și nu suntem siguri de potențiala îmbunătățire (dacă există?)

S-a confruntat cineva cu o problemă similară și este dispus să împărtășească câteva informații?

Actualizare: se pare că doar prima solicitare HTTPS pare să fie foarte lentă. În timp ce am căutat în opțiunile AWS Load Balancer, am observat și asta AWS Global Accelerator ar putea ajuta, așa că am făcut câteva teste.

Din sistemul local (în UE):

curl -w "dns_resolution: %{time_namelookup}, tcp_established: %{time_connect}, ssl_handshake_done: %{time_appconnect}, TTFB: %{time_starttransfer}\n" -o /dev/null -s "https://saas.example .com/ping" "https://saas.example.com/ping"
dns_resolution: 0,019074, tcp_established: 0,041330, ssl_handshake_done: 0,081763, TTFB: 0,103270
rezoluție_dns: 0,000071, tcp_established: 0,000075, ssl_handshake_done: 0,000075, TTFB: 0,017285

Din AU (instanță EC2):

curl -w "dns_resolution: %{time_namelookup}, tcp_established: %{time_connect}, ssl_handshake_done: %{time_appconnect}, TTFB: %{time_starttransfer}\n" -o /dev/null -s "https://saas.example .com/ping" "https://saas.example.com/ping"
rezoluție_dns: 0,004180, tcp_established: 0,288959, ssl_handshake_done: 0,867298, TTFB: 1,161823
rezoluție_dns: 0,000030, tcp_established: 0,000032, ssl_handshake_done: 0,000033, TTFB: 0,296621

De la AU la AWS Global Accelerator (instanță EC2):

curl -w "dns_resolution: %{time_namelookup}, tcp_established: %{time_connect}, ssl_handshake_done: %{time_appconnect}, TTFB: %{time_starttransfer}\n" -o /dev/null -s "https://saas-with -global-accelerator.example.com/ping" "https://saas-with-global-accelerator.example.com/ping"
dns_resolution: 0,004176, tcp_established: 0,004913, ssl_handshake_done: 0,869347, TTFB: 1,163484
rezoluție_dns: 0,000025, tcp_established: 0,000027, ssl_handshake_done: 0,000028, TTFB: 0,294524

Pe scurt: se pare că strângerea de mână TLS cauzează cea mai mare latență inițială. Dacă poate fi reutilizat, totuși, timpul suplimentar pentru AU către UE pare într-adevăr „doar” ~277 ms (0,294524s - 0,017285s) pentru Time To First Byte.

Salutari!

drapel cn
În ceea ce privește *300ms - 400ms în plus pe direcție*, asta sună ciudat. M-aș aștepta ca RTT complet să fie în acel interval (ei bine, văd 250-300ms RTT pentru gazdele din Sydney, dar în funcție de unde în Australia va varia în mod evident... dar nu dublu așa cum ați indicat). În ceea ce privește opțiunea 4, dacă este vorba despre latență, nu va conta foarte mult (în timp ce rutarea va fi ușor diferită, cea mai mare parte a distanței este inerentă și, după cum ați observat, este de fapt distanța care se adaugă latenței).
Tim avatar
drapel gp
Tim
Pentru a reduce latența aveți nevoie de aplicație și bază de date în Sydney. Îmi place numărul 3, modifică-ți aplicația pentru a utiliza o replică de citire pentru citiri și trimit scrieri către baza de date principală a UE, atâta timp cât va avea beneficii. În caz contrar, veți avea nevoie de întregul stack în Sydney.
drapel aw
@HÃ¥kanLindqvist ai perfecta dreptate! Am măsurat o solicitare HTTPS completă și am decis-o până la 2, nu este RTT-ul.
anx avatar
drapel fr
anx
Partea *prea multe scrieri* poate fi nesemnificativă în comparație cu capacitatea browserelor moderne de a reduce călătoriile dus-întors. Poate doriți să *măsurați* HTTP/1.1, HTTP/2, HTTP/3, 0-RTT și strângere de mână completă separat pentru a confirma că într-adevăr aveți nevoie de baza de date mai aproape de utilizatorii dvs., spre deosebire de, de exemplu, așteptați vechiul smartphone-urile și MSIE să fie înlocuite.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.