Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/cristalhq/hedgedhttp
Hedged HTTP client which helps to reduce tail latency at scale.
https://github.com/cristalhq/hedgedhttp
go golang http http-client latency scale timeout
Last synced: 6 days ago
JSON representation
Hedged HTTP client which helps to reduce tail latency at scale.
- Host: GitHub
- URL: https://github.com/cristalhq/hedgedhttp
- Owner: cristalhq
- License: mit
- Created: 2021-03-20T13:22:42.000Z (almost 4 years ago)
- Default Branch: main
- Last Pushed: 2024-08-13T16:33:37.000Z (6 months ago)
- Last Synced: 2025-01-24T08:02:55.523Z (13 days ago)
- Topics: go, golang, http, http-client, latency, scale, timeout
- Language: Go
- Homepage:
- Size: 50.8 KB
- Stars: 122
- Watchers: 5
- Forks: 10
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# hedgedhttp
[![build-img]][build-url]
[![pkg-img]][pkg-url]
[![reportcard-img]][reportcard-url]
[![coverage-img]][coverage-url]
[![version-img]][version-url]Hedged HTTP client which helps to reduce tail latency at scale.
## Rationale
See paper [Tail at Scale](https://www.barroso.org/publications/TheTailAtScale.pdf) by Jeffrey Dean, Luiz André Barroso. In short: the client first sends one request, but then sends an additional request after a timeout if the previous hasn't returned an answer in the expected time. The client cancels remaining requests once the first result is received.
## Acknowledge
Thanks to [Bohdan Storozhuk](https://github.com/storozhukbm) for the review and powerful hints.
## Features
* Simple API.
* Easy to integrate.
* Optimized for speed.
* Clean and tested code.
* Supports `http.Client` and `http.RoundTripper`.
* Dependency-free.## Install
Go version 1.16+
```
go get github.com/cristalhq/hedgedhttp
```## Example
```go
ctx := context.Background()
req, err := http.NewRequestWithContext(ctx, http.MethodGet, "https://google.com", http.NoBody)
if err != nil {
panic(err)
}timeout := 10 * time.Millisecond
upto := 7
client := &http.Client{Timeout: time.Second}
hedged, err := hedgedhttp.NewClient(timeout, upto, client)
if err != nil {
panic(err)
}// will take `upto` requests, with a `timeout` delay between them
resp, err := hedged.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
```Also see examples: [examples_test.go](https://github.com/cristalhq/hedgedhttp/blob/main/examples_test.go).
## Documentation
See [these docs][pkg-url].
## License
[MIT License](LICENSE).
[build-img]: https://github.com/cristalhq/hedgedhttp/workflows/build/badge.svg
[build-url]: https://github.com/cristalhq/hedgedhttp/actions
[pkg-img]: https://pkg.go.dev/badge/cristalhq/hedgedhttp
[pkg-url]: https://pkg.go.dev/github.com/cristalhq/hedgedhttp
[reportcard-img]: https://goreportcard.com/badge/cristalhq/hedgedhttp
[reportcard-url]: https://goreportcard.com/report/cristalhq/hedgedhttp
[coverage-img]: https://codecov.io/gh/cristalhq/hedgedhttp/branch/main/graph/badge.svg
[coverage-url]: https://codecov.io/gh/cristalhq/hedgedhttp
[version-img]: https://img.shields.io/github/v/release/cristalhq/hedgedhttp
[version-url]: https://github.com/cristalhq/hedgedhttp/releases