Skip to content

通訊協定 binding

AsyncAPI 用 Bindings Object 描述特定通訊協定的設定。規格把它放在四種物件上:server、channel、operation 與 message。該物件的每一個成員各代表一個通訊協定,例如 kafka

本 library 為十三個通訊協定提供 decorator:Kafka、WebSocket、MQTT、HTTP、AMQP、NATS、Pulsar、Google Cloud Pub/Sub、Amazon SQS、Anypoint MQ、JMS、IBM MQ 與 Solace。另外提供通用的 @binding,供 AsyncAPI 保留但未定義欄位的那些名稱使用。

一個通訊協定在一個物件上只佔一個成員。兩個 decorator 在同一個物件上宣告同一個成員是錯誤。emitter 不會合併兩份設定,後寫的那份也不會取代先寫的那份。

通訊協定一覽

通訊協定成員版本物件
Kafkakafka0.5.0server/channel/operation/message
WebSocketws0.1.0channel
MQTTmqtt0.2.0server/operation/message
HTTPhttp0.3.0operation/message
AMQP 0-9-1amqp0.3.0channel/operation/message
NATSnats0.1.0operation
Pulsarpulsar0.1.0server/channel
Google Cloud Pub/Subgooglepubsub0.2.0channel/message
Amazon SQSsqs0.2.0channel/operation
Anypoint MQanypointmq0.0.1channel/message
JMSjms0.0.1server/channel/message
IBM MQibmmq0.1.0server/channel/message
Solacesolace0.4.0server/operation

@binding

typespec
extern dec binding(target: unknown, protocol: valueof string, config: valueof unknown);

在 target 產生的物件上加入一個原樣的 binding。用於新版 binding 才加入的欄位,以及下方那三個沒有欄位的通訊協定。

WARNING

Bindings Object 的成員名稱是封閉清單。AsyncAPI 逐一列出它認得的通訊協定,其他名稱會被 parser 以「Property '<name>' is not expected to be here」拒絕。所以 @binding("mycorp", ...) 會產生一份無法通過驗證的文件。

要放自訂的通訊協定,名稱請以 x- 開頭。那是規格擴充機制,parser 在任何位置都接受。

設定內容原樣輸出。這個 decorator 不加 bindingVersion。它不解讀設定的形狀,因此無法判斷欄位屬於哪一版。通訊協定需要該欄位時,自行寫進設定裡。

typespec
@binding("mqtt", #{ qos: 2, retain: true })
@channel("orders.created")
interface OrderChannel {
  @send
  op publish(event: OrderCreated): void;
}
yaml
channels:
  orders.created:
    address: orders.created
    bindings:
      mqtt:
        qos: 2
        retain: true

target 是 unknown,因為四個位置都可能是目標。這個 decorator 不指定層級。binding 會落在 target 所產生的物件上。

WARNING

一個 namespace 可以同時是 service namespace 與 channel 的目標。此時 @binding 會同時進入 server 與 channel。若只想指定其中一個,改用專屬的 decorator。

沒有具名 decorator 的通訊協定

AsyncAPI 另外保留五個成員名稱。本 library 不為它們提供 decorator,理由有兩個。

amqp1redisstomp 會被 AsyncAPI parser 接受,而三者都沒有任何欄位。具名 decorator 沒有東西可以驗證,也沒有版本可以寫,所以 @binding("redis", #{}) 已經說完它們能說的全部。

mercuremqtt5ros2 在 AsyncAPI 3.0 文件的四個層級都會被 AsyncAPI parser 拒絕。帶有這些成員的文件無法通過驗證,所以本 library 既不提供 decorator,也不建議用通用機制產生它們。

跨物件的規則

WARNING

有四個 Kafka 欄位需要 schema registry。registry 的網址在 server binding 上。Kafka binding 規格說明,沒有 server 層級的 schemaRegistryUrl 時,不得使用下列欄位:

  • schemaRegistryVendor,在 server binding 上
  • schemaIdLocation,在 message binding 上
  • schemaIdPayloadEncoding,在 message binding 上
  • schemaLookupStrategy,在 message binding 上

emitter 不檢查這些規則。每一條都橫跨文件的兩個物件。使用上述任一欄位時,請在 service namespace 上設定 schemaRegistryUrl

binding 版本

每個具名 binding 都帶有它所依循的規格版本。emitter 一律寫入這個欄位,也無法透過 decorator 更改。各通訊協定的版本見上方的一覽表。

AsyncAPI 規定,欄位不存在時讀取端必須當成 latestlatest 的內容會隨時間改變,所以版本一律寫出。

@binding 完全不寫版本。需要版本時,自行加進設定裡。

診斷訊息

代碼嚴重度情境
duplicate-bindingerror同一個 target 的同一層級上,一個通訊協定被宣告兩次。
empty-binding-protocolerror@binding 的通訊協定名稱是空白。
invalid-binding-configerror@binding 的設定不是物件。
invalid-binding-fieldwarning某個 binding 欄位的值違反規格。
binding-outside-documentwarningbinding 所在的 target 不會產生對應的物件。
missing-binding-fielderrorbinding 沒有給規格要求的欄位。

invalid-binding-field 是 warning,因為 emitter 只丟掉那一個欄位。binding 的其餘欄位保留,文件也照常產出。其餘代碼是 error,因為它們各自丟掉整個 binding。缺少必填欄位的 binding 無法寫成合法文件,作者也就沒有任何殘留可以檢查。

完整清單見診斷訊息