Skip to content

aref81/Message-Broker

Repository files navigation

Message Broker

As the final project in Bale Camp, We were asked to implement a fast and simple gRPC based broker. the main purpose of this project was to gain hands-on experience with golang and some common tools such as :

  • Kubernetes:
    • Gained practical experience in utilizing Kubernetes for orchestrating workflows, ensuring smooth deployment, scaling, and management of containerized applications. -Docker: -Acquired hands-on knowledge of Docker for streamlined containerization, facilitating consistent deployment across diverse environments.
  • Envoy:
    • Worked extensively with Envoy as a proxy server for load balancing and rate limiting, elevating the reliability and performance of applications.
  • Prometheus:
    • Utilized Prometheus for in-depth monitoring, enabling real-time tracking of system metrics and proactive identification of potential issues.
  • Grafana:
    • Developed proficiency in Grafana to craft insightful dashboards, visually representing system performance for effective decision-making.
  • Jaeger:
    • Gained valuable experience with Jaeger for distributed tracing, offering insights into request flow across the system and aiding in debugging and optimization.
  • gRPC:
    • Implemented gRPC for seamless communication between components, leveraging its high-performance RPC capabilities to amplify system speed and responsiveness.
  • k6:
    • Applied k6 for rigorous performance testi
  • Concurrency in golang:
    • Gained practical experience with concurrency features in golang, such as goroutines and channels.
  • Data Storages:
    • Used different datasources like Postgres (SQL), Cassandra/Scylla (noSQL) to persist the messages. We compared the performance of each and decided the best use case for each one.
  • Caching and Batching:
    • In order to overcome the performance bottlenecks, we took advantage of different methods such as caching and batching.

RPCs Interface

  • Publish Requst
message PublishRequest {
  string subject = 1;
  bytes body = 2;
  int32 expirationSeconds = 3;
}
  • Fetch Request
message FetchRequest {
  string subject = 1;
  int32 id = 2;
}
  • Subscribe Request
message SubscribeRequest {
  string subject = 1;
}
  • RPC Service
service Broker {
  rpc Publish (PublishRequest) returns (PublishResponse);
  rpc Subscribe(SubscribeRequest) returns (stream MessageResponse);
  rpc Fetch(FetchRequest) returns (MessageResponse);
}

Performance Report

In order to test our performance, We had several load testing phases on broker's publish service using K6 and custom-built golang clients.

RAM

RAM

Postgres

Postgres_2

Cassandra

Cassandra

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published