Websocket 可扩展性、广播问题

2024-01-06

如果您有一个包含许多用户(和服务器)的复杂要求,您的 websocket 基础设施(服务器)将如何扩展,尤其是广播?

当然,广播不是任何 websocket 规范的一部分,但它甚至存在于基本的聊天示例中(又名 websocket 的 hello world)。

客户端(请求新数据)解决方案似乎仍然比服务器端(广播)解决方案更具可扩展性,因为 Websocket 具有低延迟和相对便宜(http 无头)的特性。

Edit:

好吧,假设您想用 websocket 实现替换所有 ajax 代码,这可能意味着在如此多的不同上下文中存在如此多的连接。如果您想跟踪每个可能的广播场景,这会给您的系统增加巨大的复杂性。

低(网络/线程等)级别的实现建议也是问题的一部分,而不是解决方案,因为这意味着您必须编写与一般 http 服务器不同的特殊服务器。

此外,广播带来了某种无法轻易扩展的状态特性。考虑添加更多服务器和负载平衡。


扩展实时网络解决方案可能是一个复杂的问题,但像这样的服务Pusher http://pusher.com(我为之工作的人)已经解决了,并且有最明确的解决方案定义为自托管实时网络解决方案 http://www.leggetter.co.uk/real-time-web-technologies-guide#self-hosted - the 发布订阅范式 http://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern很好理解并且已经被解决了很多次,为了解决问题需要有某种状态(谁在订阅什么)。该范例用于广播您正在讨论的场景类型。

实时网络技术在构建时就考虑到了大量的同时连接——许多是从头开始的。如果您想创建一个可扩展的解决方案,您很可能会使用支持 WebSocket 的现有实时 Web 服务器,就像您不太可能决定实现自己的 HTTP 服务器一样,您不太可能想要实现自己的服务器它从头开始支持 WebSockets。

专用实时 Web 服务器还允许您将应用程序逻辑与实时通信机制分开(关注点分离)。您的应用程序可能需要维护某种状态,但实时技术负责管理订阅和连接。如何实现应用程序和实时 Web 技术之间的通信取决于您,但经常使用消息队列,特别是redis http://redis.io在这个领域很受欢迎。

HTTP 轮询在概念上可能更容易理解 - 您可以保持无状态性,并且对于每个 HTTP 轮询请求,您可以准确指定您要查找的内容。但这绝对意味着您需要更快地开始扩展(添加更多资源来处理负载)。

WebSocket 轮询是我以前没有考虑过的东西,我想我以前也没有在任何地方看到过它的建议;客户应该说“我已经准备好接受下一组数据,这就是我想要的”,这是一个有趣的想法。 WebSocket 通常已经脱离了请求/响应范式,但在某些情况下,WebSocket 的效率提高以及使用它们的请求/响应可能会带来一些好处。这套接字流 https://github.com/socketstream/socketstream应用程序框架可能值得一看,因为它可能是相关的;初始应用程序加载后,所有通信都通过 WebSocket 执行,这意味着事件基本请求/响应功能使用 WebSocket。

然而,由于我们正在讨论广播数据,因此我们需要回到 PubSub 范例,在这种范例中,拥有活动订阅更有意义,并且当新数据可用时,新数据将分发到这些活动订阅(推送)。您的应用程序需要知道的是是否有任何活动订阅,以便决定是否发布数据。这个问题已经解决了。

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

