是否可以进行异步处理

时间:2010-05-04 02:32:54

标签: apache apache-modules

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

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

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

Apache进程也可以执行以下操作: 1.有多个与之关联的连接 2.异步等待新连接并同时处理先前的连接?

2 个答案:

答案 0 :(得分:1)

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

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

此模型适用于您的方案吗?

More reasons to opt for poll instead of push
Periodic_Refresh

答案 1 :(得分:0)

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

  1. javascript连接到Apache并要求更新;
  2. 如果没有更新,则不是立即回答模块使用SUSPENDED;
  3. 一段时间后,更新或超时发生后,回调会在某处发生;
  4. 回调给客户端提供更新(或“无更新”消息)并恢复连接;
  5. 客户端转到步骤1,重复使用Keep-Alive将使用相同连接的轮询。
  6. 这样可以减少客户端和服务器之间的往返次数,并且客户端立即收到更新。 (这被称为Comet的反向Ajax,AFAIK)。