proxq

🦡 Redis驱动的异步HTTP代理队列

基于asynq和Redis的异步HTTP代理队列系统,将同步请求转为后台任务执行,实现客户端与慢速后端的解耦,支持重试、缓存和任务状态轮询。

收藏
983
安装
487
版本
0.10.4
CLS 安全扫描中
预计需要 3 分钟...

使用说明

核心用法

proxq是一个基于Go语言和Redis的异步HTTP代理队列系统,核心设计理念是"提交即返回"——客户端POST任意HTTP请求后立即获得202 Accepted响应和jobId,实际请求由后台worker异步转发到配置的上游服务,客户端通过轮询接口获取执行状态和结果。

系统支持路径前缀路由到多个上游服务,每个上游可独立配置超时、重试次数和路径过滤规则。内置两种缓存策略(内存LRU和Redis LRU),对幂等请求可自动复用之前的响应。对于WebSocket、分块传输或超大请求体,系统会自动切换为直接代理模式绕过队列。

关键API包括:提交任务(任意非/__jobs路径)、轮询状态(GET /__jobs/{id})、获取结果(GET /__jobs/{id}/content)、取消任务(DELETE /__jobs/{id})。通过X-Proxq-Source响应头可区分proxq原生响应与上游服务回放的响应。

显著优点

延迟解耦:彻底解决慢速API导致的客户端超时问题,特别适合耗时数分钟的报表生成、视频处理、大文件导出等场景。

可靠性增强:基于asynq的Redis队列保证任务不丢失,自动重试机制应对上游瞬时故障,比直接调用更健壮。

基础设施轻量化:单容器部署,依赖仅Redis,配置简洁,支持Docker快速启动。

灵活的路由策略:最长前缀匹配、路径剥离、条件缓存、直接代理绕过等机制,可在一个实例上混合处理同步/异步流量。

资源效率:客户端无需保持长连接,大幅降低并发连接数,适合高并发Webhook接收场景。

潜在缺点与局限性

无推送通知:纯轮询模型,任务完成后不会主动回调客户端,需自行实现轮询逻辑或结合外部事件系统。

零内置认证:开箱即用的proxq没有任何身份验证,必须自行前置反向代理(如Nginx、API Gateway)添加安全层,否则存在未授权访问风险。

SSRF攻击面:设计上允许提交任意目标URL请求,若配置不当(如指向内部管理服务),可能成为服务器端请求伪造的攻击向量。

结果存储成本:完成的作业响应内容默认存储在Redis中,高并发大响应场景需关注内存容量和持久化策略。

调试复杂度:异步模型增加了端到端追踪难度,需依赖jobId串联日志,分布式排查比同步调用更复杂。

适合的目标群体

  • 微服务架构团队:需要将同步API改造为异步模式,避免级联超时
  • Webhook集成开发者:需要可靠接收第三方Webhook而不阻塞发送方
  • 文件/媒体处理系统:上传大文件或触发长时间转码/分析任务
  • 遗留系统现代化:为无法修改的老旧慢速后端添加异步 facade
  • CDN/边缘层架构师:在边缘节点放置短超时代理,将重活排队到中心处理

使用风险

安全风险upstreams配置中的URL决定proxq的网络可达范围,误配置指向localhost:22或内部Metadata服务可能导致横向移动。建议绑定到loopback或内网,强制前置认证网关。

依赖稳定性:Redis是单点故障风险源,生产环境需配置Redis Sentinel或Cluster模式;asynq的Go版本升级可能带来行为变更。

资源耗尽风险:无限制的并发提交可能撑爆Redis内存或worker池,需配合上游的rate limit和proxq的队列深度监控。

数据一致性DELETE取消是尽力而为,已部分执行的请求可能影响上游状态;缓存命中策略需谨慎设计,避免对非幂等操作错误复用旧响应。

proxq 内容

references文件夹
手动下载zip · 9.1 kB
setup.mdtext/markdown
请选择文件