A Python toolkit for Rendezvous/Highest Random Weight (HRW) hash based routing.
>>> import proxenos.mappers.consul
>>> import proxenos.rendezvous
>>> mapper = proxenos.mappers.consul.ConsulClusterMapper(
... host='localhost', port=8500)
>>> mapper.update()
>>> mapper.cluster
{SocketAddress(host=IPAddress('::'), port=8000),
SocketAddress(host=IPAddress('::'), port=8001),
SocketAddress(host=IPAddress('::'), port=8300),
SocketAddress(host=IPAddress('::'), port=8500)}
>>> mapper.select('github.com', proxenos.rendezvous.HashMethod.SIPHASH)
SocketAddress(host=IPAddress('::'), port=8001)
$ proxenos select -b consul -h localhost -p 8500 github.com
0.0.0.0:8300
- Support for multiple service discovery backends possible. Currently only support for Consul is implemented, but other backends coming eventually.
- Supports many different hash functions and PRFs. The default hashing method is the SipHash PRF.
- Provides a command-line interface for quickly testing/debugging node selection.
$ pip install proxenos[consul]
$ # If you'd like Murmur3 support, use:
$ pip install proxenos[consul,murmur]
Proxenos can be configured through environment variables.
- PROXENOS_MMH_SEED (int): The seed used for MurMur3 hashes.
- PROXENOS_MMH_OPTIMIZE (str): Set to
x64
orauto
. - PROXENOS_PRF (str): The default hashing method to use. Defaults to
siphash
. Can be set to one ofmd5
,sha1
,sha224
,sha256
,sha384
,sha512
,mmh_32
,mmh_64
,mmh_128
, orsiphash
. - PROXENOS_SIPHASH_KEY (str): The 128-bit SipHash key. A default key is provided, but users are advised to generate their own.
proxenos uses Python's PRNG for calculating the weight of nodes in
a cluster, rather than using a linear congruential generator (LCG)
as described in the original paper on Rendezvous hashing. Seeded
weights generated are limited to sys.maxsize
, which means the
resulting weights will differ depending on the platform architecture.