Curs 1 - Introducere în System Design și Arhitecturi Software

Acest curs introduce conceptele fundamentale ale System Design-ului, explicând importanța arhitecturilor software scalabile și eficiente.

1. Ce este System Design?

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.

2. Principiile de bază ale arhitecturii software

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.

3. Tipuri de Arhitecturi Software

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.

4. Elemente ale unui Sistem Distribuit

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.

5. Modele de Consistență și Trade-offs

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.

6. Exemplu Practic - Arhitectura unui URL Shortener

Vom analiza un exemplu de arhitectură pentru un URL Shortener, similar cu Bit.ly.

a) Componentele sistemului

- 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.

b) Alegerea bazei de date

- SQL: Mai bun pentru consistență.

- NoSQL (DynamoDB, MongoDB): Mai bun pentru scalabilitate și viteză.

c) Optimizarea sistemului

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.

Resurse suplimentare: