Metriche repository
- Star
- (9036 stelle)
- Metriche merge PR
- (Merge medio 7g 9h) (18 PR mergiate in 30 g)
Descrizione
Ⅰ. Issue Description
自定义插件,插件里使用了OnHttpStreamingBody方法且需要和redis交互,因为环境特殊,不执行lua脚本,需要执行下列类似的多个redis指令
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: