能否在WebRTC数据通道上实现WebService,这是可行且合理的吗?

5

有没有可能在WebRTC数据通道上实现WebService?

想法是:

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

好处?:

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

缺点:

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

想法:

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

[编辑]

我找到了这个repo:https://github.com/jsmouret/grpc-over-webrtc 太棒了!

[EDIT2]

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

[EDIT3]

在搜索Fetch PROS的HTTP/2后,我发现使用ReadableStreams进行Fetch上传流,但我不知道在WebRTC DataChannel或HTTP/2 Stream上运行GRPC(bidi)会有多大的差异

Fetch上传流让Web更快,减少了网络请求涉及的复杂操作。

非常酷的视频介绍了这个功能:https://www.youtube.com/watch?v=G9PpImUEeUA


这是一个很好的问题。你有没有发现WebSocket和WebRTC数据通道之间的开销/性能差异方面的任何发现?我们经常听到服务器可以打开数十万个WebSocket连接的情况,但在WebRTC PeerConnection的服务器端还没有听说过类似的情况。 - user482594
3个回答

8

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

这个想法是完全可行的。请查看Pion WebRTC的data-channels示例。只需要一个请求/响应即可建立连接。

性能

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

使用数据通道可以测量反压情况。您可以了解已传递的数据量和排队的数据量。如果队列正在变满,那么您就知道正在发送过多的数据。浏览器中的其他API无法提供此功能。虽然有一些未来的API(WebTransport),但它们目前还不可用。

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

我无法给出运行DTLS+SCTP与TLS+WebSocket服务器的CPU/内存成本的具体数字。这取决于您拥有的硬件/网络,工作负载等等...
多路复用
您可以在单个WebRTC连接(PeerConnection)上服务多个DataChannel流。您还可以通过单个端口服务多个PeerConnections。
网络传输
WebRTC可以在UDP或TCP上运行。
负载均衡
这更难(但不是无法解决),将DTLS和SCTP会话移动到服务器之间并不容易,现有库中没有这样的功能。pion/dtls具有导出/恢复会话的支持。我不知道其他库是否支持。
TLS/Websocket更容易进行负载平衡。
端对端加密
WebRTC具有强制加密。这对于可能错误地配置为非TLS的HTTP 1.1很好。
如果您想通过服务器路由消息(而不是让服务器看到它),我认为您使用的协议并不重要。
拓扑结构
WebRTC可以运行在许多不同的拓扑结构中。您可以进行P2P或客户端/服务器,并且可以在两者之间进行许多操作。根据您所构建的内容,您可以构建混合网状结构。您可以创建连接图,并根据需要部署服务器。这种灵活性使您能够做一些有趣的事情。

Hybrid mesh topology


希望我已经解决了您所有的问题!如果需要进一步讨论,可以在评论中提出/我会继续编辑这个问题。

1
我认为如果使用WebRTC,考虑到使用情况,同时考虑点对点辅助解决方案的潜力也是很重要的。 - lnogueir
1
太好了!我会添加一个“拓扑结构”部分,使用点对点协议有一些有趣的事情可以做。 - Sean DuBois
谢谢你的回答!我不知道WebTransport API的存在,我计划在2-3年内更新我的旧网络服务,所以现在的问题是等待WebTransport API在所有主要的浏览器中实现,或者开始使用WebRTC DataChannels。我不喜欢正常负载均衡(例如:kubernetes ingress)的一件事情是TLS终止发生在负载均衡器中。我不知道WebRTC-> TURN-> SERVER背后的正常网络与HTTP-> LB-> SERVER相比是否有更多的延迟。 - Leonel Franchelli
我知道DataChannels可以配置为有序https://developer.mozilla.org/en-US/docs/Web/API/RTCDataChannel/ordered,所以这很好,我不知道要分析的太多东西。比如用户如果在允许从某些端口或连接中间代理的企业网络中,会发生什么。 - Leonel Franchelli

2
几年前,我也对这个HTTP-over-WebRTC DataChannel的想法感到好奇。当时面临的问题是如何从Web应用程序安全地连接到位于防火墙后面的物联网设备(树莓派)。

由于没有现成的解决方案,我最终建立了一个原型。它完成了工作,并自2019年以来一直在实际部署中。

请参阅此技术博客文章,详细介绍了设计和实现:https://webrtchacks.com/private-home-surveillance-with-the-webrtc-datachannel/

高级架构:High level architecture of peerfetch

简化的顺序图:peerfetch sequence diagram

最近开始将代码提取到一个独立的存储库中。

https://github.com/ambianic/peerfetch


谢谢分享!我不知道等待WebTransportAPI变得稳定是否更适合我的情况,我认为它们与DataChannels共享相同的属性,https://www.w3.org/2020/12/webtransport-wg-charter.html,https://web.dev/webtransport/。 - Leonel Franchelli

1
如果您的主要用例是交换小内容,可以看一下CoAP RFC 7252。对等方可以轻松实现客户端和服务器角色,尽管请求和响应的交换消息共享相同的格式。
对于DTLS 1.2的一些高级用法,DTLS Connection ID可以为您带来一些魔力。
如果您不坚持使用JavaScript,Java也是一个选择,您可以查看开源项目Eclipse/Californium。这是一个CoAP/DTLS实现,带有DTLS连接ID和一些准备好的高级示例,例如内置CID负载平衡支持DTLS优雅重启

我从这个问题中收集到的信息量非常惊人,谢谢!使用情况是加速当前的 Web 服务,它是将 Json 请求分派到 Json 用户定义函数的前端,通过双向连接,我可以在连接池中分派多个调用到数据库上的相同流中,这将比典型的 HTTP 请求更有效率。每个函数调用的 API 都必须初始化用户凭据、配置等。此外,我还可以对响应进行签名,以便如果需要,客户端可以共享静态数据。 - Leonel Franchelli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接