跳到正文
套餐架构审查:5–7 个工作日内完成独立审查并制定分步迁移计划
项目
项目详情

社区工具 · 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. 1

    跨进程共享的频率限制

    ESI 允许每秒 150 次请求。由于数十个工作进程共享同一限额,我编写了一个基于 Redis 的通用限流器,并出于安全余量将其控制在每秒 50 次。

  2. 2

    无需定时任务的实时排行榜

    每日计数在保存 killmail 的同一数据库事务中原子递增。排行榜始终是最新的,也不需要单独的 cron 任务。

  3. 3

    保护 schema 之外的数据表

    我加入了一道保护措施,防止为性能而手写的数据表被 ORM 迁移删除。

技术

  • Next.js
  • React
  • TypeScript
  • GraphQL
  • Prisma
  • PostgreSQL
  • Redis
  • RabbitMQ
  • GitHub Actions

相关服务

您正在规划类似的系统吗? 从架构设计到正式上线,我全程为您提供支持。

联系我