跳到正文

自定义 Adapter

Elura Runtime 依赖对象安全的能力契约。只需实现所需 Trait,并注入 Gateway、World、 HTTP 服务或 Worker;不需要切换一个全局 Backend。

能力契约
World 发现/注册WorldDiscoveryWorldRegistrar
账户版本AccountVersionStoreMutableAccountVersionStore
在线 Session 生命周期OnlineDirectory
在线统计OnlineStatsReader
完整在线 BackendOnlineBackend
OTP ChallengeOtpStore
票据 ReplayReplayStore
PushPushTransportPushTargetResolver
会话控制SessionControlTransport
Player Cache 失效InvalidationBus
持久投递OutboxStoreIdempotencyStore
Gateway AdmissionAdmissionController

实现规则

  • 不仅实现方法签名,还要保持契约的原子性与 Shutdown 语义。
  • 验证 Namespace、ID、Duration 与不可信 Payload 大小。
  • 长运行 Subscriber 应在契约内部处理瞬时重连。
  • 明确交付保证,需要时让重复投递安全。
  • 暴露 Readiness 与有用 Counter,但不记录密钥或 Payload。
  • 测试并发、取消、Lease 过期、Fencing 与 Backend Failover。

应用专有实现应放在应用或独立 Crate,并在组合位置显式导入,让基础设施选择可以 被审查。

贡献到上游

当 Adapter 支持通用数据库、Broker、服务注册中心或部署平台时,应优先贡献到 Elura,避免多个应用长期维护平行副本。

Adapter PR 应包括:

  • 默认不启用的独立 Feature 和明确依赖边界;
  • 原子性、一致性、交付、取消与 Shutdown 语义说明;
  • 依赖故障影响正确性时的 Readiness 与有用运维 Counter;
  • 适用的并发、Lease 过期、Fencing、重连、重复投递与 Failover 测试;
  • 不让默认测试套件依赖外部服务的 Opt-in Integration Test;
  • Public API 覆盖、Rustdoc 以及同步的中英文目录说明。

Cluster 或分布式实现必须按真实拓扑假设验证,包括 Key Placement 与 Failover 行为。

示例:Replay Store 骨架

rust
use async_trait::async_trait;
use elura::prelude::{ReplayStore, Result};

struct DatabaseReplayStore;

#[async_trait]
impl ReplayStore for DatabaseReplayStore {
    async fn reserve(&self, ticket_id: &str, expires_at: u64) -> Result<bool> {
        // 必须由一次原子的 insert-if-absent 决定唯一获胜者。
        application_database_reserve(ticket_id, expires_at).await
    }
}

数据库操作必须只向一个并发调用者返回 true;Backend 不可用时必须返回错误, 不能返回 true

基于 MIT 许可证发布。