太多的sse连接挂起了网页

时间:2013-02-07 21:52:53

标签: python django gunicorn server-sent-events

什么限制了SSE(服务器发送事件)连接的数量?

我一直在使用django / gunicorn / django-sse开展项目。

当我限制页面的sse连接数量时,我的项目很有效(5个工作6个挂起),这不是一个很大的问题因为我使用分页因此可以限制每页的数量。但是我希望能够拥有我喜欢的数量。

我的问题是:连接的数量是减慢速度,还是传输的数据量?

第一个问题我认为我可以通过让他们共享一个连接来修复,但第二个问题可能会限制我一点。

它可能是什么想法?

编辑:

客户端JS SSE代码:

function event(url, resource_name, yes, no, audio_in, audio_out, current_draw){
    /**
     * Listens for events posted by the server
     * 
     * Useful site for understanding Server Sent Events:
     *    http://www.w3.org/TR/eventsource/
     */
    var source = new EventSource(url);
    source.addEventListener("message", function(e) {
        resetTime(resource_name);
        data = updateStatus(e.data, yes, no, audio_in, audio_out, current_draw);
        document.getElementById(resource_name+"-in").src = data.audio_in_src
        document.getElementById(resource_name+"-in").alt = data.audio_in_alt
        document.getElementById(resource_name+"-out").src = data.audio_out_src
        document.getElementById(resource_name+"-out").alt = data.audio_out_alt
        document.getElementById(resource_name+"-current").innerHTML = data.current_draw + " A"
    });
}
在views.py中

class ServerSentEvent(RedisQueueView):

    def get_redis_channel(self):
        """
        Overrides the RedisQueueView method to select the channel to listen to
        """
        return self.kwargs["resource_name"]
在urls.py中

urlpatterns = patterns('',
                       url(r'^$',
                           views.Resources_page.as_view(),
                           name='resources_page'),
                       url(r'^(?P<resource_name>\w+)/$',
                           views.StatusPage.as_view(),
                           name='status_page'),
                       url(r'^(?P<resource_name>\w+)/sse/$',
                           views.ServerSentEvent.as_view(),
                           name='sse'),)

3 个答案:

答案 0 :(得分:0)

如果您正在使用sync worker for gunicorn(默认值),那么您只能拥有与服务器进程一样多的并发连接。

sync worker专为CPU绑定任务而设计,因此建议使用2N + 1个worker(其中N是可用的核心数)。如果您的SSE端点与此相当......

while True:
    msg = "foo"
    yield msg
    sleep(1)

...然后你有一个I / O绑定视图。无论你在那段代码中浪费了多少CPU时间,它都是永远不会结束的。如果您使用django_sse项目,那么这几乎就是what your SSE view is doing

解决方案是使用异步工作类来获取gunicorn。安装gevent并将--worker-class=gevent选项传递给gunicorn,然后您即可进入异步乌托邦。

答案 1 :(得分:0)

我遇到了完全相同的问题。我确信我使用gevent作为工作者,但我只有大约6个连接。

解决方案很愚蠢。这是一个浏览器限制。我正在这里写下来让下一个人偶然发现这个......

在firefox中,about:config中有一个名为network.http.max-persistent-connections-per-server的参数控制它。所以我的案例中的解决方案是从6(默认)或使用多个浏览器增加该数字..

答案 2 :(得分:0)

浏览器通常会限制与同一服务器的连接,您可以从浏览器的配置中检查,例如在Firefox中,您可以在页面上查看“about:config”,在这里您可以看到这样的键:value {network.http.speculative-parallel-limit 6},当然,您可以将数字更改为更多并进行测试。

所以这不是服务器端的问题。