5

什么限制了 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'),)
4

3 回答 3

0

如果您将sync工作进程用于 gunicorn(默认设置),那么与您的服务器的并发连接数只能与工作进程的数量一样多。

syncworker 是为 CPU 密集型任务设计的,因此建议使用worker 2N + 1(其中 N 是可用的内核数)。如果您的 SSE 端点是这个的逻辑等价物......

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

...然后你有一个 I/O 绑定视图。无论您在该代码块上投入多少 CPU 时间,它都被设计为永无止境。如果您使用该django_sse项目,那么这几乎正是您的 SSE 视图正在做的事情

解决方案是为 gunicorn 使用异步工作者类。安装gevent并将--worker-class=gevent选项传递给 gunicorn,您就在通往异步乌托邦的路上。

于 2013-02-23T00:30:17.107 回答
0

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

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

于 2013-08-21T06:45:56.720 回答
0

我有同样的问题。我确定我使用 gevent 作为工作人员,但我只有大约 6 个连接。

解决方案很愚蠢。这是浏览器的限制。我把它写在这里,让下一个偶然发现的人看到..

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

于 2013-08-12T10:36:48.633 回答