社区工具 · 2025 – 至今
KillReport
面向 EVE Online 玩家、军团和联盟的实时 killmail 追踪与分析平台。与 zKillboard 和 EVE 官方 API(ESI)同步数据,并按照 CCP 的许可条款以非商业方式运营。
我的角色: 设计、开发和运维全部由我一人完成。
killreport.com- 个后台工作进程
- ~45
- 个数据模型
- 42
- 共享 API 限额
- 50 次/秒
- GraphQL 订阅
- 实时
问题
游戏中的每一场战斗都会产生一条 killmail 记录,这些记录源源不断。丰富每条记录需要向外部 API 发起大量请求,而该 API 有严格的频率限制。
排行榜和实时动态必须无延迟地保持最新;某个工作进程崩溃或重启也不能导致网站瘫痪。
架构
数据源
zKillboard · ESI
任务队列
- RabbitMQ
任务分发
工作进程
- TypeScript
约 45 个进程
数据层
- PostgreSQL
- Prisma
- Redis
持久化与事件
API
- GraphQL Yoga
实时订阅
前端
- Next.js
App Router
API 服务器和工作进程是相互独立的进程,仅通过 Redis 通信,因此每一方都可以单独重启。
我实现了什么
实时动态
新的 killmail 通过 GraphQL 订阅即时显示在页面上。
角色、军团、联盟
每个实体都有历史记录、统计数据和自动同步。
排行榜
每日计数与记录在同一事务中更新,无需单独的定时任务。
主权与星图
追踪星域、恒星系和主权争夺战。
工作进程看板
显示队列和工作进程状态的监控界面。
EVE SSO
玩家使用自己的 EVE 账号登录;令牌自动刷新。
我解决的难题
- 1
跨进程共享的频率限制
ESI 允许每秒 150 次请求。由于数十个工作进程共享同一限额,我编写了一个基于 Redis 的通用限流器,并出于安全余量将其控制在每秒 50 次。
- 2
无需定时任务的实时排行榜
每日计数在保存 killmail 的同一数据库事务中原子递增。排行榜始终是最新的,也不需要单独的 cron 任务。
- 3
保护 schema 之外的数据表
我加入了一道保护措施,防止为性能而手写的数据表被 ORM 迁移删除。
技术
- Next.js
- React
- TypeScript
- GraphQL
- Prisma
- PostgreSQL
- Redis
- RabbitMQ
- GitHub Actions
相关服务
您正在规划类似的系统吗? 从架构设计到正式上线,我全程为您提供支持。
联系我