Semaphores for distributed systems.
Throttle provides semaphores as a service via an http interface. As the name indicates the primary usecase in mind is to throttle a systems access to a resource, by having the elements of that system to ask for permission (i.e. acquiring a lease) first. If the system consists of several process running on different machines, or virtual machines in the same Network, throttle might fit the bill.
Throttle aims to be easy to operate, well-behaved in edge cases and works without a persistence backend.
Work in progress, interfaces are still unstable.
Assuming the throttle executable to be in your path environment variable, you start a throttle sever by executing it. You can display the availible command line options using the --help
flag. Starting it without any arguments is going to boot the server with default configuration.
bash
throttle
This starts the server in the current process. Navigate with a browser to localhost:8000
to see a welcoming message. You can shut Throttle down gracefully by pressing Ctrl + C
.
Set the THROTTLE_LOG
environment variable to see more output on standard error. Valid values are ERROR
, WARN
, INFO
, DEBUG
and TRACE
.
In bash:
bash
THROTTLE_LOG=WARN
or PowerShell:
shell
$env:THROTLLE_LOG="WARN"
Starting the server now with an empty configuration yields a warning.
log
[2020-03-03T19:02:42Z WARN throttle] No semaphores configured.
Hint: Enabling Gelf logging currently disables logging to standard error.
To actually serve semaphores, we need to configure their names and full count. By default Throttle is looking for a configuration in the working directories throttle.toml
file should it exist.
```toml
littercollectioninterval = "5min"
[semaphores]
A = 42
[logging.gelf] name = "MyThrottleServer" host = "mygrayloginstance.cloud" port = 12201
level = "INFO" ```
Throttle supports Prometheus metrics, via the /metrics
endpoint. Depending on your configuration and state they may e.g. look like this:
```prometheus
throttle_count{semaphore="A"} 0
throttlefullcount{semaphore="A"} 42
throttlelongestpending_sec{semaphore="A"} 0
throttlenum404 0
throttle_pending{semaphore="A"} 0 ```
Throttle ships with a Python client. Here is how to use it in a nutshell.
```python from throttle_client import Client, lock
c = Client("http://localhost:8000")
with lock(c, "A"): # Do stuff while holding lock to "A" # ...
```
The server binary is published to crates.io and thus installable via cargo.
bash
cargo install throttle-server
Python client is publish to PyPi and can be installed using pip.
bash
pip install throttle-client
Checkout the sources with
bash
git clone https://github.com/pacman82/throttle.git
You can run the build and run unit tests by executing
bash
cd throttle
cargo test
Execute integration test with clients
bash
cd python_client
pip install -r test-requirements.txt
pip install -e .
pytest