-
Notifications
You must be signed in to change notification settings - Fork 150
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: add blutgang rpc load balancer (#569)
- Loading branch information
1 parent
56d2fa3
commit 1be5f95
Showing
8 changed files
with
227 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,131 @@ | ||
shared_utils = import_module("../shared_utils/shared_utils.star") | ||
constants = import_module("../package_io/constants.star") | ||
SERVICE_NAME = "blutgang" | ||
|
||
HTTP_PORT_ID = "http" | ||
HTTP_PORT_NUMBER = 3000 | ||
|
||
ADMIN_PORT_ID = "admin" | ||
ADMIN_PORT_NUMBER = 5715 | ||
|
||
BLUTGANG_CONFIG_FILENAME = "config.toml" | ||
|
||
BLUTGANG_CONFIG_MOUNT_DIRPATH_ON_SERVICE = "/config" | ||
|
||
IMAGE_NAME = "makemake1337/blutgang:latest" | ||
# IMAGE_NAME = "busybox:latest" | ||
|
||
# The min/max CPU/memory that blutgang can use | ||
MIN_CPU = 100 | ||
MAX_CPU = 1000 | ||
MIN_MEMORY = 128 | ||
MAX_MEMORY = 2048 | ||
|
||
USED_PORTS = { | ||
HTTP_PORT_ID: shared_utils.new_port_spec( | ||
HTTP_PORT_NUMBER, | ||
shared_utils.TCP_PROTOCOL, | ||
shared_utils.HTTP_APPLICATION_PROTOCOL, | ||
), | ||
ADMIN_PORT_ID: shared_utils.new_port_spec( | ||
ADMIN_PORT_NUMBER, | ||
shared_utils.TCP_PROTOCOL, | ||
shared_utils.HTTP_APPLICATION_PROTOCOL, | ||
), | ||
} | ||
|
||
|
||
def launch_blutgang( | ||
plan, | ||
config_template, | ||
participant_contexts, | ||
participant_configs, | ||
network_params, | ||
global_node_selectors, | ||
): | ||
all_el_client_info = [] | ||
for index, participant in enumerate(participant_contexts): | ||
full_name, _, el_client, _ = shared_utils.get_client_names( | ||
participant, index, participant_contexts, participant_configs | ||
) | ||
all_el_client_info.append( | ||
new_el_client_info( | ||
el_client.ip_addr, | ||
el_client.rpc_port_num, | ||
el_client.ws_port_num, | ||
full_name, | ||
) | ||
) | ||
|
||
template_data = new_config_template_data( | ||
network_params.network, HTTP_PORT_NUMBER, all_el_client_info | ||
) | ||
|
||
template_and_data = shared_utils.new_template_and_data( | ||
config_template, template_data | ||
) | ||
template_and_data_by_rel_dest_filepath = {} | ||
template_and_data_by_rel_dest_filepath[BLUTGANG_CONFIG_FILENAME] = template_and_data | ||
|
||
config_files_artifact_name = plan.render_templates( | ||
template_and_data_by_rel_dest_filepath, "blutgang-config" | ||
) | ||
|
||
config = get_config( | ||
config_files_artifact_name, | ||
network_params, | ||
global_node_selectors, | ||
) | ||
|
||
plan.add_service(SERVICE_NAME, config) | ||
|
||
|
||
def get_config( | ||
config_files_artifact_name, | ||
network_params, | ||
node_selectors, | ||
): | ||
config_file_path = shared_utils.path_join( | ||
BLUTGANG_CONFIG_MOUNT_DIRPATH_ON_SERVICE, | ||
BLUTGANG_CONFIG_FILENAME, | ||
) | ||
|
||
return ServiceConfig( | ||
image=IMAGE_NAME, | ||
ports=USED_PORTS, | ||
files={ | ||
BLUTGANG_CONFIG_MOUNT_DIRPATH_ON_SERVICE: config_files_artifact_name, | ||
}, | ||
cmd=["/app/blutgang", "-c", config_file_path], | ||
min_cpu=MIN_CPU, | ||
max_cpu=MAX_CPU, | ||
min_memory=MIN_MEMORY, | ||
max_memory=MAX_MEMORY, | ||
node_selectors=node_selectors, | ||
ready_conditions=ReadyCondition( | ||
recipe=GetHttpRequestRecipe( | ||
port_id="admin", | ||
endpoint="/ready", | ||
), | ||
field="code", | ||
assertion="==", | ||
target_value=200, | ||
), | ||
) | ||
|
||
|
||
def new_config_template_data(network, listen_port_num, el_client_info): | ||
return { | ||
"Network": network, | ||
"ListenPortNum": listen_port_num, | ||
"ELClientInfo": el_client_info, | ||
} | ||
|
||
|
||
def new_el_client_info(ip_addr, rpc_port_num, ws_port_num, full_name): | ||
return { | ||
"IP_Addr": ip_addr, | ||
"RPC_PortNum": rpc_port_num, | ||
"WS_PortNum": ws_port_num, | ||
"FullName": full_name, | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
# To use the config file, use the -c/--config option pointing to the path of a config file | ||
|
||
# Config for blutgang goes here | ||
[blutgang] | ||
# Clear the cache DB on startup | ||
do_clear = false | ||
# Where to bind blutgang to | ||
address = "0.0.0.0:3000" | ||
# Moving average length for the latency | ||
ma_length = 100 | ||
# Sort RPCs by latency on startup. Recommended to leave on. | ||
sort_on_startup = true | ||
# Enable health checking | ||
health_check = true | ||
# Enable content type header checking. Set this to `true` if you want | ||
# Blutgang to be JSON-RPC compliant. | ||
header_check = true | ||
# Acceptable time to wait for a response in ms | ||
ttl = 30 | ||
# How many times to retry a request before giving up | ||
max_retries = 32 | ||
# Block time in ms, used as a sanity check when not receiving subscriptions | ||
expected_block_time = 13000 | ||
# Time between health checks in ms | ||
health_check_ttl = 400 | ||
# Supress the health check running info messages | ||
supress_rpc_check = false | ||
|
||
# Note: the admin namespace contains volatile functions and | ||
# should not be exposed publicly. | ||
[admin] | ||
# Enable the admin namespace | ||
enabled = true | ||
# Address for the admin RPC | ||
address = "0.0.0.0:5715" | ||
# Only allow read-only methods | ||
# Recommended `true` unless you 100% need write methods | ||
readonly = true | ||
# Enable the use of JWT for auth | ||
# Should be on if exposing to the internet | ||
jwt = false | ||
# jwt token | ||
key = "" | ||
|
||
# Sled config | ||
# Sled is the database we use for our cache, for more info check their docs | ||
[sled] | ||
# Path to db | ||
db_path = "./blutgang-cache" | ||
# sled mode. Can be HighThroughput/LowSpace | ||
mode = "HighThroughput" | ||
# Cache size in bytes. | ||
cache_capacity = 1000000000 | ||
# Use zstd compression. Reduces size 60-70%, | ||
# and increases CPU and latency by around 10% for db writes and 2% for reads. | ||
# If storage constrained, it's fine to have it be on. | ||
compression = false | ||
# Print DB profile when dropped. Doesn't do anything for now. | ||
print_profile = false | ||
# Frequency of flushes in ms | ||
flush_every_ms = 240 | ||
|
||
# Add separate RPCs as TOML tables | ||
# DO NOT name an rpc `blutgang`, `admin`, or `sled` | ||
|
||
|
||
# RPC Node Endpoints | ||
{{ range $elClient := .ELClientInfo }} | ||
[{{ $elClient.FullName }}] | ||
url = "http://{{ $elClient.IP_Addr }}:{{ $elClient.RPC_PortNum }}" | ||
ws_url = "ws://{{ $elClient.IP_Addr }}:{{ $elClient.WS_PortNum }}" | ||
max_consecutive = 150 | ||
max_per_second = 200 | ||
{{- end }} |