Liking cljdoc? Tell your friends :D

http-kit
Documentation | Latest releases | Get support

http-kit

Simple, high-performance event-driven HTTP client+server for Clojure

http-kit is a minimalist and efficient Ring-compatible HTTP client+server for Clojure.

It uses an event-driven architecture to support highly concurrent a/synchronous web applications, and features a simple unified API for WebSocket and HTTP long-polling/streaming.

Latest release/s

  • 2023-06-30 2.7.0 (stable): changes
  • 2023-09-27 2.8.0-beta1 (dev): changes

Main tests Graal tests

See here for earlier releases.

Why http-kit?

  • Ring compliant: http-kit is a drop-in replacement for the standard Ring Jetty adapter. You can use it with all your current libraries and middleware.

  • High performance: http-kit uses an event-driven architecture like nginx, and is fast. See here for benchmarks.

  • High concurrency: http-kit is efficient. Its RAM usage is O(n), with only few kB used per connection. Tests have shown http-kit happily serving >600k concurrent connections.

  • Clean, simple, small: written from the ground-up to be lean, the entire http-kit client+server JAR is ~90kB with zero dependencies and ~3k total lines of code.

  • Sync or async: synchronous is simple, asynchronous fast & flexible. With http-kit you get the best of both with a simple API that lets you mix & match to best fit your use case.

  • WebSockets: realtime web apps are a breeze with http-kit, with great out-the-box support for both WebSockets and efficient HTTP long-polling.

Performance

http-kit includes an extensive and easy-to-use benchmark suite.

To run the benchmark suite on your own system:

  1. Ensure that you have wrk installed
  2. Clone this http-kit repo
  3. Run rake bench or rake bench['{<edn-opts>}'] from the repo's root dir

Detailed results will be automatically exported to .edn and .csv files.

See the benchmark namespace for more info on options and advanced usage.

Benchmark philosophy

A good benchmark is clear, accurate, and useful for some well-defined purpose. Designing good benchmarks can be surprisingly difficult, especially general-purpose comparative benchmarks.

And unfortunately the accurate interpretation of results can often be just as difficult.

It's tempting to want to conclude that "X is faster/cheaper/better than Y", but real-world trade-offs mean that these kind of simplistic statements rarely make sense without a good bit of context.

The approach I've taken with the benchmarks here is to emphasize testing across a wide range of parameters (currently 480 combinations in total).

All the results are available in detailed .csv files and Google sheets, making it easy to filter and compare the results most applicable to your particular scenario and goals.

I'd also encourage folks to explore the extensive customization options, and to be critical of the methodology used.

Additions and improvements are very welcome!

- Peter Taoussanis

Latest results

TODO (ETA: 2023-10-05)

Project status

http-kit was created by @shenfeng, but is currently being maintained by its community.

A big thank-you to the current contributors for keeping the project going! Additional contributors very welcome: please ping me if you'd be interested in lending a hand.

- Peter Taoussanis

Documentation

License

Copyright © 2012-2023 Feng Shen and contributors.
Licensed under Apache 2.0.

Can you improve this documentation? These fine people already did:
feng, Peter Taoussanis, James Carnegie, Ben Sless, iacopo, Philip Aston, Dmitri Sotnikov, Samy Dindane, Alexander Oloo, Michiel Borkent & Francesco Pischedda
Edit on GitHub

cljdoc is a website building & hosting documentation for Clojure/Script libraries

× close