【问题标题】:Servlet 3.0 and Comet/long-polling: What happens during these specific scenarios?Servlet 3.0 和 Comet/long-polling:在这些特定场景中会发生什么?
【发布时间】:2011-08-15 16:39:15
【问题描述】:

我看了一下 Servlet 3.0 的服务器推送实现的简要概述 here 并留下了比我来的更多的问题。这些问题与我的用例有关:在“朋友”之间实现动态通知系统,例如 Facebook。从概念上考虑问题,我会这样处理:

  1. 在每个 页面,包含发出的代码 XMLHttpRequest “get” 请求到 服务器
  2. 允许服务器存储 相关的请求/响应对象 这些类型的 XMLHttpRequests 在 应用范围的地图(与 AsyncContext 的帮助和 .startAsync()),由用户的键控 网站 ID
  3. 每当用户进行操作时 产生通知,查询 应用程序范围的 ID 的映射 用户的朋友,并使用 存储在那里的响应对象,发送 通知给每个朋友。
  4. 每个朋友都会收到 通知和无限循环 在他们有问题的页面上 再次 XMLHttpRequests(由于无限循环)

假设我的系统在概念上是合理的(如果不是,请告诉我出了什么问题),我发现这个系统存在几个问题:

  1. 请求/响应会发生什么 响应后在地图中配对 用来?我应该手动 从地图中删除它,或等待 客户端发送的循环 另一个请求,因此存储 请求/响应对象对可以是 替换为与 新的 XMLHttpRequest?链接 上面使用了“承诺”和 “未承诺”是指 响应对象。有人可以 解释这些词的意思 这种情况(我有一种感觉 它们与寿命有关 响应对象)?

  2. 如果用户的两个或多个朋友同时参与导致通知的操作,会发生什么情况?每个用户只存储一个请求/响应对。无论哪个朋友的操作碰巧找到了有问题的用户,请求/响应对都会将其通知发送给该用户,但是其他朋友的操作呢?如果它们都同时发生,那么在用户发送另一个 XMLHttpRequest 以存储在地图中之前,其他操作将没有用于发送通知的请求/响应对。据推测,其他操作将解析地图并且找不到该用户的条目(因为在其他操作使用响应后手动删除了它),或者找到已经使用的“陈旧”请求/响应对象。我假设一个响应对象不能用于两个不同的响应,那么有人将如何解决这个问题?

  3. 如果通知是 当用户被发送给用户时 切换页面?如果我们完全看 加载网页作为打开的窗口 用于接收通知请求, 和一个加载一个作为关闭的窗口 (因为它无法接收和 处理响应 前面发送的 XMLHttpRequests 页),期间发送的通知 这个时间框架将会丢失。是 有什么我可以做的 在数据库中查询新的 动作和生成通知 页面加载时那样吗?

  4. 最后,当用户 导航离开网站和 会话过期?我们是否期望 周期性地遍历地图 并删除与 没有现有的会话?

对不起,如果这是一个长篇阅读。即使您只能回答上述问题之一,它也会有所帮助!

【问题讨论】:

    标签: jquery servlets jakarta-ee comet long-polling


    【解决方案1】:
    1. 响应会一直保留,直到它可能超时。你一遍又一遍地推送新的信息。这就是彗星。您不会永远循环获取请求,而是处理来自服务器的数据流,1 个获取请求将持续到超时,然后在完整的函数中发出另一个获取。

    2. 同样,响应仍然可用,您只是在上面写,而不是每次都关闭它。

    3. 一种方法是为所有通知添加时间戳,并使用特定时间的数据加载页面,然后您的初始获取请求提供时间戳,然后您就可以更新。

    4. 我再次假设,你坚持到超时。

    所以为了更好地解释这里发生了什么,

    • 您的页面已加载并发送获取请求。
    • 请求/响应存储在地图中。
    • 然后在 SAME 请求/响应对上发送每个更新。
    • 您的 get 请求侦听 readystate === 3(已接收数据)并读取数据以获取已发送的任何新内容。
    • 当它们超时/已发送一定数量的数据/无论它们被删除时。

    【讨论】:

    • 谢谢!我查看了用于异步功能的 API,并且确实以这种方式工作。我很困惑,因为 Wikipedia 说以下内容:“......浏览器向服务器发出异步请求,它可能会在响应之前等待数据可用......在响应处理结束时,浏览器创建并发送另一个 XHR,等待下一个事件......因此,浏览器始终保持与服务器的请求未完成,以便在每个事件发生时得到响应。网络上的许多其他材料也定义了这样的长轮询。
    • @Kevin,这确实是长轮询,但您在问题中描述的是一种不同风格的彗星,称为流式传输,不是长轮询。我认为这就是您的困惑的根源。
    • 啊...出于某种原因,我认为 servlet 3.0 的实现只是长轮询。它似乎默认实现流式传输并提交响应(通过调用 complete())以实现长轮询是可选的。
    猜你喜欢
    • 2010-12-31
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多