În acest curs vom explora conceptele de sisteme distribuite, arhitecturi bazate pe evenimente și Remote Procedure Call (RPC), utilizate pentru scalabilitate și procesare asincronă.
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.
- 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.
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)
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.
- 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.
Cum proiectăm un sistem de notificări care să suporte milioane de utilizatori?
- Kafka vs. RabbitMQ: Kafka este potrivit pentru evenimente cu latență redusă, RabbitMQ pentru task-uri de procesare.
- Kafka Partitioning: Asigură ordonarea mesajelor pe baza cheilor de partiționare.
- Exactly-Once Processing: Evită duplicarea mesajelor.