Websocket 可扩展性、广播问题 的相关文章

  • Elastic Beanstalk 剥离 Sec-WebSocket-Accept 标头

    我正在尝试让 NET Core 应用程序在 elastic beanstalk 上运行 以从浏览器中的 javascript 接收 websockets 连接 当我在本地计算机上测试 AWS 之外的客户端和服务器时 我能够在两者之间建立 W
  • NodeJS Websocket如何在服务器重新启动时重新连接

    在 Node js 中我使用网络套接字 ws https github com websockets ws用于 WebSocket 连接 以下是客户端的代码 假设我们正在连接的服务器套接字宕机了一分钟 close 事件将会触发 但是每当服务
  • Websocket、Angular 2 和 JSON Web 令牌身份验证

    我的 Angular 2 应用程序 用打字稿编码 有一个简单的身份验证方案 用户登录 服务器返回 JSON Web 令牌 JWT abc123 在每次 API 调用时 应用程序都会将 JWT 发送到Authorization header
  • 使用来自 WebSocket @ServerEndpoint 的 CDI @SessionScoped bean

    在 Web 应用程序中 用户使用 servlet HTTP 会话 一些数据存储在 CDI SessionScoped beans 中 稍后在某些页面中 WebSocket 通信是在用户浏览器和服务器之间执行的 对于 GlassFish 4
  • 我可以使用单个 websocket 服务器同时打开 2 个端口吗

    我是 websocket 编程的新手 目前我正在开发一个简单的 websocket 服务器 使用 c 可以响应 websocket 客户端 我设法在单个端口上使用 1 个客户端和 1 个服务器 我想知道是否可以打开 2 个端口 以便不同的客
  • 如何使用 Scarlet 在 Android 上通过 WebSocket 进行连接?

    README md 中的代码 val scarletInstance Scarlet Builder webSocketFactory okHttpClient newWebSocketFactory GDAX URL addMessage
  • 哪个更快:多行还是多列?

    在 MySQL 中 返回 100 行 3 列或 1 行 100 列通常更快 更高效 可扩展吗 换句话说 当存储与一条记录相关的许多 key gt value 对时 是将每个 key gt value 对存储在单独的行中并以 record i
  • websocket握手问题

    我正在使用 python 实现一个简单的 websocket 服务器 我使用的握手来自 握手本身似乎有效 但是当我点击发送时 我收到一个 JavaScript 错误 未捕获的错误 INVALID STATE ERR DOM 异常 11 这是
  • 仅针对使用通道而定制的 Phoenix 应用程序如何在多台机器上扩展?使用HAProxy?如何向所有节点广播消息?

    我将节点应用程序纯粹用于带有 Redis PubSub 的 socket io 通道 目前我将其分布在 3 台机器上 并由其中一台机器上的 nginx 负载平衡提供支持 我想用 Phoenix 应用程序替换这个节点应用程序 而且我对 erl
  • java-websocket的WebSocketServer使用什么草案?

    我无法从WebSocketServer java源码 https github com TooTallNate Java WebSocket blob master src main java org java websocket serv
  • 在cypress中捕获websocket请求

    我试图捕获测试期间发生的所有请求 我的应用程序使用 WebSocket 并且使用拦截命令我无法捕获 wss 请求 有什么办法可以做到这一点吗 我认为拦截命令不能直接捕获网络套接字 一种方法是观察 ws 通信的结果 如下所示使用 Cypres
  • Flask-SocketIO 未使用 Gevent/Gevent-websocket

    我正在使用 Flask 和 Flask SocketIO 构建用于 websocket 通信的 Web 界面 数据 API 我想开始转向使用 Gevent Gevent websocket Gunicorn 以及最终使用 Nginx 进行负
  • 客户端如何获取session id? (网络套接字)

    有什么办法可以做到这一点吗 客户端 function connectWebSocket var socket new SockJS socket stompClient Stomp over socket stompClient conne
  • Spring Websocket升级请求处理

    我正在尝试使用Spring Websocket with Sockjs and STOMPjs 如上所述Spring Websocket 文档 https docs spring io spring docs 5 0 0 BUILD SNA
  • 如何终止 Websocket 连接?

    如何终止 Websocket 连接 我不是在谈论关闭两端的连接 而是在 中间 中断它 我需要测试重新连接时必须发生的一些应用程序逻辑 通过 SocketIO 处理 不 拔掉网络电缆不算数 因为我无法在单元测试中真正实现自动化 此外 我希望只
  • React Native Android 无法连接到 WebSocket

    尽管 Web 实现可以工作 但 android 模拟器以及我的设备无法连接到 WebSocket 在引发错误的地方收到以下事件错误代码 然后断开连接 connection error Event isTrusted false messag
  • 通过 PHP 连接到 socket.io(nodejs)

    我需要通过 php 连接到 websocket 发送数据并立即断开连接 无需等待套接字的响应 我用了大象io http elephant io 但更新库后不起作用 请告诉我如何通过 PHP 连接到 websocket 我也遇到了这个问题 学
  • WebSocket 无法与 DNS 配合使用

    我有一个网络应用程序 我正在使用 websockets 我在使用 ws myDomain com 作为 websocket 服务器的地址时遇到问题 这个问题很奇怪 因为我使用许多 PC 测试了连接 似乎这适用于大约 1 5 的 PC 当我将
  • Dispatcher-servlet 无法映射到 websocket 请求

    我正在开发一个以Spring为主要框架的Java web应用程序 特别使用Spring core Spring mvc Spring security Spring data Spring websocket 像这样在 Spring 上下文
  • 如何将中间件绑定到socket.io中的事件

    现在您可以将中间件绑定到io use middleware 但这仅在建立套接字连接时触发 有没有办法在将其传递给事件句柄之前拦截它 就像在expressjs中一样 换句话说 In 快递 js你可以做 app get middleware1

