如何用阻塞查询等待 Consul KV 变化?
查看完整题解
参考回答
直接回答
先读一个键,记下响应头 X-Consul-Index。下一次请求把它带到 index 参数里。Consul 会等候变化,或者到 wait 上限后返回。拿到内容要先判断值是不是真的变了。
讲清原理
每轮用新索引继续请求。索引回退时要从 0 重新取得当前状态,重新取得索引后,后续阻塞请求至少带 1,避免循环空转。请求失败要退避,客户端超时也应给长轮询留出窗口。
例子与易错点
用 Bash 将 CONSUL_URL 设为本地开发 agent 的地址。先用 HTTP PUT 创建 review/s056/watch,内容设为 before。运行以下片段后,从另一终端把同一个键改为 after。
key="$CONSUL_URL/v1/kv/review/s056/watch"
headers=$(mktemp)
trap 'rm -f "$headers"' EXIT
curl -fsS -D "$headers" -o /dev/null "$key?raw"
index=$(awk 'tolower($1) == "x-consul-index:" {gsub(/\r/,"",$2); print $2}' "$headers")
test -n "$index"
curl -fsS --max-time 10 "$key?raw&index=$index&wait=5s"
在等待窗口内写入时,阻塞请求返回 after。若无人写入,最多等待约五秒后也会返回,此时还可能是 before。
延伸阅读 Consul KV 怎么增删查改? · 怎么监控 Consul 的一个键或一组键? · Consul Blocking Query 和 Watch 有什么关系?
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。