2.邮件系统Gate服设计

2.邮件系统Gate服设计


2.1 设计思路

Gate 服务器基本和聊天系统的类似,他作为所有客户端连接的统一入口,专注于 会话管理鉴权跨服路由,将邮件业务逻辑(Mail 服)与网络协议彻底解耦:

  • 会话管理
    维护 Session 的生命周期、心跳检测与断线重连,通过 GateAccountFlagComponent 绑定玩家 Account
  • 路由转发
    使用 RouteComponent 将来自客户端的 Mail 请求(如 C2Mail_*Request)透明转发给 Mail 服的对应 MailUnit,并把响应路由回客户端。
  • 统一入口
    客户端仅与 Gate 通信,Mail 服不暴露外网端口,确保网络安全与流量可控。
  • 跨服协同
    登录/登出时,Gate 调用 GateLoginHelper.Online/Offline,通知 Mail 服创建或销毁 MailUnit,保持各层状态一致。

这种设计让 Gate 只负责高并发连接与路由,Mail 服专注邮件核心业务,双方职责单一、易于扩展。


2.2 Gate 服主要组件

classDiagram
  class GateScene {
    +Start()
    +OnSessionAccept()
    +OnSessionDisconnect()
  }

  class GateAccountFlagComponent {
    +Account Account
  }

  class GateAccountFlagComponentSystem {
    +Destroy(self:GateAccountFlagComponent)
  }

  class RouteComponent {
    -addressMap: Dictionary
    +AddAddress(routeType, routeId)
    +Send(targetRouteType, message)
    +Call(targetRouteType, rpc)
  }

  class GateLoginHelper {
    +Online(session, account): FTask
    +Offline(scene, mailRouteId): FTask
  }

  GateScene --> GateAccountFlagComponentSystem : 挂载销毁系统
  Session --> GateAccountFlagComponent : 添加组件
  Session --> RouteComponent : 添加组件
  GateAccountFlagComponent --> GateLoginHelper : 调用上下线
  RouteComponent --> MailScene : CallInnerRoute

GateScene

  • **Start()**:启动网络服务
  • **OnSessionAccept()**:新客户端连接,创建 Session 并挂载 GateAccountFlagComponentRouteComponent
  • **OnSessionDisconnect()**:客户端断开,触发 GateAccountFlagComponent 系统,调用下线逻辑

GateAccountFlagComponent

  • 挂载在 Session 上,保存玩家的 Account 对象(含 MailRouteId
  • 在组件销毁时(用户下线或断线),触发调用 GateLoginHelper.Offline 告知 Mail 服下线

RouteComponent

  • 维护 RouteType.MailRoute → MailUnitRouteId 映射
  • Send:单向消息转发(无需回复)
  • Call:RPC 调用,负责在 GateScene 内通过 NetworkMessagingComponent.CallInnerRoute 与 MailScene 通信,转发给MailScene对应的MailUnit。

GateLoginHelper

  • Online:登录时向 MailScene 发送 G2Mail_LoginRequest,保存返回的 MailUnitRouteId,并将其注册到 RouteComponent
  • Offline:下线时向 MailScene 发送 G2Mail_ExitRequest,通知 MailUnit 清理并持久化

2.3 Gate 服上下线流程

客户端发起登录

sequenceDiagram
  participant ClientSession
  participant GateSession
  participant MailScene

  ClientSession->>GateSession: C2G_LoginRequest { Name }
  GateSession->>GateSession: Add GateAccountFlagComponent & RouteComponent
  GateSession->>GateAccountFlagComponentSystem: 创建/更新 Account
  GateSession->>GateLoginHelper: Online(session, account)
  GateLoginHelper->>MailScene: CallInnerRoute G2Mail_LoginRequest
  MailScene-->>GateSession: Mail2G_LoginResponse { MailUnitRouteId }
  GateSession->>RouteComponent: AddAddress(MailRoute, MailUnitRouteId)
  GateSession-->>ClientSession: G2C_LoginResponse { ErrorCode }
  1. C2G_LoginRequest:客户端发送用户名
  2. 会话组件挂载:绑定 Account 与 RouteComponent
  3. GateLoginHelper.Online:调用 CallInnerRoute 登录 Mail 服
  4. Mail2G_LoginResponse:Mail 服返回 MailUnitRouteId,Gate 保存路由地址
  5. G2C_LoginResponse:Gate 向客户端告知登录成功

客户端发起邮件请求

sequenceDiagram
  participant ClientSession
  participant GateSession
  participant MailUnit

  ClientSession->>GateSession: C2Mail_SendMailRequest
  GateSession->>RouteComponent: Call(MailRoute, request)
  RouteComponent->>MailUnit: 路由到具体 MailUnit
  MailUnit-->>GateSession: Mail2C_SendMailResponse
  GateSession-->>ClientSession: 转发响应

2.4 总结

  • 职责分离:Gate 完全专注连接与路由,Mail 服专注邮件业务。
  • 透明路由RouteComponent + CallInnerRoute 实现跨服请求与响应,客户端无需感知集群拓扑。
  • 组件化GateAccountFlagComponent 管理上下线,RouteComponent 管理路由映射,拆分清晰。
  • 可扩展性:新增其他服务(如金币、物品服)仅需在 GateLoginHelper 中添加调用,无需修改客户端逻辑。
  • 高可用:Gate 无状态设计可集群扩展,MailUnit 下线时自动持久化,保障数据一致性。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