2010-05-04 30 views
0

我有一个需求,我需要发送连续更新到我的客户。在这种情况下客户端是浏览器。我们每秒都会更新一些数据,因此一旦客户端连接到我们的服务器,我们就会保持一个持久连接并不断向客户端推送数据。是否有可能进行异步处理

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

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

所以Apache过程可以做这些事情: 1.有多个连接关联它 2.异步等待新连接,并在同一时间处理以前的连接?

回答

1

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

通常,为了连续更新,在轮询模型中使用ajax。客户端有一个javascript定时器,当它触发时,会触发一个提供更新数据的服务。客户端不需要编写apache模块就可以定期获取更新。

该模型适用于您的场景吗?

More reasons to opt for poll instead of push
Periodic_Refresh

0

With a little patch用以恢复中止mpm_event连接,我有一个异步Apache模块工作。有了这个,你可以做改进的投票:

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

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

相关问题