因为balancer/header_filter之类的指令里不能访问redis/dns解析,所以想在起个timer做这个事,然后存到shared.dict里去,考虑更新的竞争需要加锁,学习这里的实现 https://github.com/openresty/lua-resty-lock#for-cache-locks 应该是在第4步起一个timer做事,但是主线程获取的锁如何传递给这个timer呢?而不是被别的抢去了...
你直接在 timer 里来获取锁呢?
原来的想法比较理想:timer里先拿锁,然后做查询,然后放开锁;当前主线程后拿锁(timer线程已经放了表示完事了),拿到锁后从缓存里读结果。 但是拿锁这个先后顺序没办法控制,ngx.sleep也不能用...其实就是想试试有没有能绕过balancer/header_filter里的限制...
没太明白你的最终目的,建议你直接描述你的最终需求
doujiang24 抱歉很久没回复,我这原始需求是想在balancer_by_lua/header_filter_by_lua做dns解析/redis读取之类的操作,缓存里的值过期后,使用失效的值很不稳定,经常拿不到。 现在的做法是写缓存的时候,另写一条不失效的,缓存失效了,就用那条不失效的救一下急,同时起个timer去做查询动作&更新缓存,唯一的坑就是初始化那一下啦...
jils2013 感觉你可以在更之前的阶段,比如 rewrite_by_lua 里,把需要的数据先取道,确保有了,然后再在 balancer/header_filter 里面用
doujiang24 原来也是这么实现的...想这么搞的原因:有个url的server列表特别长有60多个,然后考虑到balancer那步可能的retry所有的server都要提前解析,多个dns解析放一块时间有点长...就想着用几个解析几个,但是这个只能到了balancer才知道
jils2013 应该也还好,DNS 解析是可以加缓存的