面向多租户场景的事件接入与 Webhook 可靠投递平台
RelayOps 接收事件后,在同一数据库事务中创建投递和 Outbox 记录,再由 RabbitMQ 驱动 Worker 发起真实 HTTP 请求。控制台完整展示每次投递、重试、失败、死信和回放过程。
| 方向 | 实现 |
|---|---|
| 一致性 | PostgreSQL 事务型 Outbox,publisher confirm 后才完成发布 |
| 幂等 | 租户级幂等键、投递唯一约束、单调递增的尝试历史 |
| 可靠投递 | 有限退避重试、Retry-After、死信、回放、崩溃恢复 |
| 多租户 | JWT/API Key 认证,所有业务查询强制租户隔离 |
| 流量治理 | Redis Lua 令牌桶、端点并发租约、队列背压 |
| 安全 | HMAC 请求签名、稳定投递 ID、SSRF 防护、响应体/超时上限 |
| 可观测性 | Prometheus、健康探针、结构化日志、端到端状态页面 |
| 扩展方式 | 同一制品支持 api、worker、all,Worker 可独立水平扩容 |
RelayOps 提供的是至少一次投递尝试。如果接收方已经成功处理请求,而 Worker 在记录结果前崩溃,系统会使用相同的 X-RelayOps-Delivery-Id 重试;接收方应据此去重。
Producer -> API -> PostgreSQL (event + deliveries + outbox)
|
Outbox Publisher
v
RabbitMQ ready / retry / DLQ
|
Worker replicas
v
Signed Webhook HTTP
Redis -> distributed rate limits + per-endpoint concurrency leases
PostgreSQL 是业务事实源;RabbitMQ 负责工作分发、确认和重试;Redis 只保存可丢弃的协调状态。详细设计见架构说明和 ADR。
本项目按 Windows 本地开发环境编写,PostgreSQL、RabbitMQ、Redis 使用同一台 Ubuntu 虚拟机(示例地址 192.168.150.101)。需要:
- PowerShell 7 或 Windows PowerShell 5.1
- Node.js 24+
- 可访问上述虚拟机中间件
- 网络可下载 Temurin JDK 与 Maven 依赖
git clone https://github.com/Sj295/RelayOps.git
Set-Location RelayOps虚拟机首次使用时,以管理员身份执行 ops/postgres/bootstrap.sql,并用同一应用密码初始化 RabbitMQ:
psql -h 192.168.150.101 -U postgres `
-v relayops_password="<your-app-password>" `
-f ops/postgres/bootstrap.sql
.\scripts\provision-rabbit.ps1 `
-HostName 192.168.150.101 `
-AdminUser '<rabbit-admin>' `
-AdminPassword '<rabbit-admin-password>' `
-AppPassword '<your-app-password>'然后运行本地配置。脚本会安全读取 PostgreSQL/RabbitMQ 应用密码,生成 JWT 和初始化令牌,创建被 Git 忽略的 .env,安装工作区 JDK、构建后端并安装前端依赖:
.\scripts\dev.ps1 setup所有敏感值只保存在本地 .env,不会进入 Git。
.\scripts\dev.ps1 start打开 http://127.0.0.1:5173。首次进入时选择 Create the owner account,初始化令牌可在本地 .env 的 RELAYOPS_BOOTSTRAP_TOKEN 中查看。
.\scripts\dev.ps1 status # 查看状态
.\scripts\dev.ps1 stop # 停止服务.\scripts\verify.ps1该命令执行后端单元/真实 PostgreSQL 集成测试、前端 Vitest 和生产构建。连接隔离的 relayops_it 数据库与 /relayops-it vhost 后,可使用 -LiveInfrastructure 运行完整故障套件。
已执行结果:100 请求/秒持续 15 秒,1,500 次接入、0 HTTP 失败、p95 16.16 ms;固定负载下 3 个 Worker 相比 1 个 Worker 将投递端到端 p95 降低约 89.3%。详见实测结果。
backend/ Spring Boot API、Worker 与数据库迁移
frontend/ React/TypeScript 运维控制台与 E2E
ops/ PostgreSQL、RabbitMQ 初始化资产
scripts/ 本地配置、启动和验证脚本
tests/k6/ 接入与幂等负载脚本
docs/ 架构、ADR 与实测结果
Java 21 · Spring Boot 4.1 · PostgreSQL · RabbitMQ · Redis · React 19 · TypeScript · Vite · Playwright · k6

