rabbitmq 订阅操作的AsyncAPI AMQP绑定混淆

wecizke3  于 2022-11-08  发布在  RabbitMQ
关注(0)|答案(1)|浏览(148)

我有一个服务器,它在一个交换机上发布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_keyhello_world_exchange交换上发布helloworldevent消息

问题-

  • 使用者/订阅者如何定义将使用哪个队列来使用此消息?
  • 我是否需要为订阅者定义新模式并在其中定义队列元素?
  • 我可以在channel元素中定义另一个queue.**元素,但只能指定1个queue元素,如果有多个订阅者/消费者,那么我们如何为它们指定不同的队列呢?

参考值-https://github.com/asyncapi/bindings/tree/master/amqp

mm5n2pyu

mm5n2pyu1#

我发现您还没有批准任何响应作为解决方案。这仍然是一个问题吗?您是否使用AsyncAPI生成器来生成代码存根?
如果是这样的话,生成器会创建一个消费者/订阅者。如果你想要不同的处理/业务逻辑,你会生成新的存根,并配置它们监听的队列。队列是一个实现细节。我在AMQP和RabbitMQ的node.js生成器上遇到了一个问题,所以我决定用Python测试这个规范,看看是我还是生成器。
试试发电机,你可以试试我的要点:https://gist.github.com/adrianvolpe/27e9f02187c5b31247aaf947fa4a7360。我确实为版本2.2.0做了这个,所以希望它对你有用。
我还用Python pika库做了一个测试,但是我没有给队列分配绑定。
我注意到在上面的规范中,您将交换类型设置为Direct。您可以使用Direct和Topic交换与多个消费者进行相同的绑定,但是您可能希望使用RabbitMQ文档中引用的Topic:
https://www.rabbitmq.com/tutorials/tutorial-five-python.html
主题交换是强大的,可以像其他交换一样。
当队列与“#”(散列)绑定键绑定时-它将接收所有消息,而不管路由键如何-就像扇出交换中一样。
当绑定中没有使用特殊字符“*”(星号)和“#”(散列)时,主题交换的行为就像直接交换一样。
祝你好运!

相关问题