背景
借助 Lattice,我们可以很方便的部署一个 mesh 网络,并且这个网络具备自发现、自愈的能力。本文主要根据官方文档,罗列了 wasmcloud 系统中各模块用于交互的通信协议,通过跟踪这些对应的消息,更便于我们梳理 wasmcloud 的工作机制。
监听 nats-server 消息
使用 verbose 模式启动 nats-server,可以很方便监听其消息交互情况:
1 | nats-server -js -p 4222 -m 8222 -V -l nats.log |
更多用法请参阅 https://docs.nats.io/running-a-nats-service/configuration/logging
Lattice Protocols
Topic 一览
Topic | 说明 |
---|---|
wasmbus.rpc.{namespace}.{actor public key} | actor 订阅的 topic,用于 RPC 通信 |
wasmbus.rpc.{namespace}.{provider public key}.{provider link name} | provider 订阅的 topic,用于 RPC 通信 |
wasmbus.rpc.{prefix}.{public_key}.{link_name}.linkdefs.put | provider 订阅 put linkdef |
wasmbus.rpc.{prefix}.{public_key}.{link_name}.linkdefs.del | provider 订阅 del linkedf |
wasmbus.rpc.{prefix}.{public_key}.{link_name}.health | provider 订阅 health |
wasmbus.ctl.{namespace}.auction.provider | 调度 provider |
wasmbus.ctl.{namespace}.auction.actor | 调度 actor |
wasmbus.ctl.{namespace}.cmd.{host}.la | Launch Actor |
wasmbus.ctl.{namespace}.cmd.{host}.sa | Stop Actor |
wasmbus.ctl.{namespace}.cmd.{host}.scale | 扩缩容 actor 的实例个数 |
wasmbus.ctl.{namespace}.cmd.{host}.lp | Launch Provider |
wasmbus.ctl.{namespace}.cmd.{host}.sp | Stop Provider |
wasmbus.ctl.{namespace}.cmd.{host}.upd | 热更新 Actor |
wasmbus.ctl.{namespace}.get.links | Get links |
wasmbus.ctl.{namespace}.get.claims | Get claims |
wasmbus.ctl.{namespace}.get.{host}.inv | 获取指定 Host 下的 inventory |
wasmbus.ctl.{namespace}.linkdefs.put | put link def |
wasmbus.ctl.{namespace}.linkdefs.del | del link def |
wasmbus.ctl.{namespace}.ping.hosts | ping pong 检查 |
wasmbus.evt.{prefix} | Lattice events,满足 cloud event 规范 |
RPC
Lattice 是建立在 NATS message broker 之上的 RPC 总线层,支持以下的交互模型
- Actor-to-Actor
- Actor-to-Provider
- Provider-to-Actor
处于安全原因,RPC 的 NATS 链接和接下来要介绍的 control interface 链接是分开的。并且所有的请求和回复,使用 message pack 来序列化。
https://msgpack.org/index.html
Invocation 结构体
所有的 RPC 通信,发送 Invocation
,接收 InvocationResponse
。及时是不关注返回结果的请求,也会返回 InvocationResponse 用于标记请求已处理。这些结构定义可以被不用的语言来实现,这里列出两个参考库:
- Smithy 结构体定义。https://github.com/wasmCloud/interfaces/blob/main/core/wasmcloud-core.smithy#L143
- wasmhost 的 rust 实现。https://github.com/wasmCloud/wasmcloud-otp/blob/main/host_core/native/hostcore_wasmcloud_native/src/inv.rs#L23
下面列出 Invocation
各字段含义
Field | Type | Description |
---|---|---|
id | String(GUID) | Invocation ID。返回体里面也会携带该 ID 用于校验。 |
origin | WasmCloudEntity | 发送方 |
target | WasmCloudEntity | 接收方 |
operation | String | 此次操作的字符串表示,比如:HttpServer.HandleRequest |
msg | Bytes | 消息的原生字节表示 |
encoded_claims | String | 包含 claims 信息的 jwt 表示。claims 还包含了该 invocation 的 hash |
host_id | String | 发起 invocation 的 host 的 public key |
其中 WasmCloudEntity
定义如下
Field | Type | Description |
---|---|---|
public_key | String | Entity 的 public key。 M 开头表示 actors, V 开头表示 providers。 |
contract_id | String | entity 的 contract ID。如果是 actor 则留空 |
link_name | String | Entity 的 link name,如果是 actor 则留空 |
Actor subscriptions
Hosts 中所有的 Actors(已连接到 lattice 的)使用 queue subscribe。通过这种方式 NATS 会随机选择一个订阅者来消费。借助该模式,wasmcloud 实现了 actor 的水平扩容。
所有的 actor 会订阅下面的 topic:
**wasmbus.rpc.{namespace}.{actor public key}**
比如,在默认的 namespace 前缀下,wasmcloud 官方的 echo 示例,会订阅下面的 topic: wasmbus.rpc.default.MBCFOPM6JW2APJLXJD3Z5O4CN7CPYJ2B4FTKLJUR5YR5MITIU7HD3WD5
Capability provider subscriptions
Provider 采取和 actor 相同的 queue subscribe 方式,来处理从 link actor 发起的 invocations。其 topic 如下:
**wasmbus.rpc.{namespace}.{provider public key}.{provider link name}**
比如我们使用了 backend linkname 和 prod 的 namespace,其订阅的 topic 为 wasmbus.rpc.prod.VADNMSIML2XGO2X4TPIONTIC55R2UUQGPPDZPAVSC2QD7E76CR77SPW7.backend
Additional topics
Provider 还需要处理 link 的添加和删除。订阅了下面的事件
wasmbus.rpc.{prefix}.{public_key}.{link_name}.linkdefs.put
wasmbus.rpc.{prefix}.{public_key}.{link_name}.linkdefs.del
最后,provider 还需要订阅健康检查的 topic。如果 provider 没有正确回复这个 topic,会被标记为不健康:
wasmbus.rpc.{prefix}.{public_key}.{link_name}.health
Control interface
Lattice control interface 是一个 message broker protocol。通过和 lattice control interface 进行交互,clients 可以处理或查询下面的信息:
- Actor 的启动和停止(start and stop actors)
- Provider 的启动和停止(start and stop providers)
- 声明 link 定义(declare link definitions)
- 监听 lattice 事件(monitor lattice events)
- 调度(holding auctions to determine scheduling compatibility)
NATS control interface
所有的 control interface 消息,发布在 wasmbus.ctl.{namespace}
为前缀的 NATS Topic 上。其中,namespace 用来却分不同的 lattice。
注意:所有的前缀不能包含
/
或.
或>
,这些对 NATS message broker 而言有特殊含义。
具体的控制结构体,可参考 smithy IDL 定义 https://wasmcloud.github.io/interfaces/html/org_wasmcloud_interface_control.html
注:
*Sub
只订阅,不发布。(Subscribe only)**Req
表示包含回复的 Request。注意这里虽然有回复,但是不代表操作已经完整结束。比如在 Start actor 时,会收到验证的 host 发起的 ack,但是不代表操作已完成。**Coll
收集(或分散收集)。每隔一段时间定期收集结果*
Lattice Events
Events 被发布到 wasmbus.evt.{prefix}
前缀的 stream 上,事件的标准采用 cloudEvent 规范。
https://github.com/cloudevents/spec/blob/v1.0.1/spec.md
附录
名称 | 作用 | 网址 |
---|---|---|
msgpack | RPC通信数据序列化 | https://msgpack.org/index.html |
cloud event | 系统重出现的事件,采用的格式标准 | https://github.com/cloudevents/spec/blob/v1.0.1/spec.md |
nats log | NATS 的日志使用 | https://docs.nats.io/running-a-nats-service/configuration/logging |