在 TCP 连接 V/s 网络套接字之间做出决定

Deciding between TCP connection V/s web socket

我们正在开发一个浏览器扩展,它将登录用户访问的所有 URL 发送到后端 API 以进行持久化。

现在发送到后端的请求数量 API 会很大,因此我们很困惑是通过 websocket 创建持久连接还是通过 TCP 连接,即使用 HTTP rest API来电。

到后端 API 的数据 post 不需要是实时的,因为我们无论如何都会在我们的模型中使用这些数据,这并不要求它们是实时的。

由于以下原因,我们倾向于 HTTP rest API 调用

但同时缺点会是

如果我能收到社区的来信,我会非常高兴,如果我们可以在休息 API 通话选项中遇到任何陷阱。

抛开我的不适(隐私,有人吗?)...

假设您的扩展程序整理了信息,您可能会考虑在每次浏览器启动/退出时“推送”到服务器,然后每隔一小时左右再次“推送”一次(这些天用户几乎不使用他们的浏览器)...这会让 REST 更加合乎逻辑。

如果您不在客户端整理信息,您可能更喜欢实时推送数据的 WebSocket 实现。

但是,无论您做出什么决定,您还希望将 API 与传输层分离

这意味着(忽略身份验证范例)WebSockets 和 REST 实现看起来基本相同,并且被路由到包含实际业务逻辑的相同函数......您也可以从脚本或从终点站。就 API 实现而言,网络层细节应该无关紧要。

最后一点:我永远不会故意安装一个收集这么多关于我的数据的扩展程序。特别是因为 URL 通常包含私人信息(用于 REST API 路由)。如果您想参与创建这样的产品,请重新考虑...如果我们不构建使其成为可能的工具,他们就不会侵犯我们的隐私

所以首先TCP是传输层。不可能使用原始 TCP,你必须在它之上创建一些协议。您必须赋予数据流以意义。

REST 或 HTTP 甚至 WebSockets 永远不会像在原始 TCP(甚至 UDP)之上定制设计的协议那样高效。然而,收益可能并不像人们想象的那么惊人。我实际上已经完成了一次这样的转换,我们只经历了百分之几的性能提升。而且它既不容易正确执行也不容易维护。当然是YMMV.

这是为什么?好吧,原因是 HTTP 已经高度优化了。首先你有“keep alive”header 保持连接打开(如果它被使用)。因此默认的 HTTP 机制在使用时已经保持连接。其次,HTTP 默认处理 body 压缩,使用 HTTP/2 它也处理 headers 压缩。使用 HTTP/3,您甚至可以更有效地使用 TLS,并在网络不稳定(例如移动)的情况下提供更好的支持。

另一件事是,由于您不需要实时数据,因此您可以进行缓冲。因此,您不会在数据可用时发送数据,而是收集几秒钟、几分钟甚至几小时的数据,然后一次性发送所有数据。使用这种方法,HTTP 和自定义协议之间的差异将更加不明显。

总而言之:我建议您从最简单的解决方案开始,在您的情况下,它似乎是 REST。设计您的代码,以便尽可能简单地转换到其他协议。如果需要,稍后优化。总是测量。

顺便说一句,您的扩展存在很多有效的隐私和安全问题。例如,我很惊讶你根本没有提到 TLS。这很重要,不仅因为安全性,还因为性能:建立 TLS 连接不是免费的(尽管一旦建立,加密对性能影响不大)。