OPA作为K8s Sidecar时HTTP请求结果缓存的技术咨询
OPA http.send 缓存相关问题解答
先确认你使用的缓存配置代码:
value := http.send({ "url": "https://whatever.com", "method": "get", # Cached for one minute "force_cache": true, "force_cache_duration": 60 })
1. OPA以K8s Sidecar形式运行时,缓存存储位置
OPA的http.send缓存是进程内内存缓存,也就是运行OPA的Sidecar容器进程的内存中。这种缓存是临时存储,容器或OPA进程重启后,所有缓存内容会被清空,不会持久化到磁盘或外部存储。
2. OPA判断使用缓存还是发起REST调用的逻辑
- 首先检查请求是否开启
force_cache: true,未开启则直接发起REST调用,不触发缓存逻辑; - 若开启缓存,OPA会根据
http.send的请求参数(包含URL、请求方法、请求头、请求体等)生成唯一缓存键; - 通过缓存键查找内存缓存:
- 找到有效条目(当前时间与缓存存入时间的差值未超过
force_cache_duration设置的秒数),直接返回缓存值; - 未找到条目或条目已过期,发起REST调用,将返回结果存入缓存并记录存入时间。
- 找到有效条目(当前时间与缓存存入时间的差值未超过
3. 缓存的失效机制
- TTL过期失效:每个缓存条目会记录存入时间,当时间差超过
force_cache_duration设定的秒数时,条目判定为失效,下次请求会重新调用接口并更新缓存; - 进程重启清空:由于缓存存在OPA进程内存中,OPA进程退出(比如Sidecar容器重启、进程崩溃重启)时,所有缓存内容会被彻底清空;
- 缓存覆盖:后续相同请求参数(缓存键一致)的
http.send调用,只要成功获取新结果,就会覆盖旧缓存条目,并重新开始TTL计时。
内容的提问来源于stack exchange,提问作者Adi
相关产品推荐
相关产品推荐

