1

我正在创建一个应用程序( ),但在确定将数据发送到 API( )和检索实时更新Nuxtjs的好方法时遇到了麻烦。expressjs看来我可以使用两个协议 [Server Sent Events( SSE) 和Axios/或 Websocket( WS)] 创建“bi-di”连接。

这两种技术都适用于大多数浏览器,所以我认为不需要添加额外的库,例如socket.io- 对于那些没有当前浏览器的人(太糟糕了)。

该应用程序基于表单数据/点击的用户输入。然后用该信息通知/更新其他用户。在这一点上,用户可以响应并且链继续(基本的聊天,如流程,一些信息将被快速交换,而有些可能不会或永远不会)。

以我的经验,用户流将更多地依赖于侦听更改而不是实际更改数据 - 因此我正在考虑SSE不幸的是,这两种协议都有其缺陷。

网络套接字:

  1. 并非所有组件都需要WS获取/发布信息,因此以额外的服务器费用升级基本 http 连接是没有意义的。因此需要另一种方法WSAxios/SSR)。Example: Checking to see if a user name exists
  2. 安全防火墙可能会阻止WS正常运行
  3. express-ws使 API 端的套接字变得简单
  4. 我相信一个用户可以拥有超过 6 个并发连接(可能是赞成和反对)

服务器发送事件

  1. 似乎技术正在衰落,有利于WS
  2. 监听事件似乎和监听事件一样简单WS
  3. 无需升级连接,但必须node-spdy在API 中使用 -由于多路复用expressjs,这也可能是一个很好的实现WS
  4. 更多的后端代码来设置http2和发出SSEs(丑陋的代码也是如此 - 所以将制作函数)
  5. 仅限于 HTTP 限制(6 个并发连接),这是一个问题,因为用户可以轻松地将其最大化(即打开多个聊天窗口)

TLDR

该应用程序将更加以“供稿”为导向,偶尔发布(可由 处理Axios)。但是,用户将收听多个“提要”,HTTP 限制将成为问题。我不知道解决方案是什么,因为SSE似乎是更好的选择,因为我不需要不断握手。如果这次握手真的无关紧要(从我读过的所有内容来看并非如此),那么WS可能是一个更好的选择。不幸的是,关于这两者的信息有太多相互矛盾的信息。

想法?

4

2 回答 2

0

SSE、Web Sockets 和普通 HTTP 请求(通过 AJAX 或 Fetch API)都是针对不同工作的不同工具。

上证所

  • 单向,从服务器到客户端。
  • 仅基于文本的数据。(其他任何东西都必须序列化,即 JSON。)
  • 简单的 API,广泛兼容,自动重新连接,内置了追赶可能错过的事件的规定。

网络套接字

  • 双向。
  • 文本或二进制数据。
  • 要求您对发送的数据实现自己的含义。

标准 HTTP 请求

  • 客户端到服务器或服务器到客户端,但一次只有一个方向。
  • 文本或二进制数据。
  • 需要额外的努力来实时流式传输服务器到客户端的响应。
  • 从客户端到服务器的流式传输要求在请求时知道整个数据。(例如,您不能执行事件流。)

如何决定:

  • 您是否将类似事件的数据从服务器流式传输到客户端?使用 SSE。它是为此目的而设计的,并且是一种非常简单的方法。
  • 您是否只向一个方向发送数据,并且您不需要自发通知客户某事?使用正常的 HTTP 请求。
  • 您是否需要通过长期建立的连接发送双向数据?使用网络套接字。

根据您的描述,听起来 SSE 或 Web Sockets 都适合您的用例。我可能会倾向于 SSE,同时使用正常的 HTTP 请求从客户端发送随机 API 调用。

我不知道解决方案是什么,因为 SSE 似乎是更好的选择,因为我不需要不断地握手。如果这种握手真的无关紧要(从我读过的所有内容来看并非如此),那么 WS 可能是一个更好的选择。

请记住,您可以简单地使用 HTTP keep-alive 配置您的服务器,这使得这一点没有实际意义。

于 2019-11-07T01:39:47.053 回答
-2

我个人避免使用和websockets之间的双向通信。clientserver

我尝试使用套接字来broadcast data from server to users or a single user(socket)获取实时更新,但是对于从客户端到服务器的发布请求,我倾向于使用 axios 或类似的东西,因为我不想传递敏感数据(如访问密钥等)从clientserver

我的数据流类似于

  1. axios用户使用或SSE其他方式将数据发布到服务器
  2. 后端服务器完成它必须做的事情并通知套接字发生了一个事件
  3. 套接字服务器然后通知他必须

我使用套接字将数据从客户端发送到服务器的问题是身份验证问题。从技术上讲,您不能通过套接字传递对客户端 javascript 不可用的任何内容,这意味着要对操作进行身份验证,您必须通过 websocket 发送敏感信息。这是一个有多种原因的问题 - 如果您的敏感数据可以使用客户端 js 访问,则可以在此处进行大量攻击。也有人可以收听ws和客户端之间的通信。这就是我使用 API 调用(axios 等)并将敏感数据存储到 http-only cookie 的原因。

因此,一旦服务器想要通知用户发生了某些事情,您可以通过告诉 websocket 服务器将数据发送给用户来轻松地做到这一点。

您还希望让您的 API 服务器保持无状态,这意味着您的 API 中没有套接字。我只为 websocket 连接使用单独的服务器,我的 API 服务器和 websocket 服务器使用 redis 进行通信。Pub/sub 是用于内部服务器通信和状态管理的一个非常简洁的功能。

并回答有关多个连接的问题 - 您可以在 websocket 服务器和客户端之间使用单个连接,并使用通道广播数据。因此,一个频道将用于通知提要,另一个频道可能用于故事提要等。

我希望这对你有意义。这个堆栈对我来说非常有用。

于 2019-11-07T01:10:36.920 回答