石锅拌饭

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

by Robin Lu on Feb.07, 2006, about

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版的下载。我会尝试用这个新办法,争取在下一版解决这个问题。不知道熟悉网站开发的朋友对这个问题有什么更好的建议?


4 Comments for this entry

  • Felix Wong

    有一个wp的plugin叫做wp-cron的,可能可以解决用户不能在服务器端设置cron job的问题。

  • 94smart

    直接改成AJAX的得了,有人点的时候还更新。

  • Tangos

    新版本什么时候出呢,等着用,呵呵

  • Simonsen

    原来2006年就已经有恩相处这么好的办法来了,呵呵。

    这个在理论上来说是没有问题的,只是有一点比较麻烦,就是在大并发的情况下,怎么办?两个用户几乎同时请求update-cache,几乎同时触发这一事件,会造成短时间内系统资源耗尽,导致一段时间的系统死锁。
    如果考虑引入lock机制的话,又会遇到在文件lock还是数据库lock之间选择的问题。再说不管怎样lock,也会有lock被撞开的情况(访问量足够大的时候),这是缓存更新中比较头痛的问题了

3 Trackbacks / Pingbacks for this entry

Search

Archives

Browse by tags

agile apple blog book design ecto extension firefox git google hack ichm iphone keyword life mac madfox movie nonsense opensource plugin pm ruby rubyonrails sns software startup wordpress work 财帮子