动态触发的缓存更新机制异步化的可能性

FBO wordpress插件在搜集来自朋友的outline时采取的是和wordpress dashboard以及lilina类似的
动态触发的缓存更新机制,也就是每次有用户访问某些页面的时候触发搜集过程,搜集过程先在缓存中查找,如果有未过期缓存可用,就使用缓存,否则就做远程更新。这种做法解决了一些问题,但有着不可避免的缺陷,尤其是在页面请求之间形成loop的时候更加糟糕。
车东的一篇blog提到了如何改良这种缓存机制,他的方法是在服务器端部署一个cron任务,定期触发更新缓存的链接。这样可以减少用户触发远程同步的几率,但是抬高了技术门槛,拿FBO wordpress插件来讲,如果要求每个用户都去服务器上加一个cron任务,几乎不太可能。
动态触发的缓存更新机制的问题是触发的过程和更新的过程必须同步的问题。是否能将请求的触发和缓存更新变成一个异步的过程,是解决这个问题的根本。我查了下php的资料,除了一个不推荐在webservice上启用的pcntl提供的fork以外,没有找到现成可用的异步机制。只有想其他的办法了。网页上的异步机制,最容易想到的就是ajax,想到这里,解决方案基本上就有了。
首先,将触发缓存更新的页面请求链接独立出来,比如说定义成http://www.example.com/update-cache,不提供任何的直接访问。在用户访问相关页面的时候,可以先强制使用缓存内容,同时,通过页面中的javascript调用xmlhttprequest向http://www.example.com/update-cache发出一个异步请求。由于是异步请求,页面的调入不会有延迟。对于这个异步请求,我们可以不提供任何callback处理。这个异步请求自动在后台启动缓存更新机制,因为没有人在线等待起结果,这个请求有多长的延迟也不会有影响。原本会造成延迟的同步请求就变成了后台的异步操作。
由于这个问题的存在,我暂时停止了FBO wordpress插件0.2版的下载。我会尝试用这个新办法,争取在下一版解决这个问题。不知道熟悉网站开发的朋友对这个问题有什么更好的建议?

7 thoughts on “动态触发的缓存更新机制异步化的可能性

Comments are closed.