Curs 7 - Distributed Systems, Event-Driven Architecture și RPC

În acest curs vom explora conceptele de sisteme distribuite, arhitecturi bazate pe evenimente și Remote Procedure Call (RPC), utilizate pentru scalabilitate și procesare asincronă.

1. Ce sunt Sistemele Distribuite?

Un sistem distribuit este un grup de noduri interconectate care colaborează pentru a îndeplini o sarcină comună.

- Consistență, Disponibilitate și Toleranță la Partiționare (CAP Theorem).

- Exemple de sisteme distribuite: Google Bigtable, Apache Kafka, Amazon DynamoDB.

2. Modele de Comunicare în Sistemele Distribuite

- Request-Response (Synchronous Communication): Serviciul A cere date de la Serviciul B și așteaptă răspunsul.

- Event-Driven și Message Queues (Asynchronous Communication): Serviciile comunică prin evenimente, fără a aștepta răspuns imediat.

- Pub/Sub vs. Point-to-Point Messaging: Alegerea modelului potrivit pentru un sistem distribuit.

3. Remote Procedure Call (RPC)

RPC permite unui serviciu să apeleze o funcție într-un alt serviciu ca și cum ar fi locală, reducând complexitatea comunicării între microservicii.

- REST vs. RPC: REST utilizează HTTP pentru comunicare, RPC folosește protocoale binare optimizate (ex: gRPC).

- gRPC vs. GraphQL vs. REST:

- gRPC: Bazat pe HTTP/2, eficient pentru latență mică și streaming de date.

- GraphQL: Flexibil, permite clienților să solicite doar datele necesare.

- REST: Ușor de înțeles și implementat, dar mai lent decât gRPC.

- Exemplu de definiție gRPC:

syntax = "proto3";

service Calculator {
  rpc Aduna (Request) returns (Response);
}

message Request {
  int32 a = 1;
  int32 b = 2;
}

message Response {
  int32 rezultat = 1;
}

- Exemplu de apel gRPC în Python:

import grpc
import calculator_pb2
import calculator_pb2_grpc

channel = grpc.insecure_channel('localhost:50051')
stub = calculator_pb2_grpc.CalculatorStub(channel)
response = stub.Aduna(calculator_pb2.Request(a=5, b=3))
print(response.rezultat)

4. Event-Driven Architecture

O arhitectură bazată pe evenimente permite microserviciilor să reacționeze la schimbări fără să fie conectate direct unul la altul.

- Componentele unui sistem bazat pe evenimente:

- Producător: Emite evenimente.

- Broker de Mesaje: Intermediar care livrează evenimente (Kafka, RabbitMQ, AWS SNS/SQS).

- Consumator: Procesează evenimentele primite.

5. Consistency Models în Sistemele Distribuite

- Strong Consistency vs. Eventual Consistency: Cum alegem modelul potrivit?

- Distributed Transactions și Saga Pattern: Gestionarea tranzacțiilor între microservicii.

- CQRS (Command Query Responsibility Segregation): Separarea logicii de citire și scriere pentru scalabilitate.

6. Exemplu Practic - Arhitectura unui Sistem de Notificări în Timp Real

Cum proiectăm un sistem de notificări care să suporte milioane de utilizatori?

a) Alegerea Tehnologiei

- Kafka vs. RabbitMQ: Kafka este potrivit pentru evenimente cu latență redusă, RabbitMQ pentru task-uri de procesare.

b) Gestionarea Ordering și Exactly-Once Processing

- Kafka Partitioning: Asigură ordonarea mesajelor pe baza cheilor de partiționare.

- Exactly-Once Processing: Evită duplicarea mesajelor.

Resurse suplimentare: