消息信封
消息是PluginMessage,由 Protobuf 契约定义:
目标接收
PluginMessageReply:
内核不会解析
topic、payload 或 message。请在参与的插件之间定义它们的格式。
您可以使用 JSON、Protobuf、文本或其他编码,但发送方和目标必须就此达成一致。
发送消息
要发送消息:- 选择目标插件的注册名称;
- 选择一个稳定的主题名称;
- 将请求编码为
payload;以及 - 通过为后端生成的主机绑定发送信封。
message 值。
源插件无法选择或覆盖其身份;内核会将 source 字段替换为调用插件的已验证名称。
接收消息
目标插件收到相同的信封,包括内核提供的source。它应该:
- 验证源插件是否有权请求此操作;
- 按
topic路由消息; - 解码并验证
payload;以及 - 返回结果或错误。
错误和传递
消息仅传递给当前正在运行的目标插件。发送失败的情况包括:target为空;- 目标插件未运行;
- 目标处理程序返回传输或执行错误;或
- 目标回复包含非空的
error字段。
error 值将作为错误返回给发送方。当目标不可用时,消息不会
传递给其他插件。
消息不会被排队、重试、广播或持久化。没有持久传递保证。
如果目标在消息传输过程中停止,调用上下文将随着目标插件的生命周期结束而被取消。
后端行为
两种插件后端的消息语义相同:- WASM 插件通过生成的主机绑定发送消息;并且
- gRPC 插件通过内核的主机回调通道发送请求。
身份和授权
内核在主机边界对源插件进行身份验证。 插件不能通过在发送请求中写入不同的source 值来冒充其他插件。
没有针对单个主题的内核级访问策略。任何正在运行的插件都可以通过名称寻址其他正在运行的插件,
因此,当主题或有效负载表示特权操作时,目标插件必须在其自身的处理程序中强制执行授权。
将 topic 视为路由信息,而不是访问控制机制。