Ticket #106 (closed 优化: fixed)

Opened 14 years ago

Last modified 14 years ago

squid缓存不一致问题(已有方案,待实施)

Reported by: chenchongqi Owned by:
Priority: major Milestone: 2012报价库5.0
Component: 报价库 Version: 报价库5.0
Keywords: squid,缓存 Cc:
Due Date:

Description (last modified by chenchongqi) (diff)

  • 引发不一致的异常

初步分析是因为更新xindex版本的时候,没有停mongodb的增量任务,导致在跑任务的时候重启了,有部分记录没有写完整,少了一些字段。

[04-19 09:27:00.049] {http-app-a-8081-149$329761932} WebApp[http://localhost:8081] java.lang.NullPointerException
[04-19 09:27:00.049] {http-app-a-8081-149$329761932} java.lang.NullPointerException
[04-19 09:27:00.049] {http-app-a-8081-149$329761932}    at cn.com.pconline.core.pricefront.repository.ProductFrontRepository$1.mapRow(ProductFrontR
epository.java:279)
[04-19 09:27:00.049] {http-app-a-8081-149$329761932}    at cn.com.pconline.core.pricefront.repository.ProductFrontRepository$1.mapRow(ProductFrontR
epository.java:1)
[04-19 09:27:00.049] {http-app-a-8081-149$329761932}    at cn.com.pconline.core.pricefront.repository.mapping.MongoRowMapper.mapRow(MongoRowMapper.
java:36)
[04-19 09:27:00.049] {http-app-a-8081-149$329761932}    at cn.com.pconline.core.pricefront.repository.AbstractNoSQLRepository.decode(AbstractNoSQLR
epository.java:81)
[04-19 09:27:00.049] {http-app-a-8081-149$329761932}    at cn.com.pconline.core.pricefront.repository.AbstractRepository.findFromCache(AbstractRepo
sitory.java:148)
[04-19 09:27:00.049] {http-app-a-8081-149$329761932}    at cn.com.pconline.core.pricefront.repository.AbstractRepository.find(AbstractRepository.ja
va:122)
[04-19 09:27:00.049] {http-app-a-8081-149$329761932}    at cn.com.pconline.core.pricefront.domain.ProductFront.find(ProductFront.java:36)
[04-19 09:27:00.049] {http-app-a-8081-149$329761932}    at _jsp._productSoResult__jsp._jspService(_productSoResult__jsp.java:271)
  • 问题

报价库前台做了squid缓存,但是实际上会存在squid缓存不一致的情况,因为按照正常hash去某台squid的时候,这台squid有可能队列满、响应超时等,这时候会重新hash到另一台squid去,导致同一个url会同时在多台squid有缓存,那么我们在浏览器反复刷的时候,看到的内容可能会不一致,在某个时间点应用有异常的时候尤其明显,反复刷有可能看到完全不同的内容。

2012/04/15 08:56:42 [error] 9054#0: *1040065103 upstream timed out 110: Connection timed out) 
while reading upstream, client: 192.168.237.58, server: product.pconline.com.cn, 
request: "GET /mobile/samsung/ HTTP/1.0", 
upstream: "http://192.168.239.64:8001/mobile/samsung/", 
host: "product.pconline.com.cn", 
referrer:  http://product.pconline.com.cn/mobile/nokia/"
  • 解决方案

要求:应用异常的时候,让squid短时间缓存例如5分钟,应用恢复后缓存异常页面的squid可以几分钟内就更新。

解决:原来的报价页面在squid之后是有mc缓存的,并且报价页有异常(不是真的没记录)的时候也是出一个没有记录的页面,200状态码,这样的话是做不到上面的要求,因为squid过期后来拿的还是mc里的异常页面,无法短时间更新。

最终的方法,xindex上了之后裸页面的加载时间也很快,所以可以去掉mc这一层,如果不去掉mc这一层,那么报价页必须对异常捕获后,做特殊处理不放到mc缓存。不管有无mc发生异常后都要设置response的max-age参数让squid只缓存几分钟,也不能完全去掉,否则有异常的那段时间里压力太大。 正常情况下确实没有记录的页面,按正常的squid、mc缓存处理。

Change History

comment:1 Changed 14 years ago by chenchongqi

  • Description modified (diff)

comment:2 Changed 14 years ago by chenchongqi

  • Status changed from new to closed
  • Resolution set to fixed
  • Description modified (diff)
  • Summary changed from squid缓存不一致问题 to squid缓存不一致问题(已有方案,待实施)

comment:3 Changed 14 years ago by chenchongqi

  • Version set to 报价库5.0
  • Description modified (diff)
  • Milestone set to 2012报价库5.0
Note: See TracTickets for help on using tickets.