服务器发送事件和Ajax VS Websockets和Ajax

问题描述 投票:1回答:2

我正在创建一个应用程序(Nuxtjs),并且难以确定一种将数据发送到API(expressjs)并检索实时更新的好方法。看来我可以使用两个协议[服务器发送事件(SSE)和Axios或Websocket(WS)]创建“双向”连接。

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

应用程序基于表单数据/点击的用户输入。然后,其他用户将收到该信息的通知/更新。在这一点上,用户可以做出响应并且链条继续(基本的聊天之类的信息流将很快交换,而某些消息则可能永远不会交换)。

[根据我的经验,用户流将更多地依赖于侦听更改,而不是实际更改数据-因此,我为什么考虑SSE。]

Websockets:

  1. 并非所有组件都需要WS来获取/发布信息,因此,无需花费额外的服务器费用来升级基本的http连接就没有意义。因此,将需要WS以外的其他方法(Axios/SSR)。 Example: Checking to see if a user name exists
  2. 安全防火墙可能会阻止WS正常运行
  3. [express-ws使API端的套接字变得容易
  4. 我相信一个用户可以有6个以上的并发连接(可能是优缺点)
  5. 服务器发送事件

    1. 似乎技术正在逐渐淡化为WS;>
    2. 听事件似乎和听WS的事件一样容易
  6. 无需升级连接,但必须在node-spdy API中使用expressjs-由于多路复用,这对于WS也可能是一个很好的实现
  7. 再设置一些后端代码即可设置http2并发出SSE s(同样还有丑陋的代码-因此将完成功能)
  8. 受限于HTTP限制(6个并发连接),这是一个问题,因为用户可以轻松地将其最大化(即,打开多个聊天窗口)
  9. TLDR

    应用程序偶尔会过分定位(可以由Axios处理),因此其定位更“饲料”。但是,用户将收听多个“提要”,并且HTTP限制将成为问题。我不知道解决方案是什么,因为SSE似乎是更好的选择,因为我不需要不断地握手。如果这种握手确实是无关紧要的(从我所读的内容来看并非如此),那么WS可能是更好的选择。不幸的是,关于这两者的信息太多了。

想法?

我正在创建一个应用程序(Nuxtjs),并且难以确定一种将数据发送到API(expressjs)并检索实时更新的好方法。看来我可以创建“ bi-di” ...

SSE,Web套接字和普通HTTP请求(通过AJAX或Fetch API)都是用于不同作业的不同工具。

SSE
  • 单向,从服务器到客户端。

  • 仅基于文本的数据。 (其他任何内容都必须序列化,即JSON。)
  • 简单的API,具有广泛的兼容性,可以自动重新连接,并具有内置的功能来追赶可能错过的事件。
  • Web套接字
    • 双向。
    • 文本或二进制数据。

  • 需要您对发送的数据实现自己的含义。
  • 标准HTTP请求
    • 客户端到服务器或服务器到客户端,但一次仅一个方向。
    • 文本或二进制数据。

  • 需要额外的精力来实时传输服务器到客户端的响应。
  • 从客户端到服务器的流传输要求在请求时知道全部数据。 (例如,您不能创建事件流。)
  • 如何决定:
    • 您是否将类似事件的数据从服务器传输到客户端?使用SSE。它是为此目的而专门设计的,是一种简单的死法。
    • 您是否仅在一个方向上发送数据,而无需自发通知客户?使用普通的HTTP请求。

  • 您是否需要通过长期建立的连接发送双向数据?使用Web套接字。
  • 根据您的描述,听起来SSE或Web套接字都适合您的用例。我可能会倾向于SSE,同时使用常规HTTP请求从客户端发送随机API调用。

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

    请记住,您可以简单地使用HTTP保持活动配置服务器,这很重要。

    我本人避免将websockets用作clientserver之间的双向通讯。

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

    我的数据流类似

    1. 用户使用axiosSSE或其他将数据发布到服务器
    2. 后端服务器执行其必需的操作并通知套接字已发生事件
    3. 然后套接字服务器通知他必须通知谁
    4. 我使用套接字将数据从客户端发送到服务器的问题是身份验证问题。从技术上讲,您不能通过套接字传递客户端JavaScript无法使用的anything,这意味着要验证操作,您将必须通过websocket发送敏感信息。这是一个有多个原因的问题-如果可以使用客户端js访问敏感数据,则可以在此处进行大量攻击。也有人可以收听ws和客户端之间的通信。这就是为什么我使用API​​调用(axios等)并将敏感数据存储到仅HTTP cookie中的原因。

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

    您还希望API服务器保持无状态,这意味着API中没有套接字。我仅将单独的服务器用于websocket连接,而我的API服务器和websocket服务器使用Redis进行通信。发布/订阅是用于内部服务器通信和状态管理的非常整洁的功能。

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

    我希望这对您有意义。该堆栈对我确实非常有用。

    express websocket server-sent-events ws
    2个回答
    0
    投票

    SSE,Web套接字和普通HTTP请求(通过AJAX或Fetch API)都是用于不同作业的不同工具。


    -2
    投票

    我本人避免将websockets用作clientserver之间的双向通讯。

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

    © www.soinside.com 2019 - 2024. All rights reserved.