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
posted @   那时一个人  阅读(165)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
历史上的今天:
2020-12-28 postgres 新增或者更新语句
2019-12-28 apt 镜像源快速替换
点击右上角即可分享
微信分享提示