什么限制了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'),)
答案 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},当然,您可以将数字更改为更多并进行测试。
所以这不是服务器端的问题。