泽西岛中的异步响应和服务器发送事件有什么区别?

时间:2016-11-29 08:25:49

标签: rest jax-rs jersey-2.0

泽西岛的Async Response和Server-Sent Events之间的区别是什么?何时使用它们?

2 个答案:

答案 0 :(得分:1)

两者都用于不同的用法,一个允许等待慢资源(长轮询),另一个允许在同一TCP连接上发送数据流。

以下是更详细的信息:

  • AsyncResponse是在JAX-RS 2中引入的,用于执行长轮询请求。

    1. 客户端开放连接
    2. 客户端发送请求有效负载
    3. 服务器接收有效负载,暂停/暂停连接并查找资源
    4. 然后
      1. 如果已达到超时,则服务器可以结束连接
      2. 资源准备就绪,服务器恢复连接并发送资源有效负载。
    5. 连接已关闭
    6. 由于这是JAX-RS规范的一部分,因此您可以将其与默认的球衣依赖关系一起使用。请注意,在没有数据传输的过长连接上,防火墙等网络设备可以关闭TCP连接。

    7. Server-Sent Eventsspecification,允许服务器在同一TCP连接上发送消息。

      1. 客户使用javascript EventSource获取资源
      2. 然后,服务器可以在某个时间点发送有效负载,即消息。
      3. 然后是另一个
      4. 等等
      5. 客户端或服务器可以随时以编程方式关闭连接。
      6. SSE不是JAX-RS的一部分,因此您需要在类路径中安装Jersey SSE模块(此外,在早期版本的Jersey 2中,您必须以编程方式启用SseFeature)。

        需要考虑的其他事项:

        • SSE不允许传递自定义标头,因此没有授权标头。可以使用URL查询字符串,但如果您不在HTTPS上,这就是安全问题。
        • SSE允许POST数据,因此这可能会包含在URL查询字符串
        • 由于网络连接可能关闭(设备故障,防火墙,手机不在覆盖区域等)

        在我看来,websockets比SSE更灵活,甚至允许客户端发送多条消息。但是Jersey没有实现支持websocket(JSR 356)的JEE规范。

但实际上你应该阅读他们SSE implementation的文档,他们的其他信息,例如什么是投票和什么网络套接字。

答案 1 :(得分:1)

AsyncResponse就像一个ajax轮询,等待时间很长。客户端发起单个AJAX请求以检查在收到数据或发生超时之前不会返回的更新并触发另一个请求。它确实创建了不必要的检查循环(在服务器端),并且负载等于连接的客户端数量。更多客户端,更多循环启动=需要更多资源。

服务器发送事件有点类似于服务器端的长轮询,它们都使用循环来检查更新并触发响应。唯一的区别是长轮询将连续发送请求(在超时或接收数据之后),而SSE只需要启动一次。因此,当您考虑电池使用时,SSE更适合移动应用。

Websocket也使用循环,但不仅仅是检查更新;还可以在握手后侦听新连接并升级到WS / WSS的连接。与长轮询和SSE不同;负载随着客户端数量的增加而增加,websocket像守护进程一样不断地运行循环。除了常量循环之外,随着更多客户端连接到套接字,负载也会增加。

例如,如果您是出于管理目的而设计Web服务,则在长时间轮询和SSE上运行的服务器允许在办公时间之后休息,当没有人在场时,而websocket将继续运行,等待连接。我提到没有正确的身份验证,任何人都可以创建一个客户端并连接到您的websocket?大多数情况下,在握手部分没有进行身份验证和拒绝连接,但是在建立连接之后。

我应该继续如何在多个标签上实现websocket吗?