服务器发送事件和浏览器限制

2023-12-31

我有一个监听服务器发送事件的 Web 应用程序。当我在打开多个窗口的情况下进行工作和测试时,事情不起作用,我多次撞到头,朝错误的方向看:最终,我意识到问题出在并发连接上。

然而,我测试的数量非常有限,即使我在 Apache 上运行测试(我知道,我应该使用节点)。

然后,我切换浏览器并注意到一些非常有趣的事情:显然 Chrome 将服务器发送事件连接限制为 4-5,而 Opera 则没有。另一方面,Firefox 在 4-5 个同时连接后拒绝加载any其他页面。

这背后的原因是什么?该限制是否仅适用于来自同一源的 SSE 连接,或者如果我要测试从不同域打开它们,它是否会相同?我是否有可能滥用 SSE,这实际上会阻止浏览器,或者这是一种已知的行为?有什么办法解决吗?


这在所有浏览器中的工作方式是每个域获得有限数量的连接,并且限制对于整个应用程序是全局的。这意味着,如果您打开一个连接用于实时通信,那么您就少了一个用于加载图像、CSS 和其他页面的连接。最重要的是,您不会获得新选项卡或窗口的新连接,所有这些都需要共享相同数量的连接。这非常令人沮丧,但限制连接是有充分理由的。几年前,所有浏览器中的此限制均为 2(基于 (http://www.ietf.org/rfc/rfc2616.txt http://www.ietf.org/rfc/rfc2616.txt)HTTP1.1规范)但现在大多数浏览器一般使用4-10个连接。另一方面,移动浏览器仍然需要限制连接数量以节省电池电量。

这些技巧可用:

  1. 使用更多主机名。通过分配前。www1.example.com, www2.example.com您将获得每个主机名的新连接。这个技巧适用于所有浏览器。不要忘记更改 cookie 域以包含整个域(example.com, not www.example.com)
  2. 使用网络套接字。 Web 套接字不受这些限制的限制,更重要的是它们不会与网站的其他内容竞争。
  3. 打开新选项卡/窗口时重复使用相同的连接。如果您已将所有实时通信逻辑收集到一个对象调用集线器,您可以在所有打开的窗口上调用该对象,如下所示:

window.hub = window.opener ? window.opener.hub || new Hub() 4. 或使用 flash - 如今这并不是最好的建议,但如果 websockets 不是一个选项,它可能仍然是一个选项。 5. 请记住在每个 SSE 请求之间添加几秒钟的时间,以便在开始新请求之前清除排队的请求。还要为用户不活动的每一秒增加一点等待时间,这样您就可以将服务器资源集中在那些活动的用户上。还添加随机数的延迟以避免雷群问题 http://en.wikipedia.org/wiki/Thundering_herd_problem

另一件需要记住的事情是,当使用多线程和阻塞语言(例如 Java 或 C#)时,您可能会在长轮询请求中使用应用程序其余部分所需的资源。例如,在 C# 中,每个请求都会锁定 Session 对象,这意味着在 SSE 请求处于活动状态期间整个应用程序没有响应。

NodeJs 非常适合这些事情,原因有很多,正如您已经了解的那样,如果您使用 NodeJS,您会使用 socket.io 或 engine.io,它们通过使用 websockets、flashsockets 和 XHR-polling 为您解决所有这些问题而且因为它是非阻塞和单线程的,这意味着当它等待发送内容时,它会消耗服务器上很少的资源。 C# 应用程序每个等待请求都会消耗一个线程,仅该线程就需要至少 2MB 的内存。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

服务器发送事件和浏览器限制 的相关文章

随机推荐

  • Matlab上3D数据的椭球拟合

    我正在研究一个3D体积 of CT肺部图像 为了检测结节 我需要为每个可疑结节拟合一个椭球模型 我该如何为此编写代码 结节是疑似肿瘤的物体 我的算法需要检查每个物体 并将其近似为椭球体 并根据椭球体参数计算8个特征来构建分类器 通过训练和测
  • Rails:切换用户 Gem 以及切换回原始用户的问题

    在我的应用程序中我正在使用switch user https github com flyerhzm switch user https github com flyerhzm switch user gem 允许管理员以另一个用户身份登录
  • BASH:基本 if then 和变量赋值

    我习惯了 csh 所以不得不使用 bash 有点令人恼火 这段代码有什么问题 if time gt 0300 time lt 0900 then mod 2 else mod 0 fi 按照标准应该是 if time gt 300 time
  • 有没有办法了解导致“_NSTouchBarFinderObservation”崩溃的原因?

    我的 Crashlytics 显示多个用户遇到以下崩溃 见下文 我能够重新创建这个的唯一方法 我怀疑用户正在这样做 是打开 Xcode Touch Bar 模拟器并在generations当应用程序运行时 以下设备和操作系统已报告崩溃 ma
  • 一个测试用例应该涵盖多少内容?

    到目前为止 我从未编写过正确的测试 只编写了测试成功后我会处理的小程序 我正在浏览Python的unittest网络上的模块和教程 但我不清楚 一个应该多少钱TestCase覆盖 我在网上看到过一些例子TestCase仅具有一种方法的类 以
  • 从 Postgres 和 jOOQ 中的分层表递归生成 JSON 树

    我在 Postgres 数据库中有一个分层表 例如category 结构很简单 如下所示 id parent id name 1 null A 2 null B 3 1 A1 4 3 A1a 5 3 A1b 6 2 B1 7 2 B2 我需
  • 当我需要其他内容时,BASH 脚本正在等待

    我的 bash 脚本需要一些帮助 bin bash zenity list title Select Server text Select the server to start radiolist column column Server
  • 如何收集实时推文? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如何使用 Ruby 收集实时推文并将
  • Wicket 1.5(.2) 中的 url 更改时组件未重新加载?

    我第一次使用以下 URL 导航到我的应用程序 主页 0 用户 x 在调试模式下 我看到 wicket 很好地实例化了我的面板等 显然 如果我将 URL 更改为 主页 0 用户 y 那么什么也没有发生 面板不会重新初始化 对于新用户 gt 用
  • React 组件声明中“导出”的目的是什么?

    在 React ES6 中 为什么我有时看到这个吗 class Hello extends React Component 有时this export class Hello extends React Component 有何意义expo
  • 如何在protobuf中定义枚举的值和id? (原始java客户端)

    我对 protobuf 的使用很陌生 我计划编写带有枚举的 protobuf def 有什么方法可以在其中提供 id 值和描述 编译后我希望生成的枚举应该与下面的示例等效 enum Sample W 0 W P 0 P C 0 C B 0
  • Rails + devise:尝试删除用户帐户

    当我尝试在 Rails 应用程序中删除我的帐户时 我得到 没有路由匹配 users My View p We hate to see you go p 我的路线 user registration POST users format act
  • 如何为不同的根目录配置 xampp Web 服务器

    Web 目录是应用程序的所有公共文件和静态文件的所在地 包括图像 样式表和 JavaScript 文件 这也是前端控制器居住的地方 所以问题是当我安装并设置 xampp 时我的 web 目录是 xampp htdocs 我想将其设置为 xa
  • 将现有文件添加到不同的 Visual Studio 2010 项目

    是否可以将文件添加到位于不同目录中的 Visual Studio 项目中 但是将文件保留在这些目录中并在更新项目中的文件时更新这些文件 当我将现有文件添加到项目中时 它所做的只是将它们复制到项目中 然后更新复制的文件 而不是原始文件 有什么
  • 在脚本模块标记中使用 import 语句中的函数

    我正在尝试使用createPopup我使用导入的函数import我的脚本标签中的函数 但是 我总是收到错误消息 指出函数未定义 Uncaught ReferenceError createPopup is not defined 这是我的代
  • Xamarin Forms 自定义主题不起作用

    我有一个使用 Xamarin Forms 2 0 的 Android 应用程序 我制作了一个自定义主题来设置一些颜色 我创建了这些文件 资源 值 styles xml AndroidResource
  • Numpy dtype - 数据类型不理解

    我有一个数据框 我正在查看与每列关联的数据类型 当我跑步时 In 23 df dtype descr Out 24 u date
  • Ruby 中具有前瞻功能的正则表达式

    我当前的正则表达式之争是替换字符串中数字之前的所有逗号 然后 正则表达式必须忽略所有以下逗号 我已经在 rubular 上折腾了大约一个小时 但似乎没有什么效果 测试字符串 this is a sentence33 Here is anot
  • Contiki 无线编程

    我正在通过一个项目开始在天空微粒上使用 Contiki 我现在正在尝试让无线编程正常工作 我一直在查看 example sky shell exec 和 apps shell 我觉得我需要通过 sky shell exec 和可能的 tes
  • 服务器发送事件和浏览器限制

    我有一个监听服务器发送事件的 Web 应用程序 当我在打开多个窗口的情况下进行工作和测试时 事情不起作用 我多次撞到头 朝错误的方向看 最终 我意识到问题出在并发连接上 然而 我测试的数量非常有限 即使我在 Apache 上运行测试 我知道