随机推荐

  • 重命名属性名称并更改多个对象的值

    在下面的对象中 我想更改属性名称 thumb to thumbnail 我还想更改的值title包括 span tags 这是我的对象 var data thumb images 01 png title My title thumb im
  • 带键的数组的 Twig for 循环

    我使用 Twig 并且有一个带有如下键的数组 array 1 alpha array 2 bravo array 3 charlie array 8 delta array 9 echo 我想拿到钥匙 1 2 3 8 9 和内容 alpha
  • 无效操作异常

    我创建了一个 WCF 服务 在 IIS 上托管时运行良好 现在 我采用了相同的服务 并在 WPF 中创建了一个主机应用程序 当尝试从该应用程序启动该服务时 出现以下异常 The HttpGetEnabled property of Serv
  • 与 KeyValuePair 键上的列表相交?

    如何根据键插入两个键值对列表 我努力了 List
  • jQuery UI Accordion - 如何完全删除样式?

    我喜欢 jQuery 手风琴 http jqueryui com demos accordion 的功能 但是我不想要这种风格 我想摆脱所有的样式 img 边框 颜色等 我没有看到这个选项 这是他们应该添加的内容 还是我误会了 您可以制作自
  • linux下c语言蓝牙编程

    我正在尝试在 linux ubuntu 中运行基本的 c 代码来搜索蓝牙设备 但我遇到了一些问题 通过使用命令sudo apt get install bluez 要安装所需的blueZ库 说明bluez已经是最新版本了 但出现错误 无法找
  • PHP 正则表达式查找自定义添加的 HTML 标签之间的文本

    我有以下场景 Got an HTML模板将用于的文件mailing 这是一个简化的示例 table tr td Heading 1 td td heading 2 td tr table
  • http.sys 实现

    我们都知道有一个名为 http sys 的二进制文件内核模式驱动程序在我们的 Windows 中 它为我们进行 HTTP 处理 这基本上就是我们所知道的一切 但今天我想 嘿 我们所有的网络东西 比如 TCP IP 之类的东西都在这里 在用户
  • 有充分的理由不使用 ORM 吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 查找并迭代android中的所有短信/彩信

    首先 也是最重要的 我发现了这个answer https stackoverflow com a 6446831 2415237特别有帮助 然而 这让我想知道如何找到这些信息 我似乎不知道如何迭代收件箱中的所有消息 我当前的解决方案使用Ur
  • Clearerr 是用来做什么的?

    我试图了解 stdio 功能何时clearerr 应该使用 例如 如果我fread or fwrite 在有效的FILE 并得到一个简短的计数ferror是真的 我能做什么 从我到目前为止所读到的来看 fread and fwrite 很健
  • 打字稿:找不到名称“代理”

    我需要声明一个 Proxy 类型的新变量 来自 ES6 规范 myProxy Proxy 但我收到下一个错误 找不到名称 代理 我该如何修复它 假设您将目标设置为es2015或包括库es2015使用lib选项 您可以创建一个Proxy 诀窍
  • 更新包并防止其恢复为原始状态

    我想升级包 ggplot2 library ggplot2 packageDescription ggplot2 Version gt 0 8 3 但当前版本是0 8 7 我尝试了 update packages 它似乎工作正常 但它仍然返
  • 如何获取临时文件名?

    我看过一些与我的问题相关的帖子 但没有一个能完全解决这个问题 我需要在标准临时目录中创建一个文件 完成写入后 将其移动到其他位置 这个想法是 该文件在下载时被视为临时文件 在下载完成后被视为永久文件 我正在尝试通过致电mkstemp htt
  • 将数据从一个纬度经度网格插入到另一个纬度经度网格上?

    我有两个位于经纬度网格上的数据数组 第一个 A 的形状为 89 180 第二个 B 的形状为 94 192 A 的纬度按降序排列 从 88 到 88 经度按升序从 0 到 358 B 的纬度按降序从 88 54199982 到 88 541
  • CNCopyCurrentNetworkInfo 不适用于 iOS 14

    我有一个使用 WIFI 连接到外部设备的应用程序 我曾经通过检查 WIFI SSID 来验证 iPhone 是否已连接到该设备 当 iOS 13 发布时 这个问题被阻止了 我通过请求位置权限来获取 SSID 来修复它 我现在尝试使用启用了位
  • 为什么sed命令包含at符号

    我不明白为什么以下 sed 命令包含 符号 sed s session s required s pam loginuid so session optional pam loginuid so g i etc pam d sshd 我查看
  • ReactJS 给出 inst.render 不是函数错误

    当我用 React 和 ReactDOM 展示一个非常基本的 Hello World 时 我遇到了一个奇怪的错误Uncaught TypeError inst render is not a function 在此查看JSBin https
  • 正则表达式“(?

    我花了大约三个小时试图理解如何
  • Websocket 可扩展性、广播问题

    如果您有一个包含许多用户 和服务器 的复杂要求 您的 websocket 基础设施 服务器 将如何扩展 尤其是广播 当然 广播不是任何 websocket 规范的一部分 但它甚至存在于基本的聊天示例中 又名 websocket 的 hell