pyhystrix
A library to patch requests package in order to add following functionalities by default:
- Connection and Read timeouts
- Retries on connection failure
- Circuitbreaking
- Adding unique
x-request-id
in request header if not provided
NOTE:: 0.0.2 supports python2.7 and >= 0.0.3 supports python3 only.
Installation
pip3 install pyhystrix
Usage
Before making any request, just call Init()
:
import requests
import pyhystrix
requests.get("http://abc.xyx") // No functionalities of pyhystrix
pyhystrix.Init()
requests.get("http://abc.xyx") // pyhystrix is attached to all requests
Default Configurations can be changed in 2 ways:
-
Setting following env variables:
-
PHY_CONNECT_TIMEOUT
: connection timeout in sec -
PHY_READ_TIMEOUT
: read timeout in seconds -
PHY_MAX_RETRIES
: max number of retries for connection failure -
PHY_CIRCUIT_FAIL_THRESHOLD
: Number of failed requests after which circuit will be open and further requests on the same url will not be allowed. -
PHY_CIRCUIT_ALIVE_THRESHOLD
: Number of failed requests on open circuit to make it half_open (Described below) -
PHY_CIRCUIT_DELAY
: Number of seconds after which open circuit will be half_open.
-
-
parameters in request itself:
-
max_tries
(int): overridesPHY_MAX_RETRIES
, some rules related to it are follows:-
max_tries=0
: will cause no retries, fail on first failure. - If a positive value is passed for non
GET
requests, they will be retried too in case received status is instatus_forcelist
.
-
-
status_forcelist
: list of http status, retry if the returned status is one of these. default is[500]
onGET
. -
timeout
: same as timeout in requests -
backoff_factor
: delay in each retry will be affected by this using following formula:{backoff factor} * (2 ^ ({number of total retries} - 1))
. Default =0.5
sec
-
More Examples
-
GET
with retry on multiple failure status codes:
import requests
import pyhystrix
pyhystrix.Init()
request.get("http://abc.xyz", status_forcelist=[501, 502, 403])
-
put
with retry on response status =500
or501
request.put("http://abc.xyz", max_tries=3, status_forcelist=[500, 502])
NOTE: All type of requests will be retried in case of ConnectionError
Circuit Breaker States
- OPEN : No requests will be allowed
- HALF_OPEN : Only one request will be allowed
- CLOSE : All requests will be allowed.
NOTE : State transitions:
CLOSE --> OPEN --> HALF_OPEN --> CLOSE/OPEN