如何获取Envoy接收请求的时间或让其将该信息注入请求?
解决方案
方法一:通过Envoy Lua过滤器注入请求接收时间
Envoy支持通过Lua过滤器在请求转发给后端服务前,将自身接收请求的时间注入到请求头中,具体配置步骤如下:
- 修改Envoy配置,在HTTP过滤器链中添加Lua过滤器,注入请求起始时间:
# Envoy配置片段 http_filters: - name: envoy.filters.http.lua typed_config: "@type": type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua inline_code: | function envoy_on_request(request_handle) -- 获取Envoy接收请求的毫秒级时间戳 local start_time_ms = request_handle:start_time() -- 将时间戳添加到自定义请求头 request_handle:headers():add("X-Envoy-Request-Start-Time", tostring(start_time_ms)) end - name: envoy.filters.http.router typed_config: {}
- Flask服务中读取该请求头,用Envoy的接收时间替代服务处理时间做验证:
# Flask代码片段 from flask import Flask, request app = Flask(__name__) @app.route('/node/join', methods=['POST']) def node_join(): # 获取客户端发送的request_time(假设为秒级Unix时间戳) client_request_time = float(request.args.get('request_time')) # 获取Envoy注入的接收时间(毫秒级转秒级) envoy_start_time = float(request.headers.get('X-Envoy-Request-Start-Time')) / 1000 # 验证时间误差是否在2秒内 if abs(client_request_time - envoy_start_time) <= 2: return "节点加入成功", 200 return "时间验证失败", 403
关键注意事项
- 确保所有节点(包括运行Envoy的节点)时钟同步误差不超过2秒,否则仍可能出现验证失败。
- 若你的
request_time是毫秒级时间戳,无需做除以1000的转换,直接对比即可。
替代思路:优化Gunicorn队列压力
如果不想修改Envoy配置,也可以通过调整Gunicorn参数减少请求等待时间:
- 增加worker数量(比如
--workers 8),提升并行处理能力。 - 调整
--backlog参数,控制队列长度,避免请求长时间排队。
但这种方法无法彻底解决高负载下的排队问题,优先级低于Envoy注入时间的方案。
内容的提问来源于stack exchange,提问作者Zvi Rosenfeld
相关产品推荐
相关产品推荐

