什么限制了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/