0

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

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

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

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

4

2 回答 2

1

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

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

这个模型适用于您的场景吗?

选择轮询而不是推送
Periodic_Refresh的更多理由

于 2010-05-04T02:36:57.833 回答
0

用一个小补丁来恢复一个暂停的 mpm_event 连接,我有一个异步 Apache 模块工作。有了这个,您可以进行改进的轮询:

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

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

于 2014-04-13T14:34:36.913 回答