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

标签 javascript web-services networking network-programming webrtc

是否可以通过 WebRTC 数据 channel 实现 WebService?
这个想法是:

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

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

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

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

  • [编辑]
    我找到了这个仓库:https://github.com/jsmouret/grpc-over-webrtc
    惊人!
    [编辑2]
    在调查了一下之后改变了 Orbit-db 的想法并删除了集群 IPFS
    [编辑3]
    在为 HTTP/2 搜索 Fetch PROS 后,我发现使用 ReadableStreams 获取上传流,我不知道在 WebRTC 数据 channel 或 HTTP/2 流上运行 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

    最佳答案

    这里有很多不同的观点,将尝试解决所有问题。
    这个想法是100%可行的。查看 Pion WebRTC 的 data-channels例子。只需一个请求/响应即可建立连接。
    表现
    如果您正在做延迟敏感的工作,数据 channel 更合适。
    使用数据 channel ,您可以测量背压。您可以知道有多少数据已交付,有多少已排队。如果队列已满,您就知道您发送的数据过多。浏览器中的其他 API 不会给你这个。有一些 future 的 API (WebTransport),但它们尚不可用。
    数据 channel 允许无序/不可靠的交付。使用 TCP,您发送的所有内容都将按顺序交付,此问题称为线头阻塞。这意味着如果您丢失了一个数据包,则所有后续数据包都必须延迟。例如,如果您发送 0 1 2 3 ,如果数据包 1 尚未到达,则 2 和 3 尚无法处理。数据 channel 可以配置为在数据包到达时立即为您提供数据包。
    我无法为您提供运行 DTLS+SCTP 与 TLS+WebSocket 服务器的 CPU/内存成本的具体数字。这取决于您拥有的硬件/网络、工作负载等...
    多路复用
    您可以通过单个 WebRTC 连接 (PeerConnection) 提供多个 DataChannel 流。您还可以通过单个端口提供多个 PeerConnections。
    网络传输
    WebRTC 可以通过 UDP 或 TCP 运行
    负载均衡
    使用现有的库,在服务器之间移动 DTLS 和 SCTP session 更难(但并非难以处理)。与 pion/dtls它支持导出/恢复 session 。但是,我不知道其他库的支持。
    TLS/Websocket 更容易负载均衡。
    端到端加密
    WebRTC 具有强制加密功能。这对 HTTP 1.1 来说很好,如果配置不正确,它可能会意外地退回到非 TLS。
    如果您想通过服务器路由消息(而不是让服务器看到它),我认为您使用的协议(protocol)并不重要。
    拓扑
    WebRTC 可以在许多不同的拓扑中运行。您可以做 P2P 或客户端/服务器,以及介于两者之间的许多事情。根据您正在构建的内容,您可以构建 hybrid mesh .您可以创建连接图,并根据需要部署服务器。这种灵 active 让您可以做一些有趣的事情。
    Hybrid mesh topology

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

    关于javascript - 通过 WebRTC 数据通道实现 WebService 是否可行且合理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66568033/

    相关文章:

    javascript - 如何创建 javascript 函数对象并获取其内部属性

    javascript - Highcharts 图例展开至全宽

    web-services - 如何通过向 Siebel Inbound WebService 请求获取 WSDL?

    web-services - Spring-WS:将 SOAP 错误转换为特定异常

    windows - 在 Windows XP、SP3 上使用 RawCap 嗅探本地主机

    c++ - QNetworkConfigurationManager::allConfigurations() 没有列出 WLAN

    javascript - 我怎样才能把几个 Bluebird promise 包装在一个 promise 中?

    javascript - 在给定 JavaScript 中的时区字符串的情况下计算 UTC 偏移量

    python - 用于测试soap客户端的公共(public)免费网络服务

    Linux:桥上的端口隔离以正确使用 OLSR