<div dir="ltr">Hi!<div><br></div><div>Some time ago I've implemented a rate limiter microservice for clustered services.</div><div>It's undocumented (no time for that), but maybe you will find it useful.</div><div><br></div><div>Rate limiter core: <a href="https://github.com/stolen/erater">https://github.com/stolen/erater</a></div><div>HTTP API for it (just in case) <a href="https://github.com/stolen/erateserver">https://github.com/stolen/erateserver</a><br><br>The limiting logic is located in erater_counter module.</div><div>Counter behavior is configured with two options: rps and burst. Burst is how many requests are allowed just after start or after a long period of inactivity.</div><div>Also there is ttl option which is used to terminate unneeded counter processes.</div><div><br></div><div>Usage examples:</div><div><div><font face="monospace, monospace">63> f(C), {ok, C} = erater_counter:start_link(none, none, [{mode, adhoc}, {rps, 0.3}, {burst, 3}, {ttl, 60000}]).</font></div><div><font face="monospace, monospace">{ok,<0.130.0>}</font></div><div><font face="monospace, monospace">64> erater_counter:acquire(C, 0).</font></div><div><font face="monospace, monospace">{ok,0}</font></div><div><font face="monospace, monospace">65> erater_counter:acquire(C, 0).</font></div><div><font face="monospace, monospace">{ok,0}</font></div><div><font face="monospace, monospace">66> erater_counter:acquire(C, 0).</font></div><div><font face="monospace, monospace">{ok,0}</font></div><div><font face="monospace, monospace">67> erater_counter:acquire(C, 0).</font></div><div><font face="monospace, monospace">{error,overflow}</font></div><div><font face="monospace, monospace">68> erater_counter:acquire(C, 0).</font></div><div><font face="monospace, monospace">{error,overflow}</font></div><div><font face="monospace, monospace">69> erater_counter:acquire(C, 0).</font></div><div><font face="monospace, monospace">{error,overflow}</font></div><div><font face="monospace, monospace">70> erater_counter:acquire(C, 0).</font></div><div><font face="monospace, monospace">{ok,0}</font></div><div><font face="monospace, monospace">71> erater_counter:acquire(C, 0).</font></div><div><font face="monospace, monospace">{error,overflow}</font></div></div><div><font face="monospace, monospace"><br></font></div><div><font face="arial, helvetica, sans-serif">The</font><font face="monospace, monospace"> second argument of </font><span style="font-family:monospace,monospace">acquire </span><font face="arial, helvetica, sans-serif">is</font><font face="monospace, monospace"> </font><font face="arial, helvetica, sans-serif">used to register future hit — if the client wants to wait a little instead of retrying request later:</font></div><div><div><font face="monospace, monospace">59> erater_counter:acquire(C, 5000).</font></div><div><font face="monospace, monospace">{ok,0}</font></div><div><font face="monospace, monospace">60> erater_counter:acquire(C, 5000).</font></div><div><font face="monospace, monospace">{ok,1311}</font></div><div><font face="monospace, monospace">61> erater_counter:acquire(C, 5000).</font></div><div><font face="monospace, monospace">{error,overflow}</font></div><div><font face="monospace, monospace">62> erater_counter:acquire(C, 5000).</font></div><div><font face="monospace, monospace">{ok,2059}</font></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, May 25, 2017 at 9:14 AM, Brezal Campio <span dir="ltr"><<a href="mailto:brezal.campio@gmail.com" target="_blank">brezal.campio@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">For a some function which is the following:<div>  - begin with request count at 0<br><div>  - check current request count</div><div>  - if current current is less than allowed requests</div><div>    - spin up a new process</div><div>    - way for some given time and reset count to 0</div></div><div><br></div><div>This is a naive approach to rate limiting, but is there common terminology for something like this?</div><div><br></div><div>I am interested in less naive approaches to rate limiting requests as well if anyone is willing to point in the right direction.</div><div><br></div><div>Ciao!<br></div></div>
<br>______________________________<wbr>_________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" rel="noreferrer" target="_blank">http://erlang.org/mailman/<wbr>listinfo/erlang-questions</a><br>
<br></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><font face="'courier new', monospace">Danil Zagoskin | <a href="mailto:z@gosk.in" target="_blank">z@gosk.in</a></font></div></div></div>
</div>