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

最佳答案

如果您将 sync 工作程序用于 gunicorn(默认),那么您的服务器的并发连接数只能与工作进程数一样多。
sync worker 是为 CPU 密集型任务设计的,因此建议使用 2N + 1 worker(其中 N 是可用内核数)。如果您的 SSE 端点与此逻辑等效...

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

...然后你就有了一个 I/O 绑定(bind)的 View 。无论您在该代码块上投入多少 CPU 时间,它都被设计为永无止境。如果您使用 django_sse 项目,那么这几乎就是 what your SSE view is doing

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

关于python - 太多的 sse 连接挂起网页,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14761713/

10-12 19:06