Hi all,
I've just published the first working version of a Ring middleware that
some of you might find useful. It's designed for web apps where, if
you're overloaded, it's better to serve some requests quickly and fail
the others than to try and serve all the requests and do it slowly. (My
background is in telecoms, where that's often the best approach.)
Specifically, you specify a target latency that you want 90% of requests
to try and meet, and it applies the algorithm from
http://www.eecs.harvard.edu/%7Emdw/papers/control-usits03.pdf to try and
keep your latency below that threshold. The exact parameters of the
algorithm are tunable, and different URLs or groups of URLs can have
different targets and parameters.
It still needs a bit of tidying - docstrings, cleaning up some of the
Midje tests, and so on - but it works and I think the documentation is
usable, so I'm announcing it now.
Github (w/ docs): https://github.com/rkday/overload-middleware
Clojars: https://clojars.org/overload-middleware
Let me know if you have any feedback!
Rob
P.S. I threw together a simple demo (available from
https://github.com/rkday/overload-middleware-demo) and tested it It
works as designed - the URL wrapped in the overload middleware fails
about 50% of requests, and so for the ones that succeed there's a
noticeable speed improvement (80% of results are served in 120ms as
opposed to 233ms for the unwrapped URL), though I suspect ab might be
counting the immediate 503s in this result and throwing it off. If
anyone has ideas for better tests, let me know!
2049 14:05:02 overload-demo $ for i in unwrapped wrapped; do ab -n 50000
-c 300 -q http://localhost:3000/$i; done
...
Document Path: /unwrapped
..
Failed requests: 0
...
Percentage of the requests served within a certain time (ms)
50% 178
66% 204
75% 216
80% 233
90% 358
95% 1117
98% 1211
99% 3097
100% 15196 (longest request)
...
Document Path: /wrapped
...
Failed requests: 25285
(Connect: 0, Receive: 0, Length: 25285, Exceptions: 0)
Write errors: 0
Non-2xx responses: 25285
...
Percentage of the requests served within a certain time (ms)
50% 67
66% 86
75% 108
80% 120
90% 1028
95% 1080
98% 1287
99% 3082
100% 15120 (longest request)
There's also no noticeable overhead in non-overload cases:
2050 14:07:30 overload-demo $ for i in unwrapped wrapped; do ab -n 50 -c
1 -q http://localhost:3000/$i; done
...
Document Path: /unwrapped
..
Failed requests: 0
...
Percentage of the requests served within a certain time (ms)
50% 33
66% 33
75% 33
80% 33
90% 33
95% 34
98% 35
99% 35
100% 35 (longest request)
...
Document Path: /wrapped
...
Failed requests: 0
...
Percentage of the requests served within a certain time (ms)
50% 33
66% 34
75% 34
80% 34
90% 34
95% 34
98% 34
99% 34
100% 34 (longest request)
--
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups "Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.