
MekDefender
一个面向Minecraft 1.21.1 + Mekanism的NeoForge服务端保护模组。单个mekdefender项目和单个JAR提供:针对锚点升级机器和维度稳定器的所有者感知区块加载;针对四种经过验证的安全内容的有界最新状态同步
MekDefender
一个用于 Minecraft 1.21.1 + Mekanism 的 NeoForge 服务器保护模组。
一个 mekdefender 项目和一个 JAR 提供:
- 为锚点升级机器和维度稳定器提供基于所有者感知的区块加载;
- 为四个经过验证安全的 Mekanism S2C 载荷提供有界的最新状态同步。
区块加载策略
当所有者登出时,Mekanism 会立即或在配置的宽限期后释放其加载器票据。登录恢复受到限制。默认情况下,无所有者的加载器会被禁用;无所有者/离线的维度稳定器也会跳过能量消耗。
MekDefender 不拥有票据控制器或 Mekanism 存档格式。票据变更仍使用 Mekanism 的代码。唯一独立保存的缓存是
world/data/mekdefender_loaders.dat(所有者到加载器位置的映射)。移除本模组会移除其 Mixin,Mekanism 恢复正常行为;孤立的缓存会被忽略。
Mek 同步安全边界
只有以下可替换的绝对状态通道可以被合并:
mekanism:update_tilemekanism:network_scalemekanism:fluid_networkmekanism:chemical_network
QIO、运输、GUI/容器/库存、配置、安全、装备、玩家数据、C2S、原版、未知载荷以及混合捆绑包均原样通过。载荷分类、Mekanism Mixin 调用契约、注入点、跟踪重新验证、活动对象解析和故障开放行为是固定的安全规则,而非管理员配置。
字节预算从 Minecraft 分组编码器在压缩、分帧和加密前产生的实际 S2C 分组大小中学习。每个通道维护一个 EWMA;initialEstimatedBytes 仅在实际样本到达前使用。如果学习到的大小超过配置的突发值,预算计费将上限为该突发值,以便最新状态不会被无限期推迟。诊断保留原始 EWMA。字节遥测是可选的,从不参与取消原始 Mekanism 发送的决策。
默认同步模式是 OBSERVE,它会记录统计信息而不取消 Mekanism 发送。在检查兼容性和统计信息后,使用 /mekdefender mode enforce 进行内存中的运行时覆盖。当模式或通道被禁用时,已接受的最终状态会安全地排出。
统一配置
唯一的配置文件为游戏/服务器实例生成于:
config/mekdefender-server.toml
它使用 schemaVersion = 2 并包含:
chunkLoading.*:所有者策略、宽限期、登录重载预算和调试日志;sync.channels.<channel>.*:独立的启用、间隔、截止时间和字节估计;sync.budget.*:每玩家/全局载荷和估计字节令牌预算;sync.scheduler.*:队列、捆绑、源工作、周期、间隔和超时限制;sync.pressure.*:软/临界压力和恢复阈值;sync.circuitBreaker.*:有界内部故障窗口和安全回退模式;sync.metrics.*:热点/时间窗口、实际编码字节 EWMA 和真实客户端 A/B 默认值;logging.*和permissions.*:冷却/转换日志以及读取/管理 OP 级别。
加载和重新加载是原子的。未知节或键、重复声明、无效类型、超出范围的值、错误的模式和矛盾的跨字段值会以带行号的错误拒绝整个重载;先前活动的快照保持有效。
游戏命令
/mekdefender status [compact|verbose]
/mekdefender compatibility
/mekdefender top [seconds] [limit]
/mekdefender channel <tile|scale|fluid|chemical>
/mekdefender player <name>
/mekdefender config <show|validate>
/mekdefender ab <status|start <seconds>|cancel>
/mekdefender mode <off|observe|enforce>
/mekdefender reload
/mekdefender resetstats
状态和通道输出将源请求/替换/物化与接收者入队/替换/发送单元分开。因此,显示的源和接收者减少百分比是同类单元的比率。configuredMode 和内存中的 runtimeMode 分别显示。读取和修改 OP 级别可独立配置。
/mekdefender ab start <seconds> 需要配置数量的真实、非 FakePlayer 客户端(默认两个)。它会预热并测量相等的 OBSERVE 和 ENFORCE 窗口,然后恢复之前的运行时模式。报告比较了压缩前实际编码的 S2C 字节和分组、平均值/p95 MSPT、派生的 TPS 以及平均值/p95 玩家延迟。预热期间的流量被排除;客户端数量低于配置的最小值或没有安全 Mek 流量的阶段会使比较无效。
对于每个阶段 30 分钟的窗口(约一小时加预热),将两个客户端保持在相同的代表性路由上并运行:
/mekdefender ab start 1800
如果在执行强制模式时,电路断路器窗口内发生配置数量的内部调度器/钩子故障,优化器会切换到配置的安全模式并停止接受新工作。已接受的最终状态仍会排出。管理员必须显式运行模式命令来清除断路器并重新启用强制模式。
在持续套接字压力期间,流体和化学绝对状态更新保持优先级,而瓦片和缩放更新保持有界且最新写入优先。恢复后它们以最新状态继续;这保护服务器,但不是严格的实时交付保证。
实测优化效果
最终集成 JAR 在 Youer 1.21.1-4a57297f 上测试,使用 NeoForge 21.1.241、 Mekanism 10.7.19.85、包含活动 Mekanism 缓冲网络的世界以及两个固定的 FakePlayer 接收者:
sourceRequested=25005
sourceReplaced=24981
payloadMaterialized=24
recipientSent=48
players=24/24
schedulerP95Ms=0.1887
networkIndexRebuilds=7
networkIndexScanned=21
networkIndexHits=72
failOpen=0
这是 99.904% 的源合并率:
24,981 / 25,005 = 99.904%。在恰好两个接收者的情况下,相同的受控工作负载本会产生 50,010 个未合并的接收者发送;MekDefender 发送了 48 个,对于该固定测试拓扑也是 99.904% 的减少。结果证明了在重复性高的网络工作负载下的优化路径;这不是普遍的减少保证。实际生产节省取决于更新重复性、配置的间隔、跟踪玩家和实际的机器/网络活动。使用上面的真实客户端 A/B 命令来测量特定服务器。
构建和测试
需要 JDK 21:
./gradlew test build integrationTestJar
发布工件是 build/libs/mekdefender-1.2.0.jar。
mekdefender-1.2.0-integration-test.jar 是一个独立的可丢弃世界测试变体,从不包含在发布 JAR 中。
构建从 ModMaven 下载 mekanism:Mekanism:1.21.1-10.7.19.85 作为可复现的编译/测试基线。该工件不限制运行时兼容性,Mekanism 不捆绑在 MekDefender 中。开发服务器运行还需要在 run/mods/ 中有正在测试的 Mekanism 构建。
属性门控测试框架:
-Dmekdefender.integrationTest=true:所有者在线/离线、能量和登录恢复;-Dmekdefender.syncIntegrationTest=true:双 FakePlayer Mek 同步调度器压力测试。
兼容性
- Minecraft 1.21.1
- NeoForge 21.1.194 或 1.21.1 系列中的更新版本
- 保留所需 Mixin 契约的 Minecraft 1.21.1 的 Mekanism 构建
- Java 21
共享兼容性插件仅检查由区块加载和同步 Mixin 转换的方法、字段和调用点。无关的 Mekanism 字节码变更保持兼容。兼容性按功能报告:缺失转换契约仅禁用该功能并使其保持直通行为。参考构建使用 Mekanism 10.7.19.85 测试,并不仅在 Youer,还在纯 NeoForge 21.1.241 开发服务器中进行了冒烟测试;正式生产验收仍需要发布 JAR 和在代表性负载下的真实客户端。
正在加载版本记录…
正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。