这是我参与8月更文挑战的第29天,活动详情查看:8月更文挑战
交换机与绑定
消息如何从生产者到队列?
生产者发送消息到交换机,队列通过确定的规则(路由键)和交换机进行绑定,将交换机中的消息发送到队列中。
消息传达到交换机后,根据交换机绑定使用的路由键找到匹配的队列,如果没有匹配的,就进入黑洞。
交换机类型
-
直连交换机:direct
- 根据routingKey将消息发送完全匹配的队列上
- 服务器必须实现direct交换机,包含一个空白名称的默认交换器,当声明一个队列时,会自动绑定到默认交换器并设置路由键为队列名。
- 第一个参数为消息内容,第二个参数为指定迷人交换器(空白字符串),第三个参数为路由键
-
扇形交换机:fanout
- 将发送到该交换机的所有消息发送到所有绑定的队列上,类似广播
- 转发速度是最快的
- 不需要RouteKey,需要提前将交换机和队列绑定,一个exchange可以绑定多个queue,一个queue可以绑定多个exchange
- 如果exchange没有绑定queue,消息会被自动抛弃。
-
主题交换机:topic
-
也是和RoutingKey匹配,但是配置规则有些不同。交换机和队列的binding_key需要采用*.#.*…的格式,每个部分用.分开
- 表示一个单词
- #表示任意数量(零个或多个)单词。
-
-
首部交换机:headers
- 不依靠routingKey,根据消息中的header属性进行匹配
虚拟主机
vhost相当于mini的RabbitMQ服务器,拥有自己的队列,交换机,绑定,还拥有自己的权限机制。vhost之间相互隔离,保证了安全行和可移植性(不同的vhost的队列,交换机可以重名)。
vhost在信道连接时必须指定,默认是vhost:"/" 。在Rabbit创建用户时,会指派至少一个vhost给用户,用户只能访问被指派的vhost内的队列,绑定和交换机。RabbitMQ急群众创建一个vhost,所有RabbitMQ主机都会创建。
持久化
重启RabbitMQ服务器,里面的队列,交换机连同消息一起消失。将队列,交换机的durable属性设置为true,就会在重启后重新创建该队列和交换机(持久化交换机和持久化队列)。
想要持久化消息:
-
将投递模式选项设置为2,来将消息标记为持久化(消息的状态是持久化的)
-
消息非发布到持久化的交换机和到达持久化的队列中(进入持久化容器)
-
RabbitMQ持久化机制
持久化消息发布到持久化交换机,将消息写到日志文件后,然后返回响应。如果这条消息发送到了非持久话的队列,那么就会从日志文件中删除。当消费了持久化队列中的持久化消息,日志文件中就会将消息标记为待垃圾回收。
持久化消息通信会付出性能降低的代价