我已经使用WebSockets一段时间了,我选择使用Node服务器和WebSockets为大学的最后一年项目创建一个敏捷项目管理工具.我发现使用WebSockets提供的应用程序每秒可处理的请求数量增加了624%.
然而,自从启动项目以来,我已经阅读了安全漏洞,并且一些浏览器默认选择禁用WebSockets.
这引出了我的问题:
当WebSockets似乎在降低延迟和资源开销方面做得如此出色时,为什么要使用AJAX?AJAX比WebSockets做得更好吗?
我试过阅读一些文章,但在这个主题上并不那么清楚.
有人想在下面解释我的观点:
任何形式的帮助表示赞赏.
通过HTTP 2.0,Websocket与AJAX之间的真实性能差异是什么?
特别是,我正在开发的项目需要双向实时更新,因此,尽管非标准,如果只在域内进行请求,则通过Websocket而不是AJAX执行REST可能更有效.
但是,我不确定当前有关性能差异的可用信息是否适用于HTTP 2.0.
我将在几周内开始开发多人纸牌游戏,在那之前,我正在研究可用的最佳技术。我将在服务器端使用 PHP+MySQL,在客户端使用 JS/HTML5。游戏也将通过手机浏览器播放。
我的游戏玩法涉及 4 个或更多用户在一张桌子上玩游戏,每个人最多有 30 秒的时间来采取行动。将有多张桌子可用,并且一个用户可以同时玩 1 张以上的桌子。
根据我的研究,每次其他玩家进行操作时,通过让服务器通过 SSE 推送数据来同步客户端与服务器似乎很容易。然后当当前玩家采取行动时,请求数据将通过 XMLHttpRequest 从客户端发送到服务器,然后通过 SSE 同步到其他玩家。
现在从我读到的内容来看,这有一个很大的缺点,因为对于每个侦听 SSE 进程的播放器,连接在服务器上保持打开状态,消耗大量内存。我将构建的应用程序旨在随着时间的推移在具有现代硬件(8 核 CPU,64GB RAM)的专用服务器上支持 10000 多名玩家。有些人可能会说 PHP 不适合这个,但这里的争论是如何使用 PHP 来完成这项工作。
SSE 实现的替代方案是使用 Websockets(我目前正在检查 Ratchet 并设法从文档中设置了聊天服务器),但总的来说,我有一些困境阻止我做出决定:
Websockets:建立握手时,服务器上的连接也保持打开状态,与 SSE 中相同,但我猜这是一种不同类型的连接,消耗较少的内存。那正确吗?所以 websockets 会更有效率。对 SSE 和 WebSockets 的内存使用情况有任何估计吗?我在某处读到通过 SSE 的每个连接将使用 APACHE 和 PHP 消耗大约 20mb。对于 10000 个用户(太多),这将是 200GB。我希望我错了。我不知道套接字连接会消耗多少内存。我的意思是一个空闲的。
SSE 会消耗更多的电池(在手机上)并且会比套接字连接产生更多的网络流量吗?
SSE:如果用户将在两张桌子上玩,我是否需要打开两个 SSE 进程(每个桌子一个),或者如果我请求 table1 或 table2 的数据,我如何告诉 SSE 进程?或者我被迫同时接收所有表的数据?接收用户现在处于活动状态的所有表的数据不会有问题,但我很好奇是否有自定义方法。
与互联网连接不稳定的人打交道如何?websockets 是否支持自动重连?或者这需要从客户端手动完成?
有人可以简要介绍这些看似相似的技术之间的区别吗?
我知道所有这三个都是" 推动 "来自服务器的响应,而不是客户端的请求.
初看起来,似乎都是一样的.我需要更清楚地了解差异.
我要求我的Web应用程序中的客户端到服务器消息的延迟非常低.
我在stackoverflow上看过几篇帖子说最好使用websockets而不是HTTP来满足这个要求,但是很久以前.
今天,在2018年,随着HTTP/2的进展,是否仍然值得使用websockets这个用例?
新的 HTTP/2 协议带有一些很有前途的特性。他们中的一些:
“流”是在 HTTP/2 连接内在客户端和服务器之间交换的独立的双向帧序列。
HTTP/2 背后的动机在这里解释了HTTP/2 FAQ:
HTTP/1.1 已经为 Web 服务了超过 15 年,但它的年龄开始显现出来。
和
工作组的目标是 HTTP/1.x 的典型用途可以使用 HTTP/2 并看到一些好处。
所以 HTTP/2 很好,并开始取代 HTTP/1.x。不幸的是,HTTP/2 不支持 WebSockets。在这个问题中,HTTP/2 是否会使 websockets 过时?很明显 HTTP/2 Server Push 不是替代方案,Server-Sent Events也不是。
现在的问题是:如果我们想要通过 HTTP/2 实现 WebSockts 功能,我们应该使用什么?
除了不向 Javascript 公开 HTTP/2 帧的浏览器之外,在什么情况下 Websocket 会比双向流 gRPC(基于 HTTP/2)之类的东西更好地实现实时双向消息流?另外,HTTP 2.0 是全双工(和双向)是否意味着实际上支持服务器推送?那么,对 SSE 之类的东西有什么需求呢?这已经过时了,对吧?
具有服务器推送支持的Jetty的HTTP/2客户端已在Jetty 9.3 RC(Link)中实现.但是,我没有找到任何与此相关的文档或示例代码.可以任何人提供示例代码,例如从该站点接收推送的资源:https://nghttp2.org(已启用http2服务器推送的公共服务器)
---更新1 --- 我试图测试这个文件,正如sbordet所说的那样.但是,在执行此行之后
mvn compile exec:java
Run Code Online (Sandbox Code Playgroud)
我遇到了这个错误
[INFO] --- exec-maven-plugin:1.4.0:java (default-cli) @ http2client ---
2015-05-05 01:52:47.808:INFO::com.example.Client.main(): Logging initialized @3096ms
[WARNING]
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:293)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.util.concurrent.TimeoutException
at org.eclipse.jetty.util.FuturePromise.get(FuturePromise.java:130)
at com.example.Client.main(Client.java:55)
... 6 more
Run Code Online (Sandbox Code Playgroud)
这是我的 pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>http2client</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>http2client</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>org.eclipse.jetty.http2</groupId>
<artifactId>http2-client</artifactId>
<version>9.3.0.M2</version>
</dependency>
<dependency>
<groupId>org.mortbay.jetty.alpn</groupId>
<artifactId>alpn-boot</artifactId> …Run Code Online (Sandbox Code Playgroud) http/2服务器推送的大多数用例是抢先将资产文件(例如javascript和css文件)推送到浏览器.我想知道可以使用http/2服务器推送将动态有效负载(如JSON文档)发送到客户端应用程序吗?从http2规范,它没有提到任何关于这一点.任何人都可以详细说明这个吗?为什么或者为什么不?
一些StackOverflow 帖子和这篇内容丰富的博客文章(但可能已经过时)表明,当前在浏览器中实现的 HTTP/2 尚不支持推送流,并且在需要此功能时仍应使用 WebSockets 或 SSE。
我很好奇 Google Firestore(它通过 HTTP 实现 gRPC)是如何实现这一目标的。据我所知,在打开使用 Firestore 的网站后,没有使用以下内容:
问题
websocket http2 grpc firebase-realtime-database google-cloud-firestore
websocket ×9
http2 ×8
server-push ×3
ajax ×2
grpc ×2
http ×2
java ×1
jetty ×1
low-latency ×1
nghttp2 ×1
node.js ×1
performance ×1
php ×1
ratchet ×1