<p>I am writing a a SockJS server in go using the SockJS-go package. I want to be able to have a connection throttling mechanism which will ensure that I not get more new tcp connections than I can handle at a time.</p>
<p>Presently, I have code that looks like this.</p>
<pre><code>listener, err := net.Listen("tcp", endpoint)
http.Serve(listener, nil)
</code></pre>
<p>How can I ensure that the server accepts atmost say 200 new connections/second and the rest are rejected.</p>
<p>I know that there are packages to rate limit the number of http requests/sec. But what I am looking for is rate limiting number of new connections coming in.</p>
<hr/>**评论:**<br/><br/>zeiko_is_back: <pre><pre><code>package llimit
import (
"context"
"net"
"golang.org/x/time/rate"
)
type throttledListener struct {
net.Listener
*rate.Limiter
}
func NewThrottledListener(l net.Listener, r *rate.Limiter) net.Listener {
return &throttledListener{l, r}
}
func (l *throttledListener) Accept() (net.Conn, error) {
l.Wait(context.Background())
return l.Listener.Accept()
}
</code></pre>
<p>.</p>
<pre><code>l, _ := net.Listen("tcp", endpoint)
r := rate.NewLimiter(rate.Limit(200), 1)
l = llimit.NewThrottledListener(l, r)
http.Serve(l, nil)
</code></pre></pre>pmjtoca: <pre><p>You should investigate the rate limiter by juju (see: <a href="https://github.com/juju/ratelimit" rel="nofollow">https://github.com/juju/ratelimit</a>) based on the token bucket algorithm.
In particular in the 'ratelimit_test.go' you have an: 'about: "concurrent requests"....'. </p>
<p>The ratelimit provided by Roger Peppe is not tied to data transfer limiting, I.e. you can limit arbitrary things with it.</p>
<p>And there is also: <a href="https://godoc.org/astuart.co/limio" rel="nofollow">https://godoc.org/astuart.co/limio</a> with its positioning towards juju/ratelimiter here: <a href="https://groups.google.com/forum/#!topic/go-kit/gWjYUyH4dY8" rel="nofollow">https://groups.google.com/forum/#!topic/go-kit/gWjYUyH4dY8</a></p></pre>Robonia: <pre><p>Your link leads to a 404. </p>
<p>Edit: Correct link <a href="https://github.com/juju/ratelimit" rel="nofollow">https://github.com/juju/ratelimit</a></p></pre>pmjtoca: <pre><p>Sorry. It is corrected.</p></pre>faster: <pre><p>Can Throttled (<a href="https://github.com/throttled/throttled" rel="nofollow">https://github.com/throttled/throttled</a>) do that?</p></pre>eviltofu: <pre><p>I'm quite new to Go but I've given this a stab. <a href="https://gist.github.com/eviltofu/c3441eef2ea58d16725f7ef0b2ba1adf" rel="nofollow">https://gist.github.com/eviltofu/c3441eef2ea58d16725f7ef0b2ba1adf</a></p>
<p>edit: <em>oops</em> I made the mistake in assuming that it was a socket listener but I think the same principles can apply?</p></pre>tgulacsi: <pre><p>You can use a buffered channel to limit concurrent connections, but you need to put it into the for loop before the accept.
(Insert a struct{}{} into the chan before calling accept, and recv from the chan after you've closed the connection).</p></pre>lesmond: <pre><p>You could use a channel to pipeline them across to?</p>
<p>Make it buffered and check the length before adding to it. </p></pre>
![](https://static.golangjob.cn/static/img/banner.png)