跳到正文

Adapters ​

Adapter 将 Elura 的能力契约连接到基础设施。它们按应用能力而不是厂商分组:同一个 应用完全可以用 DNS 做发现、Redis 管理在线会话、SQL 保存 Outbox。

text
Gateway / World / Worker
          |
       核心契约
          |
     基础设施 Adapter

Redis、SQL 与 Kubernetes 都是实现,不是框架必需组件。Gateway 到 World 的应用 流量仍然通过 ELR2 直连。

能力目录 ​

分类核心契约内置实现
服务发现WorldDiscovery、WorldRegistrarDNS、Redis、Kubernetes Endpoints
共享状态账户版本、在线目录、OTP、Replay各能力分别支持内存、Redis、SQL
在线状态OnlineDirectory、OnlineStatsReader、OnlineBackend内存、Redis、自定义
消息与控制PushTransport、SessionControlTransport、InvalidationBus适用时进程内、Redis Streams/PubSub
准入控制AdmissionControllerRealm 策略、Redis 分布式策略
OutboxOutboxStore、IdempotencyStore内存、Redis、PostgreSQL、MySQL
Kubernetes发现、Leader、OwnershipEndpointSlice 与 Lease Controller
Redis 运维Readiness 与连接行为Standalone 与 Cluster Adapter
自定义公开扩展 Trait应用实现

欢迎贡献通用基础设施支持

如果一个 Adapter 为数据库、Broker、Registry 或平台提供通用语义,建议提交到上游, 让契约、故障行为、测试与运维说明一起维护。参见 自定义 Adapter。

Feature 边界 ​

toml
# 契约模块与 DNS Discovery
elura = { version = "0.3.1", features = ["adapters"] }

# 只添加实际使用的基础设施
elura = { version = "0.3.1", features = ["redis", "sql", "kubernetes"] }

具体类型位于 elura::adapters,并且不会进入 Prelude,这让 Redis、SQL 或 Kubernetes 依赖在组合代码中保持可见。

最小组合示例 ​

下面的 Gateway 组合了两个 Redis 能力,但它们仍是独立注入槽位,可以分别替换:

rust
use std::{sync::Arc, time::Duration};

use elura::adapters::online::RedisOnlineDirectory;
use elura::adapters::replay::RedisReplayStore;
use elura::prelude::*;

let replay = Arc::new(
    RedisReplayStore::connect(redis_url, "game:ticket-replay").await?,
);
let online = Arc::new(
    RedisOnlineDirectory::connect(redis_url, "game:online", Duration::from_secs(60)).await?,
);

let online_config = GatewayOnlineConfig::new(
    "gateway-1",
    Duration::from_secs(60),
    Duration::from_secs(20),
    DuplicateLoginMode::RejectNew,
);

let gateway = Gateway::new(gateway_config)
    .replay_store(replay)
    .online_directory(online, online_config);

这段代码只组装能力。还需要按搭建指南添加客户端 Transport、World Client 或 Discovery,并调用 run。

选择原则 ​

从进程内状态和平台原生发现开始。只有某项行为必须跨副本或跨进程替换保留时, 才加入共享基础设施。应逐项能力选择实现,不要求所有能力使用同一个后端。

基于 MIT 许可证发布。