混淆订阅操作的 AsyncAPI AMQP 绑定
Confusion on AsyncAPI AMQP binding for subscribe operation
我有一个在交换器上发布 rabbitmq 消息的服务器,所以我尝试为此创建以下异步 api 规范 -
asyncapi: 2.3.0
info:
title: Hello World
version: 1.0.0
description: Get Hello World Messages
contact: {}
servers:
local:
url: amqp://rabbitmq
description: RabbitMQ
protocol: amqp
protocolVersion: 0.9.1
defaultContentType: application/json
channels:
hellow_world:
subscribe:
operationId: HelloWorldSubscriber
description:
message:
$ref: '#/components/messages/HellowWorldEvent'
bindings:
amqp:
ack: true
cc: ["hello_world_routing_key"]
bindingVersion: 0.2.0
bindings:
amqp:
is: routingKey
exchange:
name: hello_world_exchange
type: direct
durable: true
vhost: /
bindingVersion: 0.2.0
components:
messages:
HellowWorldEvent:
payload:
type: object
properties: []
根据我的理解,这意味着 MyApp 将使用路由密钥 hello_world_routing_key
在 hello_world_exchange
交换上发布 helloworldevent 消息
问题-
- consumer/subscriber 如何定义他将使用哪个队列来使用此消息?
- 我是否需要为订户定义新模式并在那里定义队列元素?
- 我可以在通道元素中定义另一个queue.**元素,但是那只能指定1个队列元素,如果超过1个怎么办subscriber/consumer,那么我们如何为它们指定不同的队列?
我看到您尚未批准任何回复作为解决方案。这仍然是一个问题吗?您是否使用 AsyncAPI 生成器生成代码存根?
如果是这样,生成器会创建一个 consumer/subscriber。如果您想要不同的 processing/business 逻辑,您将生成新的存根并配置它们监听的队列。队列是一个实现细节。我遇到了 AMQP 和 RabbitMQ 的 node.js 生成器的问题,所以我决定根据 Python 测试规范,看看是我还是生成器。
试试生成器,你可以试试我的要点:https://gist.github.com/adrianvolpe/27e9f02187c5b31247aaf947fa4a7360。我确实为 2.2.0 版做了这个,所以希望它对你有用。
我还用 Python 鼠兔库进行了测试,但是我没有为队列分配绑定。
我注意到在上面的规范中您将交换类型设置为直接。您可以通过直接和主题交换与多个消费者进行相同的绑定,但是您可能需要从 RabbitMQ 文档中引用的主题:
https://www.rabbitmq.com/tutorials/tutorial-five-python.html
Topic exchange is powerful and can behave like other exchanges.
When a queue is bound with "#" (hash) binding key - it will receive all the messages, regardless of the routing key - like in fanout exchange.
When special characters "*" (star) and "#" (hash) aren't used in bindings, the topic exchange will behave just like a direct one.
祝你好运!
我有一个在交换器上发布 rabbitmq 消息的服务器,所以我尝试为此创建以下异步 api 规范 -
asyncapi: 2.3.0
info:
title: Hello World
version: 1.0.0
description: Get Hello World Messages
contact: {}
servers:
local:
url: amqp://rabbitmq
description: RabbitMQ
protocol: amqp
protocolVersion: 0.9.1
defaultContentType: application/json
channels:
hellow_world:
subscribe:
operationId: HelloWorldSubscriber
description:
message:
$ref: '#/components/messages/HellowWorldEvent'
bindings:
amqp:
ack: true
cc: ["hello_world_routing_key"]
bindingVersion: 0.2.0
bindings:
amqp:
is: routingKey
exchange:
name: hello_world_exchange
type: direct
durable: true
vhost: /
bindingVersion: 0.2.0
components:
messages:
HellowWorldEvent:
payload:
type: object
properties: []
根据我的理解,这意味着 MyApp 将使用路由密钥 hello_world_routing_key
hello_world_exchange
交换上发布 helloworldevent 消息
问题-
- consumer/subscriber 如何定义他将使用哪个队列来使用此消息?
- 我是否需要为订户定义新模式并在那里定义队列元素?
- 我可以在通道元素中定义另一个queue.**元素,但是那只能指定1个队列元素,如果超过1个怎么办subscriber/consumer,那么我们如何为它们指定不同的队列?
我看到您尚未批准任何回复作为解决方案。这仍然是一个问题吗?您是否使用 AsyncAPI 生成器生成代码存根?
如果是这样,生成器会创建一个 consumer/subscriber。如果您想要不同的 processing/business 逻辑,您将生成新的存根并配置它们监听的队列。队列是一个实现细节。我遇到了 AMQP 和 RabbitMQ 的 node.js 生成器的问题,所以我决定根据 Python 测试规范,看看是我还是生成器。
试试生成器,你可以试试我的要点:https://gist.github.com/adrianvolpe/27e9f02187c5b31247aaf947fa4a7360。我确实为 2.2.0 版做了这个,所以希望它对你有用。
我还用 Python 鼠兔库进行了测试,但是我没有为队列分配绑定。
我注意到在上面的规范中您将交换类型设置为直接。您可以通过直接和主题交换与多个消费者进行相同的绑定,但是您可能需要从 RabbitMQ 文档中引用的主题:
https://www.rabbitmq.com/tutorials/tutorial-five-python.html
Topic exchange is powerful and can behave like other exchanges.
When a queue is bound with "#" (hash) binding key - it will receive all the messages, regardless of the routing key - like in fanout exchange.
When special characters "*" (star) and "#" (hash) aren't used in bindings, the topic exchange will behave just like a direct one.
祝你好运!