Acest curs introduce conceptele fundamentale ale System Design-ului, explicând importanța arhitecturilor software scalabile și eficiente.
System Design este procesul de proiectare a arhitecturii unei aplicații software, având în vedere scalabilitatea, disponibilitatea și performanța.
- Low-Level Design (LLD): Se concentrează pe detaliile implementării (structuri de date, algoritmi, OOP).
- High-Level Design (HLD): Definește arhitectura generală a unui sistem, incluzând componentele majore și interacțiunile dintre ele.
Exemple de sisteme software mari care utilizează principii avansate de system design sunt Google Search, Facebook, Netflix și Amazon.
Un sistem software bine proiectat trebuie să respecte mai multe principii fundamentale:
- Scalabilitate: Capacitatea unui sistem de a gestiona un număr mare de utilizatori.
- Disponibilitate: Asigurarea unui uptime ridicat prin replicare și failover.
- Performanță și latență: Timpul de răspuns al sistemului și utilizarea caching-ului.
- Consistență și partiționare: Alegerea între consistență puternică sau disponibilitate conform CAP theorem.
Există mai multe moduri de organizare a unei aplicații software:
- Arhitectură Monolitică: Aplicația este un singur bloc de cod, mai ușor de dezvoltat dar dificil de scalat.
- Arhitectură Microservicii: Aplicația este împărțită în servicii independente care comunică prin API-uri.
- Arhitectura Layered (N-Tier): Separarea logicii aplicației în straturi (UI, Logică, Bază de Date).
- Event-Driven Architecture: Folosește mesaje și event streaming pentru comunicare.
- Serverless și Cloud-Native: Rulare a aplicațiilor direct pe cloud, fără servere dedicate.
Un sistem distribuit eficient include mai multe componente critice:
- API Gateway și Load Balancer: Distribuirea traficului între servere multiple.
- Database Sharding și Replication: Tehnici pentru scalarea bazelor de date.
- Caching (Redis, Memcached): Reducerea numărului de interogări în baza de date.
- Message Queues și Event Streaming (Kafka, RabbitMQ): Mecanisme pentru comunicarea între microservicii.
Consistența și disponibilitatea sunt două aspecte esențiale în sistemele distribuite. CAP Theorem afirmă că un sistem nu poate avea simultan:
- Consistență (Consistency): Toate nodurile returnează aceleași date în același timp.
- Disponibilitate (Availability): Sistemul este întotdeauna capabil să răspundă utilizatorilor.
- Toleranță la partiționare (Partition Tolerance): Sistemul poate funcționa chiar dacă unele noduri sunt indisponibile.
Sistemele distribuie aleg de obicei două dintre aceste trei proprietăți în funcție de cerințe.
Vom analiza un exemplu de arhitectură pentru un URL Shortener, similar cu Bit.ly.
- API Gateway: Expune endpoint-urile API pentru generarea și redirecționarea URL-urilor scurtate.
- Database (NoSQL vs SQL): Salvarea URL-urilor și generarea de chei unice.
- Load Balancer: Distribuie cererile între mai multe servere.
- Caching (Redis): Pentru a reduce încărcarea bazei de date.
- SQL: Mai bun pentru consistență.
- NoSQL (DynamoDB, MongoDB): Mai bun pentru scalabilitate și viteză.
Pentru a îmbunătăți performanța, putem implementa:
- Rate Limiting: Prevenirea abuzului de API.
- Replication & Sharding: Scalarea bazei de date.
- Asynchronous Processing: Utilizarea unei cozi de mesaje pentru analize de trafic.