Curs 2 - Scalabilitate și Disponibilitate în System Design

În acest curs vom explora conceptele de scalabilitate și disponibilitate, esențiale pentru construirea de sisteme software performante și fiabile.

1. Ce este Scalabilitatea?

Scalabilitatea este capacitatea unui sistem de a gestiona o creștere a traficului sau a utilizatorilor fără a compromite performanța.

- Scalabilitate Verticală: Creșterea resurselor hardware (CPU, RAM) pe un singur server.

- Scalabilitate Orizontală: Adăugarea mai multor servere pentru a împărți sarcina de lucru.

- Elasticitate: Sistemele elastice adaugă sau elimină automat resurse în funcție de cerințele de trafic.

2. Ce este Disponibilitatea?

Disponibilitatea unui sistem se referă la capacitatea acestuia de a fi operațional fără întreruperi.

- High Availability (HA): Asigură funcționarea continuă a sistemului.

- SLA (Service Level Agreement): Un sistem cu 99.99% uptime permite doar câteva minute de downtime pe lună.

3. Load Balancing și Replicare

Pentru a asigura scalabilitate și disponibilitate, folosim mai multe tehnici de distribuire a traficului și replicare a datelor.

a) Load Balancing

Un load balancer distribuie traficul între mai multe servere pentru a evita supraîncărcarea unuia singur.

- Round Robin: Distribuie cererile uniform între servere.

- Least Connections: Direcționează cererile către serverul cel mai puțin ocupat.

- IP Hashing: Atribuie utilizatori unui anumit server în funcție de IP.

b) Replicarea Bazei de Date

Replicarea datelor asigură redundanță și îmbunătățește performanța citirilor.

- Master-Slave Replication: Un nod principal gestionează scrierile, iar replicile preiau citirile.

- Multi-Master Replication: Orice nod poate efectua atât scrieri, cât și citiri.

4. Arhitecturi Scalabile

- Stateless vs. Stateful Services: Serviciile stateless nu păstrează date despre sesiuni și sunt mai ușor de scalat.

- CQRS (Command Query Responsibility Segregation): Separă operațiunile de citire de cele de scriere pentru a îmbunătăți performanța.

- Eveniment-Driven Architecture: Utilizează evenimente și mesaje pentru a comunica între componente.

5. Failover și Toleranță la Erori

Sistemele de producție trebuie să fie capabile să gestioneze eșecurile.

- Active-Active vs. Active-Passive Failover: Active-Active permite utilizarea simultană a tuturor nodurilor, în timp ce Active-Passive menține un nod de rezervă.

- Circuit Breaker Pattern: Evită supraîncărcarea unui serviciu care întâmpină probleme.

- Chaos Engineering: Introducerea intenționată a erorilor pentru a testa reziliența sistemului.

6. Exemplu Practic - Sistem de Chat Scalabil

Cum putem proiecta un sistem de chat care să suporte milioane de utilizatori?

a) Alegerea Tehnologiei

- WebSockets vs. Long Polling: WebSockets oferă comunicare bidirecțională în timp real.

- Message Queues (Kafka, RabbitMQ): Ajută la gestionarea mesajelor între servere.

b) Stocarea Datelor

- SQL vs. NoSQL: NoSQL (MongoDB, Cassandra) este preferat pentru scalabilitate.

- Redis pentru caching: Îmbunătățește viteza accesării mesajelor recente.

Resurse suplimentare: