rabbitmq:
  #rabbitmq的ip
  host: ip
  username: guest
  password: guest
  #虚拟主机
  virtual-host: /
  #端口
  port: 5672
  listener:
    simple:
      #消费者的最小数量
      concurrency: 10
      #消费者的最大数量
      max-concurrency: 10
      #限制消费者,每次只能处理一条消息,处理完才能继续下一条消息
      prefetch: 1
      #启动时,是否默认启动容器,默认true
      auto-startup: true
      #被拒绝后,重新进入队列
      default-requeue-rejected: true
  template:
    retry:
      #启用重试机制,默认false
      enabled: true
      #设置初始化的重试时间间隔
      initial-interval: 1000ms
      #重试最大次数,默认是3
      max-attempts: 3
      #重试最大时间间隔,默认是10s
      max-interval: 10000ms
      #重试时间间隔的乘数
      #比如配置是2 :第1次等 1s, 第2次等 2s,第3次等 4s..
      #比如配置是1 :第1次等 1s, 第2次等 1s,第3次等 1s..
      multiplier: 1

fanout

Direct模式

topic模式

Headers模式

(也称为消息头模式)是消息队列中的一种路由机制,特别是在AMQP协议(如RabbitMQ)中,提供了一种更灵活的消息路由方式。与常见的Direct模式Topic模式不同,Headers模式基于消息的**头信息(headers)**来决定消息的路由,而不是基于消息的路由键。

Headers模式的基本概念

在Headers模式下,消息的路由不是通过路由键(Routing Key)来匹配的,而是通过消息头(Headers)中的键值对来进行路由。消息发送到交换机时,交换机会根据队列绑定时指定的header匹配条件来决定是否将消息路由到某个队列。

如何使用Headers模式:

  • 消息头:每条消息都有一个头部(headers),它是一个包含键值对的字典(类似于HTTP头部)。这些键值对可以包含任何信息。

  • 交换机:在Headers模式中,交换机根据消息头中的键值对来决定消息是否应该被路由到队列。

  • 队列绑定:队列通过特定的头信息来与交换机绑定,只有当消息的头部匹配队列绑定的条件时,消息才会被路由到该队列。

Headers模式的工作原理

  1. 交换机:消息首先被发送到一个类型为headers的交换机。这个交换机根据绑定队列时指定的头信息条件来决定如何路由消息。

  2. 队列绑定:队列与交换机通过一组头部匹配条件进行绑定。可以指定具体的,也可以指定,或者使用通配符来进行匹配。

  3. 路由规则:交换机会根据消息的头部信息和队列的绑定条件来决定是否将消息路由到队列。如果条件匹配,消息将被传递给队列;如果不匹配,消息将被丢弃或转发到其它符合条件的队列。

使用Headers模式的优缺点

优点

  • 灵活性高:Headers模式比传统的路由键(如Direct模式或Topic模式)更灵活,因为你可以根据多个不同的头信息来路由消息。

  • 无需路由键:不需要通过路由键来匹配消息,因此适用于一些复杂的消息路由场景,尤其是当路由逻辑不能简单地通过一个键值来表达时。

  • 多条件匹配:可以根据多个消息头字段进行匹配,支持更多复杂的路由需求。

缺点

  • 效率较低:相比其他路由模式(如Direct或Topic模式),Headers模式的效率通常较低,因为匹配条件可以非常复杂,交换机需要检查多个头部字段。

  • 可读性差:对于开发人员来说,使用Headers模式可能不如路由键直观和易于理解,尤其是在消息头信息较多的情况下,可能增加调试和维护的复杂度。

示例:

假设我们有一个系统,它处理来自不同国家的订单,并且需要根据订单类型国家来路由消息。我们可以使用Headers模式来实现。

  1. 队列:有两个队列,一个用于美国订单,一个用于中国订单。

    • queue_us_orders

    • queue_cn_orders

  2. 交换机:我们使用一个headers类型的交换机,比如orders_exchange

  3. 消息头:发送的消息头部可能包含类似以下的键值对:

    • country: "US" 或 "CN"

    • order_type: "electronics" 或 "clothing"

  4. 队列绑定:队列根据消息头来进行绑定,假设绑定条件如下:

    • queue_us_orders绑定到交换机orders_exchange,匹配country="US"的消息。

    • queue_cn_orders绑定到交换机orders_exchange,匹配country="CN"的消息。

  5. 发送消息:当发送一条消息时,假设它的头部包含:

    json复制代码{
        "country": "US",
        "order_type": "electronics"
    }
    

    由于country字段为"US",消息会被路由到queue_us_orders队列。

总结

  • Headers模式通过消息头部中的键值对来路由消息,而不是使用路由键(Routing Key)。

  • 它提供了比Direct和Topic模式更高的灵活性,可以根据多个头信息来决定消息路由。

  • 尽管功能强大,但它的性能相对较低,并且可能在某些场景下不如其他路由模式直观和易用。

Headers模式适用于需要基于多个条件进行复杂路由的场景,但通常需要权衡性能和灵活性。