通过 WebRTC 数据通道实现 WebService 是否可能且合理?

Leo*_*lli 5 javascript networking web-services network-programming webrtc

是否可以通过 WebRTC 数据通道实现 WebService?

这个想法是:

  • 客户端向服务器发出一个 https 请求以进行信令和会话建立
  • 客户端和服务器开始通过WebRTC DataChannel进行双向通信

好处?:

  • 表现 ?
  • 请求通过一个连接,并且该标准允许通过同一连接(端口)使用多个数据通道
  • 灵活的组网拓扑
  • UDP协议
  • 端到端加密
  • 服务器可以通过同一连接发送事件
  • 负载平衡可以从服务器池客户端实现,无需负载平衡器,或者各种不同的解决方案。
  • 目前正在讨论向 Workers/Service Workers/ 等添加 DataChannels https://github.com/w3c/webrtc-extensions/issues/64

缺点:

  • 用于实现请求分段和缓冲区限制控制的应用程序特定代码
  • [编辑 3] 我不知道它与 HTTP/2 Stream 在性能和 cpu/内存使用方面有多大差异

想法:

  • 客户端可以是用于同步的数据的读取副本,也可以是公共IPFS网络中适合orbit-db https://github.com/orbitdb/orbit-db的任何其他应用程序,使用orbit-db的好处是只允许所有者进行写入,然后服务器还可以用他的密钥对所有数据进行签名,以便客户端可以验证并信任它来自服务器,这可以卸载主服务器进行读取,这只是一个想法。

[编辑]

我发现这个仓库: https: //github.com/jsmouret/grpc-over-webrtc 太棒了!

[编辑2]

经过一番调查后,改变了 Orbit-db 的想法并删除了集群 IPFS

[编辑3]

在搜索 Fetch PROS for HTTP/2 后,我发现使用 ReadableStreams 获取上传流,我不知道通过 WebRTC DataChannel 或 HTTP/2 Stream 运行 GRPC (bidi) 有多大区别

https://www.chromestatus.com/feature/5274139738767360#:~:text=Fetch%20upload%20streaming%20lets%20web,things%20involved%20with%20network%20requests)。

非常酷的视频解释了该功能:https://www.youtube.com/watch?v =G9PpImUEeUA

Sea*_*ois 8

这里有很多不同的观点,我们将尽力解决所有问题。

这个想法100%可行。查看 Pion WebRTC 的数据通道示例。建立连接只需要单个请求/响应。

表现

如果您正在进行延迟敏感的工作,数据通道更适合。

通过数据通道,您可以测量背压。您可以知道已传送了多少数据,以及已排队了多少数据。如果队列已满,您就知道发送了太多数据。浏览器中的其他 API 不会提供此功能。有一些未来的 API (WebTransport),但目前还不可用。

数据通道允许无序/不可靠的传送。使用 TCP,您发送的所有内容都将按顺序传送,此问题称为队头阻塞。这意味着如果丢失一个数据包,所有后续数据包都必须延迟。一个例子是,如果您发送0 1 2 3,如果数据包 1 尚未到达,则数据包 2 和数据包 3 尚无法处理。数据通道可以配置为在数据包到达时立即向您提供数据包。

我无法提供有关运行 DTLS+SCTP 与 TLS+WebSocket 服务器的 CPU/内存成本的具体数字。这取决于您拥有的硬件/网络、工作负载等......

多路复用

您可以通过单个 WebRTC 连接 (PeerConnection) 提供多个 DataChannel 流。您还可以通过单个端口为多个 PeerConnection 提供服务。

网络传输

WebRTC 可以通过 UDP 或 TCP 运行

负载均衡

这比较困难(但并不棘手),使用现有库在服务器之间移动 DTLS 和 SCTP 会话并不容易。使用pion/dtls,它支持导出/恢复会话。但是我不知道其他库的支持。

TLS/Websocket 更容易负载均衡。

端到端加密

WebRTC 具有强制加密功能。这对于 HTTP 1.1 来说很好,如果配置不正确,HTTP 1.1 可能会意外回退到非 TLS。

如果您想通过服务器路由消息(并且不让服务器看到它),我认为您使用什么协议并不重要。

拓扑结构

WebRTC 可以在许多不同的拓扑中运行。您可以做 P2P 或客户端/服务器,以及介于两者之间的许多事情。根据您正在构建的内容,您可以构建混合网格。您可以创建连接图,并根据需要部署服务器。这种灵活性可以让您做一些有趣的事情。

混合网状拓扑


希望能解决您的所有问题!很高兴在评论中进一步讨论/将继续编辑问题。