higress-group/higress

插件的OnHttpStreamingBody需要支持pause/resume 机制

Offen

#1.810 geöffnet am 25.02.2025

 (5 Kommentare) (0 Reaktionen) (0 zugewiesene Personen)Go (1.219 Forks)github user discovery
help wantedlevel/normalsig/wasm

Repository-Metriken

Stars
 (9.036 Sterne)
PR-Merge-Metriken
 (Durchschn. Merge 7T 9h) (18 gemergte PRs in 30 T)

Beschreibung

Ⅰ. Issue Description

自定义插件,插件里使用了OnHttpStreamingBody方法且需要和redis交互,因为环境特殊,不执行lua脚本,需要执行下列类似的多个redis指令

Image redis有返回但是插件里没有执行到redis指令里处理响应的部分即return data

Ⅱ. Describe what happened

OnHttpStreamingBody伪代码类似这样: // 限流器主逻辑(处理请求结束时的令牌统计和限流更新) 当 endOfStream 为真时: 获取输入令牌数 totalInputToken 和输出令牌数 totalOutputToken 从上下文获取限流配置: limitRedisContext(基于模型名称的限流配置) limitRedisContextIp(基于IP的限流配置)

// 执行限流操作
执行函数1ratelimiter(
    Redis键: limitRedisContext.key,
    令牌总数: limitRedisContext.count,
    窗口时间: limitRedisContext.window,
    消耗令牌: totalInputToken + totalOutputToken,
    操作成功时向 buffer 发送信号1
)

执行函数2 ratelimiterIp( Redis键: limitRedisContextIp.key, 令牌总数: limitRedisContextIp.count, 窗口时间: limitRedisContextIp.window, 消耗令牌: totalInputToken + totalOutputToken, 操作成功时向 buffer 发送信号2 )

// 等待至少一个限流操作完成
从 buffer 接收一个信号
重置持久化的令牌计数
返回原始数据

================================================================================================= // 通用限流器逻辑(伪函数) 函数1 ratelimiter(参数集合): 构造 Redis TTL 命令参数 发送 TTL 命令到 Redis: 如果 TTL >= 0(键存在): 构造redis DECRBY命令发送到redis 减少令牌数 否则(键不存在): 执行 SET 初始化令牌数并设置过期时间

操作完成后通过通道发送完成信号

函数2 ratelimiter(参数集合): 构造 Redis TTL 命令参数 发送 TTL 命令到 Redis: 如果 TTL >= 0(键存在): 构造redis DECRBY命令发送到redis 减少令牌数 否则(键不存在): 执行 SET 初始化令牌数并设置过期时间

操作完成后通过通道发送完成信号

结果是函数1和函数2和redis的回调结果还没处理,OnhttpStreamingBodu就返回了,即使在函数1和函数2 加channel进行阻塞也不生效

Ⅲ. Describe what you expected to happen

预计函数1和函数2和redis的请求处理完,OnHttpStreamingBody 才 return data。但是没有阻塞

Ⅳ. How to reproduce it (as minimally and precisely as possible)

Ⅴ. Anything else we need to know?

Ⅵ. Environment:

higress版本2.0.7

  • Higress version:
  • OS :
  • Others:

Contributor Guide