2010-12-10 102 views
0

我们将此API用于我们的呼叫中心订购系统,即我们的在线订购通信。 但是很多请求和响应都是相同的,或多或少是静态的 - 但API服务器生成它们,它不仅仅提供静态文件。缓存XML响应

作为缓存XML响应的最佳方法,您有何建议?我看了一下Zend_Cache。但根据我的理解,我认为这是基于客户端/会话的,我希望所有客户端都能利用相同的缓存。

此外,每个综合浏览量都会为篮子的内容做一个pricerequest,您对此建议使用什么样的缓存。我认为Zend_Cache也许可以在这里发挥作用!?

基本上我需要的是承担API服务器的负载,因此它有更多的资源来处理价格请求以及其他每个请求发生更改的请求。

更新:13. 2010年12月10.45

请求定时

2010-12-10T14:43:46+01:00 DEBUG (7): XML GET /ccstatus [0.054742097854614] 
2010-12-10T14:43:46+01:00 DEBUG (7): XML GET /storestatus [0.063634157180786] 
2010-12-10T14:43:46+01:00 DEBUG (7): XML GET /storestatus [0.062693119049072] 
2010-12-10T14:43:46+01:00 DEBUG (7): XML GET /storestatus [0.062756061553955] 
2010-12-10T14:43:46+01:00 DEBUG (7): XML GET /storestatus [0.062740087509155] 
2010-12-10T14:43:46+01:00 DEBUG (7): XML GET /storelocations [0.065214872360229] 
2010-12-10T14:43:46+01:00 DEBUG (7): XML GET /coupons [0.070861101150513] 
2010-12-10T14:43:47+01:00 DEBUG (7): XML GET /packagedeals [0.51115489006042] 
2010-12-10T14:43:47+01:00 DEBUG (7): XML POST /price [0.065691947937012] 
2010-12-10T14:43:47+01:00 DEBUG (7): XML GET /pizzas [0.10685706138611] 
2010-12-10T14:43:47+01:00 DEBUG (7): XML GET /bevtypes [0.059874057769775] 
2010-12-10T14:43:47+01:00 DEBUG (7): XML GET /bevsizes [0.056848049163818] 
2010-12-10T14:43:47+01:00 DEBUG (7): XML GET /items [0.070401191711426] 
2010-12-10T14:43:47+01:00 DEBUG (7): XML GET /storestatus [0.062546014785767] 
2010-12-10T14:43:47+01:00 DEBUG (7): XML GET /storestatus [0.063254117965698] 
2010-12-10T14:43:47+01:00 DEBUG (7): XML GET /storestatus [0.062647104263306] 
2010-12-10T14:43:47+01:00 DEBUG (7): XML GET /storestatus [0.062632083892822] 
2010-12-10T14:43:47+01:00 DEBUG (7): XML GET /storestatus [0.062486886978149] 
2010-12-10T14:43:47+01:00 DEBUG (7): XML GET /items [0.059072017669678] 
2010-12-10T14:43:47+01:00 DEBUG (7): XML GET /storestatus [0.062618970870972] 
2010-12-10T14:43:48+01:00 DEBUG (7): XML POST /price [0.063409805297852] 

这是一个单一网页浏览请求,显示侧的订单页面,和篮包含2项。

基于这些时间,你认为我会通过缓存数据获得相当大的差异吗?这些时间完全没有负载,因此在高负载情况下缓存可能派上用场。

回答

1

我没有看到一个显而易见的方式来对基于篮子的pricerequest请求进行大量缓存。这些可能会引起我基于会话的,高度可变的,因此按照请求计算它们似乎非常必要。

其他请求 - “API请求” - 如果它们确实如你所建议的那样是静态的,那么它们似乎是直接使用File或Memcached后端的Zend_Cache的理想选择。只需要找出一个算法来为每个希望缓存的静态API请求生成一个唯一的键。

您甚至可以在前端选项中指定无限生命周期,并运行cron作业以任何频率重新填充缓存,而频率您认为足够合理以保持内容的新鲜度。

只想大声。

干杯!

+0

伟大的想法:)关于价格请求,我想在会话中保存最后一个响应,并且只更新/刷新响应,如果有任何更改篮子的内容。但是你可能是对的,我可能会将更多或更少的静态请求存储在一个文件中。我已经更新了最初的帖子,列出了每个请求从API获取的日志记录 – Phliplip 2010-12-13 09:32:11

+0

正确的是,如果篮子没有变化,就不需要做新的价格申请。接得好。 ;-) – 2010-12-13 11:03:54

+0

接受你的答案,因为我使用了Zend_Cache文件和一个cron作业来更新缓存。我们立即看到在线订购的加载时间下降了50%:)没有科学的方法,只需点击链接即可加载计数秒。 – Phliplip 2010-12-14 07:50:46

4

Zend_Cache不是基于会话的。它有一个number of backends to store the cached data in。例如,您可以在网络上设置一个memcached服务器并将XML存储在那里。您可以通过函数调用或整个页面结果或任意键进行缓存。

你可以找到许多articles about Zend_Cache at Devzone

另一种选择是增加你的API服务器和您的客户端透明地处理你的API服务器的任何请求,并决定是否送达缓存的响应或查询之间的高速缓存代理API服务器。这种方法的优点是它使缓存逻辑远离你的API服务器。缺点是它需要另一台服务器。

+1

要考虑的缓存代理是Varnish(http://www.varnish-cache.org/)和Squid(http://www.squid-cache.org/)。 – ivy 2010-12-10 12:39:48

+0

另一个服务器*应用程序*,但不一定是另一个*物理服务器*。 – 2010-12-12 12:43:47

+0

@ElYobo我没有说,我呢? ;) – Gordon 2010-12-12 12:51:25