【问题标题】:Is it possible to have asynchronous processing是否可以进行异步处理
【发布时间】:2010-05-04 02:32:54
【问题描述】:

我有一个要求,我需要向我的客户发送持续更新。在这种情况下,客户端是浏览器。我们有一些每秒更新的数据,所以一旦客户端连接到我们的服务器,我们就会保持持久连接并不断向客户端推送数据。

我正在服务器端寻找有关此实现的建议。基本上我需要的是这样的: 1.客户端连接到服务器。我维护套接字和有关套接字的元数据。元数据包含需要发送到该客户端的更新 2. 服务器进程现在等待新的客户端连接 3. 另一个进程将拥有所有打开的套接字的列表,并将遍历每个套接字并在需要时发送更新。

我们可以在 Apache 模块中做这样的事情吗: 1. Apache 进程获取新连接。它维护连接的状态。它将状态保存在一些全局内存中并返回到根进程以表示它已完成,以便它可以接受新连接 2. Apache 进程虽然已将状态返回给根进程,但它也在并行执行,它通过其全局存储并向客户端发送更新(如果有)。

Apache 进程也可以做这些事情: 1. 有多个相关联 2. 异步等待新连接的同时处理之前的连接?

【问题讨论】:

    标签: apache apache-modules


    【解决方案1】:

    这是一个复杂且低效的更新模型。您的服务器将尝试更新已关闭的客户端。服务器必须维护所有客户端数据和元数据(上次更新时间等)。

    通常,在轮询模型中使用 ajax 进行持续更新。客户端有一个 javascript 计时器,当它触发时,会触发提供更新数据的服务。客户端继续定期获取更新,无需编写 apache 模块。

    此模型是否适用于您的场景?

    More reasons to opt for poll instead of push
    Periodic_Refresh

    【讨论】:

      【解决方案2】:

      With a little patch 恢复暂停的 mpm_event 连接,我有一个异步 Apache 模块正在工作。有了这个,您可以进行改进的轮询:

      1. javascript 连接到 Apache 并请求更新;
      2. 如果没有更新,则模块不会立即回答,而是使用 SUSPENDED;
      3. 一段时间后,在发生更新或超时后,回调会在某处触发;
      4. 回调向客户端提供更新(或“无更新”消息)并恢复连接;
      5. 客户端进入第 1 步,重复轮询,使用 Keep-Alive 将使用相同的连接。

      这样可以减少客户端和服务器之间的往返次数,并且客户端会立即收到更新。 (这被称为 Comet 的反向 Ajax,AFAIK)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-19
        • 2014-08-24
        相关资源
        最近更新 更多