在 TCP 连接 V/s 网络套接字之间做出决定
Deciding between TCP connection V/s web socket
我们正在开发一个浏览器扩展,它将登录用户访问的所有 URL 发送到后端 API 以进行持久化。
现在发送到后端的请求数量 API 会很大,因此我们很困惑是通过 websocket 创建持久连接还是通过 TCP 连接,即使用 HTTP rest API来电。
到后端 API 的数据 post 不需要是实时的,因为我们无论如何都会在我们的模型中使用这些数据,这并不要求它们是实时的。
由于以下原因,我们倾向于 HTTP rest API 调用
- 易于实施
- 易于缩放(使用自动缩放技术)
- 团队中的每个人都已经对休息感到满意 APIs
但同时缺点会是
- 在我们将有大量 post 请求发送到服务器的规模上,不确定是否会对其进行优化
- 感觉 websockets 可以为我们提供优化的基础设施:(
如果我能收到社区的来信,我会非常高兴,如果我们可以在休息 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 连接不是免费的(尽管一旦建立,加密对性能影响不大)。
我们正在开发一个浏览器扩展,它将登录用户访问的所有 URL 发送到后端 API 以进行持久化。
现在发送到后端的请求数量 API 会很大,因此我们很困惑是通过 websocket 创建持久连接还是通过 TCP 连接,即使用 HTTP rest API来电。
到后端 API 的数据 post 不需要是实时的,因为我们无论如何都会在我们的模型中使用这些数据,这并不要求它们是实时的。
由于以下原因,我们倾向于 HTTP rest API 调用
- 易于实施
- 易于缩放(使用自动缩放技术)
- 团队中的每个人都已经对休息感到满意 APIs
但同时缺点会是
- 在我们将有大量 post 请求发送到服务器的规模上,不确定是否会对其进行优化
- 感觉 websockets 可以为我们提供优化的基础设施:(
如果我能收到社区的来信,我会非常高兴,如果我们可以在休息 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 连接不是免费的(尽管一旦建立,加密对性能影响不大)。