0
点赞
收藏
分享

微信扫一扫

odoo 集群频繁更新静态资源包,并失效缓存

频繁的更新会影响服务的性能
发生该事件的核心代码

def lookup(self, method, *args, **kwargs):
d, key0, counter = self.lru(args[0])
key = key0 + self.key(*args, **kwargs)
try:
r = d[key]
counter.hit += 1
return r
except KeyError:
counter.miss += 1
value = d[key] = self.method(*args, **kwargs)
return value
except TypeError:
counter.err += 1
return self.method(*args, **kwargs)

目前认为由于两个服务器之间还存在某些数据,未完成共享,比如上方中的key 数据, 目前看起来还是存储在内存中的, 没有在redis 中存储, 结果就会导致两边的服务器查不到相应的缓存数据
系统在没有找到key值的情况下会执行method方法,也就是​​​IrQWeb._get_asset_nodes​​​,会调用清理缓存的功能
​​​self.key(*args, **kwargs)​​​ 是对应方法传入的参数,​​_get_asset_nodes​​​ 传入的参数就是:​​'web.assets_backend', 'en_US', True, False, False, False, (None,)​​ key 的示例值如下:

('ir.qweb', <function IrQWeb._get_asset_nodes at 0x00000000085E8E18>, 'web.assets_backend', 'en_US', True, False, False, False, (None,))

其中使用了方法对象,存储的是一个地址值, 不同的服务器,在使用的时候自然会使用不同的地址,就导致key 的不一样, 尝试更改key 的值.
解决方案如下:
一个模型下的方法应该不会有重复的,所以直接将对象更改为方法名即可,即使用字符串
更改后的代码如下: (添加了 ​​​__name__​​))

def lru(self, model):
counter = STAT[(model.pool.db_name, model._name, self.method)]
return model.pool.cache, (model._name, self.method.__name__), counter

懂得,原来世界如此简单!



举报

相关推荐

0 条评论