wasmcloud Lattice(NATS) 通信协议总结

背景

借助 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 用于标记请求已处理。这些结构定义可以被不用的语言来实现,这里列出两个参考库:

下面列出 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