跳到主要内容

跨服支持

Assiah 支持 BungeeCord/Velocity 群组服环境下的跨服邮件互通。

架构

跨服支持依赖两个组件:

  • MySQL — 所有子服连接同一数据库,邮件数据共享
  • Redis — 提供跨服实时通知、缓存同步和玩家路由(可选但推荐)

跨服架构包含三个核心模块:

模块说明
MailNetworkBridge基于 Redis Pub/Sub 的跨服通信桥接器
MailRouteManager维护玩家 UUID → 服务器标识的路由映射
MailCacheProviderRedis 缓存层(未读数量缓存 + 路由缓存)

配置步骤

1. 设置服务器标识

每个子服在 config.yml 中设置不同的 server-name

server-name: lobby    # 大厅服
# server-name: survival # 生存服
# server-name: rpg # RPG 服

2. 所有子服使用同一 MySQL 数据库

database:
mode: mysql
mysql:
enabled: true
host: 你的MySQL地址
port: 3306
database: assiah
username: root
password: 你的密码
parameters: "?useSSL=false&serverTimezone=UTC&characterEncoding=utf8"
pool:
maximum-pool-size: 8
minimum-idle: 2
connection-timeout-ms: 10000
table-prefix: assiah_

确保所有子服的 table-prefix 一致。

3. 启用 Redis

redis:
enabled: true
connection:
host: 你的Redis地址
port: 6379
password: ""
database: 0
timeout-ms: 3000
channel:
mail-notify: assiah:mail:notify
route-sync: assiah:mail:route
cache-evict: assiah:mail:evict
cache:
unread-ttl-seconds: 30
mailbox-list-ttl-seconds: 15
route-ttl-seconds: 60
degrade:
fail-open: true
log-when-unavailable: true
keep-core-flow-working: true

确保所有子服连接同一个 Redis 实例,且频道名称一致。

Redis 频道说明

频道用途
assiah:mail:notify新邮件通知广播,通知目标玩家所在的子服
assiah:mail:route路由同步,追踪玩家当前所在的子服
assiah:mail:evict缓存失效广播,确保各子服缓存一致性

缓存 TTL 配置

Redis 缓存的过期时间可以按需调整:

redis:
cache:
unread-ttl-seconds: 30 # 未读数量缓存(秒)
mailbox-list-ttl-seconds: 15 # 邮箱列表缓存(秒)
route-ttl-seconds: 60 # 玩家路由缓存(秒)
  • 未读缓存:加速未读数量查询,避免每次都查数据库
  • 列表缓存:加速邮箱列表加载
  • 路由缓存:记录玩家当前所在服务器,用于跨服通知投递

玩家路由

玩家上下线时,插件会自动维护路由信息:

  • 玩家登录 → 注册路由(本地 + Redis),广播 route_update
  • 玩家退出 → 移除路由(本地 + Redis),广播 route_remove

查询玩家所在服务器时,优先查本地缓存,本地没有再查 Redis。

降级策略

Redis 是可选增强层,不是核心依赖。降级行为可以精细控制:

redis:
degrade:
fail-open: true # Redis 不可用时允许核心功能继续运行
log-when-unavailable: true # Redis 不可用时输出警告日志
keep-core-flow-working: true # 保持核心流程正常工作

降级后的影响:

  • 邮箱核心功能(收发、领取、管理)仍然完整可用
  • 跨服实时通知不可用,但玩家登录时仍会收到未读邮件通知
  • 缓存加速不可用,所有查询直接走数据库