使用有限的工具集(没有websocket,线程数量有限)跨客户端同步数据


Syncing data across clients with a limited set of tools (no websockets, limited number of threads)

我想实现的目标

我需要实现某种订阅事件的方法。确切地说,人们可以锁定表中的单元格(更多的用户可以同时查看同一个表),当其他人锁定单元格时,需要更新表。(所以用户不会多次尝试锁定同一个手机。)我统计至少有45-50个用户。(有多个表(在数量有限的独立网页上,用AJAX加载——使用JSON传输,我在服务器端对其进行编码。)

限制、资源和想法

  • 我没有带宽和磁盘空间限制。可用服务器的磁盘IO为2MB/s,内存为768MB(全部可用)
  • 我必须支持Chromium的旧版本(我相信3),它不支持websocket。我必须回到长轮询或任何其他技术
  • 该网页在共享主机上运行,限制为15个PHP进程。这意味着使用标准的长轮询技术最多只能支持页面上的7-8个人,这对于这个项目来说是不够的
  • Node.js不可用于此托管提供程序

我有以下想法:

使用频繁运行的CRON Job,我可以生成json字符串并将其写入文件——客户端可以定期下载json文件,并在发生更改时更新表。

我知道这听起来不太优雅,所以我决定在实施上述计划之前四处打听。

感谢您的任何想法/帮助,Bálint

有了这组服务器端限制,您可能只想在客户端中使用轮询。客户端将发出一个ajax调用,要求更新计时器。服务器每次接收ajax调用时都会向客户端提供最新状态。您必须根据想要支持的规模(规模越大,轮询间隔越长)以及规模对服务器端限制的影响,手动调整客户端轮询的频率。

客户端轮询将不利于带宽使用,因此您必须量化您可以使用的带宽(测量N个客户端在某个时间间隔轮询所使用的带宽,并相应地调整轮询频率)。

显然,更现代的技术,如持续连接的webSockets,甚至长时间轮询,都会为您提供更好的响应能力和更低的带宽使用率,但由于服务器端的限制,您似乎已经排除了这些技术。首选的解决方案是修复服务器端的限制。如果您使用socket.io,它将自动返回到不支持webSockets的客户端的长轮询。