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:bounded(默认 1024,可覆写)邮箱 + 专用
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:唯一观测通道;宿主零日志);邻居插件毫发无损。 - 背压可观:邮箱满即丢弃计数(节流 stderr 提示;结构化事实
mail_stats()随时可查)。 - 五步关停:卸 forwarder →
on_stop→ 关邮箱 → worker 排空 → join(带超时,超时告警绝不硬等)。
示例
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)按串行使用设计。
元信息
- crate:
ek-core 0.2.0(edition 2024,rust-version = 1.85) - 依赖:
ek-event = "0.1.0"(crates.io)+crossbeam-channel(邮箱/总线同源) - 仓库:https://cnb.cool/enkeep/ek-core
- License:MIT(见 LICENSE.txt)
设计文档:DESIGN.md;验收细节:TESTPLAN.md;版本变更:CHANGELOG.md。