The distribution will be narrow and peak at around 1 second, though, which may not be what you want. Of course, the OP has since indicated that he meant non-web uses of HTTP rather than serving web sites...
On Sat, Nov 16, 2013 at 7:10 PM, Colin Fleming <colin.mailingl...@gmail.com>wrote: > Web browsers don't "pick a random sleep time before trying again", though; >> they display a 500 error page and the user promptly clicks "reload" while >> making an exasperated sigh. >> > > That sounds like "picking a random sleep time before trying again" to me > :-) > > >> If the client is something other than a web browser, then we're no >> longer talking about the web, but some other thing, like SMTP or whatever. >> And then we're outside the scope of my earlier remark, which specifically >> mentioned the web. Not to mention outside the scope of the OP's product, >> which was clearly referred to as a "Ring middleware" and not some other >> sort of server component for some other kind of server. >> >> Or were you meaning to suggest that the *users* pick a random sleep time >> before trying again? Good luck herding them cats. See also >> http://en.wikipedia.org/wiki/Wicked_problem ... >> >> >> >> On Sat, Nov 16, 2013 at 4:24 PM, James Reeves <ja...@booleanknot.com>wrote: >> >>> It may be useful for certain web services. If the server gets overloaded >>> by a temporary spike, the clients could pick a random sleep time before >>> trying again. >>> >>> - James >>> >>> >>> On 16 November 2013 21:15, Cedric Greevey <cgree...@gmail.com> wrote: >>> >>>> I can think of very few web apps where this would be a desirable >>>> approach. A user getting a spurious error in response to a URL that they >>>> *know* is valid is just going to hammer on the "reload" button until they >>>> get a correct response from the server. So the server will end up even more >>>> congested than if it just responded sluggishly but otherwise normally to >>>> the request. >>>> >>>> >>>> On Sat, Nov 16, 2013 at 1:21 PM, Rob Day <r...@rkd.me.uk> wrote: >>>> >>>>> 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. >>>>> >>>> >>>> -- >>>> -- >>>> 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. >>>> >>> >>> -- >>> -- >>> 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. >>> >> >> -- >> -- >> 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. >> > > -- > -- > 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. > -- -- 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.