ek-core
Actor-over-Bus 插件宿主。在已发布的 ek-event 事件底座之上,提供一套业务无关的插件框架:自由注册、能力发现、独立线程 actor、一次性请求应答、动态生命周期、故障熔断与五步关停。
设计立场:ek-core 不依赖任何业务;事件总线只转发、永不执行业务逻辑;插件之间不直调,一切通信走事件。宿主只有两个职责:登记簿 + 上下线吭声。
特性
- 注册自由(v0.2.0):
add_plugin只报名 + 自报服务目录,插件之间在注册期互不认识、任意顺序;deps()仅作可选排序提示(不声明=按注册序),悬空依赖由start()把关。 - 服务发现(0.2.0):插件自报
services()目录(服务 id / req-res 类型名 / doc / 超时提示);宿主只织入svc_id → 提供方纯路由索引,完整细节由ctx.services_of / find_service现场取(永远最新,零陈旧副本)。 - 按 id 请求:
ctx.ask_service::<Req, Res>(svc, req, timeout)—— 无人提供 → 立即UnknownService;Req 型别与声明不符 → 发出前InvalidPayload;ask::<Req,Res>(target, …)按注册名直呼照旧可用。 - 每插件一个 actor:无界(0.5.0:默认不丢)邮箱 + 专用
ek-worker.<name>线程,on_mail是插件唯一收信口,天然串行化。 - 动态生命周期(0.2.0):运行期可随时
add_plugin(同步装配即刻Running)与remove_plugin(五步关停 + 能力索引修剪);宿主广播ePlugUp / ePlugDown / eSrvChg(固定键 +.<名>后缀双发),订阅者据此迟绑定与失败转移。 - 目录改版(0.2.0):
ctx.publish_services(...)—— 插件目录随配置/状态演化(先换 services() 再申报,纪律见 DESIGN §3)。 - 版本元数据(0.2.0):
Plugin::version()(约定填 crate 版本);PluginInfo / ProviderRef全披露面携带;多提供方共享同一svc_id即天然主备/失败转移。 - 快失败请求:
ask失败面——目标不在(预检+断连,即时TargetGone)、等满(Timeout)、契约不匹配(InvalidPayload);handler panic 时回包信道关闭 → 发起方立即感知。 - 故障熔断:handler 连续 panic×3(处理成功即复位)→
Quarantined+ePlugQDown.<name>结构化广播(0.3.0:唯一观测通道;宿主零日志);邻居插件毫发无损。 - 背压可观(0.5.0 口径反转):邮箱无界 → 默认不丢;深度实时可查
(
mail_stats().pending当前积压 /peak历史峰值 /soft_cap该插件自己的软顶); 只有触到软顶(缺省 262144)才丢 —— 丢新帧 +spilled计数 + 节流 stderr。 无界 ≠ 无限:软顶就是"不丢"的兜底出口,目的是不让慢消费者把进程吃挂。 - 五步关停:卸 forwarder →
on_stop→ 关邮箱 → worker 排空 → join(带超时,超时告警绝不硬等)。 - 配置契约(0.4.0,additive):
section模块(SectionMap/Field/Configurable/ApplyReport)+Plugin::as_configurable(None= 「无配置面」,存量插件零改动零负担)。持久配置一律走Configurable+ ek-cfg 秘面,明面零秘值;操作见.dsh/skills/ek-plugin-dev.md。
示例
use ;
use ;
use Event;
use Cow;
use Duration;
use Arc;
// 业务契约类型(业务 crate 自备,ek-core 一无所知)
// 提供方:自报目录(细节住插件本身,宿主零复制)
// 消费方:on_init 自主发现(不认识提供方注册名,按服务 id 找)
纪律(协议层)
- 收:只有
on_mail一个入口;订阅面由routes()静态声明(运行期动态订阅不支持;生命周期广播已内置固定键可直接订)。 - 发:只有
ctx.put / ask / ask_service / notify / publish_services(0.3.0:宿主零日志,write_log出口移除;业务日志由插件自造载荷put,业务链上用 ek-data 的LogData到"eLog"键);ask/ask_service 禁止自呼(自己等自己的回包会等到超时)。 - 请求义务:
Envelope::handle成功回Ok(Res)、契约错型回Err(InvalidPayload);handler panic 由断连信号传达。 - 目录纪律:
services()必须纯/静态/无锁/不阻塞(A 型纪律),目录变更先改内容再publish_services。 - 宿主无业务方法;管理类操作(add/remove/start/close/remove)按串行使用设计。
写新插件? 不背历史文档,直接照 .dsh/skills/ek-plugin-dev.md 走:七条纪律 + 配置契约四接口 + restore 链 + 受理三行序 + 零明文红线 + 收工 checklist。钉清单单源在 ek-station
DESIGN.md§BD-CFG。
元信息
- crate:
ek-core 0.4.0(edition 2024,rust-version = 1.85) - 依赖:
ek-event = "0.1.2"(crates.io)+crossbeam-channel(邮箱/总线同源) - 插件开发指导:
.dsh/skills/ek-plugin-dev.md(skill 正源) - 仓库:https://cnb.cool/enkeep/ek-core
- License:MIT(见 LICENSE.txt)
设计文档:DESIGN.md;验收细节:TESTPLAN.md;版本变更:CHANGELOG.md。