În acest curs vom explora conceptele de scalabilitate și disponibilitate, esențiale pentru construirea de sisteme software performante și fiabile.
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.
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ă.
Pentru a asigura scalabilitate și disponibilitate, folosim mai multe tehnici de distribuire a traficului și replicare a datelor.
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.
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.
- 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.
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.
Cum putem proiecta un sistem de chat care să suporte milioane de utilizatori?
- WebSockets vs. Long Polling: WebSockets oferă comunicare bidirecțională în timp real.
- Message Queues (Kafka, RabbitMQ): Ajută la gestionarea mesajelor între servere.
- SQL vs. NoSQL: NoSQL (MongoDB, Cassandra) este preferat pentru scalabilitate.
- Redis pentru caching: Îmbunătățește viteza accesării mesajelor recente.