Firefox的EventSource是否存在最大并行连接数限制?如何调整?
你遇到的这个问题确实是浏览器层面的并发连接限制导致的,和你的HttpServer实现无关——毕竟你用curl能正常请求counter7和counter8,说明服务器本身是没问题的。
为什么会出现这个情况?
现代浏览器为了避免对单个服务器造成过度负载,都会限制单个域名下的HTTP持久连接数。Firefox的默认限制就是单个域名最多同时保持6个持久连接,而EventSource(SSE)依赖的正是HTTP持久连接来持续接收服务器推送的事件。当你创建第7个、第8个EventSource时,浏览器会把这些请求排队,直到之前的某个连接关闭,才会发送新的请求——但因为SSE是长连接,只要你的仪表盘不关闭,这些排队的请求就永远没机会被发送。
从你的日志也能佐证这一点:服务器只收到了前6个请求的日志,后面两个请求根本没到达服务器,完全是浏览器在本地拦截了。
解决方法
根据你的使用场景,推荐按优先级尝试以下方案:
1. 合并多个SSE流为一个(最推荐,生产环境友好)
这是最优解,既不需要修改浏览器设置,也能提升整体性能。你可以把所有counter的更新都通过单个EventSource连接发送,客户端收到事件后再根据标识分发到对应的组件:
- 服务器端:维护所有counter的状态,每次更新时,发送带有自定义事件类型的消息(比如
event: counter1,然后是data: 123); - 客户端:针对每个counter监听对应的事件类型,比如
source.addEventListener('counter1', (e) => { /* 更新counter1 */ })。
这样不管你有多少个counter,都只占用1个持久连接,完全避开浏览器的限制。
2. 临时修改Firefox配置(仅用于开发调试)
如果只是在开发阶段需要测试多SSE连接的场景,可以临时调整Firefox的连接限制:
- 在地址栏输入
about:config,搜索network.http.max-persistent-connections-per-server; - 将默认值6修改为你需要的数值(比如10)。
注意:这个方法只适合自己调试用,普通用户不会去修改浏览器配置,所以不能作为生产环境的解决方案。
3. 子域名分流(复杂度较高)
如果必须保留多个独立的SSE连接,可以把不同的counter部署到不同的子域名下(比如counter1.yourdomain.com、counter2.yourdomain.com)。因为浏览器的连接限制是按域名划分的,不同子域名的连接不会共享这个限额。不过这个方案需要额外配置DNS和服务器,部署成本较高。
内容的提问来源于stack exchange,提问作者wellsaid

