RabbitMQ总结-交换机

643 阅读3分钟

这是我参与8月更文挑战的第29天,活动详情查看:8月更文挑战

交换机与绑定

消息如何从生产者到队列?

生产者发送消息到交换机,队列通过确定的规则(路由键)和交换机进行绑定,将交换机中的消息发送到队列中。

消息传达到交换机后,根据交换机绑定使用的路由键找到匹配的队列,如果没有匹配的,就进入黑洞。

交换机类型

  • 直连交换机:direct

    • 根据routingKey将消息发送完全匹配的队列上
    • 服务器必须实现direct交换机,包含一个空白名称的默认交换器,当声明一个队列时,会自动绑定到默认交换器并设置路由键为队列名。
    • 第一个参数为消息内容,第二个参数为指定迷人交换器(空白字符串),第三个参数为路由键

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/413ec74026164d778b1f5422dbaaf2ff~tplv-k3u1fbpfcp-zoom-1.image

  • 扇形交换机:fanout

    • 将发送到该交换机的所有消息发送到所有绑定的队列上,类似广播
    • 转发速度是最快的
    • 不需要RouteKey,需要提前将交换机和队列绑定,一个exchange可以绑定多个queue,一个queue可以绑定多个exchange
    • 如果exchange没有绑定queue,消息会被自动抛弃。

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/39747f73774d49fa892487241ed3b2ac~tplv-k3u1fbpfcp-zoom-1.image

  • 主题交换机:topic

    • 也是和RoutingKey匹配,但是配置规则有些不同。交换机和队列的binding_key需要采用*.#.*…的格式,每个部分用.分开

      • 表示一个单词
      • #表示任意数量(零个或多个)单词。

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b2102b18480f49e6a9c87549a7e9e964~tplv-k3u1fbpfcp-zoom-1.image

  • 首部交换机:headers

    • 不依靠routingKey,根据消息中的header属性进行匹配

虚拟主机

vhost相当于mini的RabbitMQ服务器,拥有自己的队列,交换机,绑定,还拥有自己的权限机制。vhost之间相互隔离,保证了安全行和可移植性(不同的vhost的队列,交换机可以重名)。

vhost在信道连接时必须指定,默认是vhost:"/" 。在Rabbit创建用户时,会指派至少一个vhost给用户,用户只能访问被指派的vhost内的队列,绑定和交换机。RabbitMQ急群众创建一个vhost,所有RabbitMQ主机都会创建。

持久化

重启RabbitMQ服务器,里面的队列,交换机连同消息一起消失。将队列,交换机的durable属性设置为true,就会在重启后重新创建该队列和交换机(持久化交换机和持久化队列)。

想要持久化消息:

  • 将投递模式选项设置为2,来将消息标记为持久化(消息的状态是持久化的)

  • 消息非发布到持久化的交换机和到达持久化的队列中(进入持久化容器)

  • RabbitMQ持久化机制

    持久化消息发布到持久化交换机,将消息写到日志文件后,然后返回响应。如果这条消息发送到了非持久话的队列,那么就会从日志文件中删除。当消费了持久化队列中的持久化消息,日志文件中就会将消息标记为待垃圾回收。

    持久化消息通信会付出性能降低的代价