gRPC Load Balancer
grpc_load_balancer
is a Python package that allows you to easily configure and manage separate gRPC server and client instances using a metrics-based load balancing approach. This is useful when you have multiple services running and want to distribute the load efficiently among them. The package includes a connection forwarder, a metrics-based server finder, and a configuration loader.
It implemetns the following design:
Features
- Forward connections from clients to gRPC servers.
- Use Prometheus metrics to select the best server to handle a request.
- Configure and manage gRPC server finder using environment variables.
Installation
You can install grpc_load_balancer
using pip:
pip install grpc_load_balancer
Install promethus-client:
pip install prometheus-client
Usage
Configuring and running a gRPC server
Here's a simple example of how to use grpc_load_balancer with a gRPC server and prometeus-client:
Import the required modules:
import grpc
from grpc_load_balancer import GrpcConnnectionForwarder
from prometheus_client import start_http_server, Gauge
Initialize your gRPC server(s)
grpc_server = create_example_grpc_server() # implement this function yourself
connection_counter = Gauge('connections_num', 'Number of connections forwarded')
forwarder = GrpcConnnectionForwarder(
grpc_server, callback=lambda value: connection_counter.set(value)
)
start_http_server(prometheus_port)
# forwarder_port - port to listen connections from gRPC clients
# Note this call is blocking
forwarder.serve(host="0.0.0.0", port=forwarder_port)
# If you want to run the server in a separate thread, and want to stop it later, use the forwarder.stop() method
Configuring and running a gRPC client
Import the required modules:
import grpc
from grpc_load_balancer import EnvConfigLoader, MetricsBasedServerFinder
Initialize the configuration loader
# This is example how your environment variables can look like
# os.environ['LB_METRICS_NAME'] = 'connections_num'
# os.environ['LB_HOST1_HOST'] = 'localhost'
# os.environ['LB_HOST1_PORT'] = '20000'
# os.environ['LB_HOST1_METRICS_PORT'] = '20001'
# os.environ['LB_HOST2_HOST'] = 'localhost'
# os.environ['LB_HOST2_PORT'] = '30000'
# os.environ['LB_HOST2_METRICS_PORT'] = '30001'
env_config_loader = EnvConfigLoader(prefix="LB")
Initialize the server finder, find the best server and connect to it
metrics_based_server_finder = env_config_loader.init_metrics_based_server_finder()
best_host = metrics_based_server_finder.fetch_metrics()
channel = grpc.insecure_channel(f"{best_host[0]}:{best_host[1]}")
client = create_example_grpc_client(channel) # implement this function yourself
# Use the client to send requests to the server
Troubleshooting
If you have any problems with grpc_load_balancer
, please open an issue on GitHub.
Also, you can check tests/test_grpc_load_balancer.py for more information.
Contributing
We welcome contributions to grpc_load_balancer
. If you find a bug or want to propose a new feature, please open a GitHub issue or submit a pull request.
License
This project is licensed under the MIT License. See LICENSE for details.