核心用法
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取消是尽力而为,已部分执行的请求可能影响上游状态;缓存命中策略需谨慎设计,避免对非幂等操作错误复用旧响应。