RabbitMQ Exchange

RabbitMQ Exchange

AMQP简介

RabbitMQ是AMQP(高级消息队列协议)的标准实现。Queue、Exchange和Binding构成了AMQP协议的核心。

Producer:消息生产者,即传递消息的程序。
Broker:消息队列服务器实体。
	Exchange:消息交换机,指定消息按什么规则,路由到哪个队列。
	Binding:绑定,将Exchange和Queue按照路由规则绑定起来。
	Queue:消息队列载体,每个消息都会被投入到一个或多个队列。
Consumer:消息消费者,即接受消息的程序。	

Exchange简介

为什么需要Exchange而不是直接将消息发送到队列呢?

AMQP协议中的核心思想就是生产者和消费者的解耦。生产者从不直接将消息发送给队列,它通常不知道是否一个消息会被发送到队列中,只是将消息发送到一个交换机,先由Exchange来接收,然后Exchange按照特定的策略转发到Queue进行存储。Exchange就类似于一个交换机,将各个消息分发到对应的队列中。

在实际应用中,我们只需要定义好Exchange的路由策略,生产者不需要关心消息会发送到哪个Queue或被哪些Consumer消费。在这种模式下生产者只面向Exchange发布消息,消费者只面向Queue消费消息,Exchange定义了消费路由到Queue的规则,将各个层面的消息传递隔离开,使每一层只需要关心自己面向的下一层,降低了整体的耦合度。

理解Exchange

Exchange收到消息时,他是如何知道需要发送至哪些Queue呢?

Binding和RoutingKey概念

Binding表示Exchange与Queue之间的关系,可以简单的认为队列对该交换机上的消息感兴趣,绑定可以附带一个额外的参数RoutingKey。Exchange根据RoutingKey和当前Exchange所有绑定的Binding做匹配,满足匹配,就往Exchange所绑定的Queue发送消息,这样就解决了向Rabbit发送一次消息,就可以分发到不同的Queue。RoutingKey的意义依赖于交换机的类型。

Exchange三种类型

Fanout Exchange

忽略RoutingKey的设置,直接将Message广播到所有绑定的Queue中。

场景:

日志系统:定义Exchange来接收日志消息,同时定义了两个Queue来存储消息:一个记录将被打印到控制台的日志消息;一个记录将被写入到磁盘文件的日志消息。希望Exchange接收到的每一条消息都会被同时转发到两个Queue,就可以使用Fanout Exchange来广播消息到所有绑定的Queue。

Direct Exchange

Direct Exchange是RabbitMQ默认的Exchange,完全根据RoutingKey来路由消息。设置Exchange和Queue的Binging时需指定RoutingKey(一般为Queue Name),发消息时也指定一样的RoutingKey,消息就会被路由到对应的Queue。

场景

只把重要的日志消息写入到磁盘,只把Error级别的日志发送给负责写入磁盘文件的Queue。这种场景就可以使用指定的RoutingKey将写入磁盘文件的Queue绑定到Direct Exchange上。

Topic Exchange

Topic Exchange和Direct Exchange类似,也需要通过RoutigKey来路由消息,区别在于Direct Exchange对RoutingKey是精确匹配,而Topice Exchange支持模糊匹配。分别支持*和#通配符,*表示一个单词,#表示匹配没有或者多个单词。

场景

消息路由规则除了需要根据日志级别来分发之外还需要根据消息来源分发,可以将RoutingKey定义为消息来源·级别。eg:order·info、uesr·error等。处理所有来源为user的Queue就可以通过user.绑定到Topic Exchange上,处理所有日志级别为info的Queue可以通过·info绑定到Exchange上。

两种特殊的Exchange

Headers Exchange

Headers Exchage会忽略RoutingKey而根据消息中的Headers和创建绑定关系时指定的Arguments来匹配决定路由到哪些Queue。
Headers Exchange的性能比较差,而且Direct Exchange完全可以代替它,所以不建议使用。

Default Exchange

Default Exchange 是一种特殊的Direct Exchange。当你手动创建一个队列时,后台将自动将这个队列绑定到一个名称为空的Direct Exchange上,绑定RoutingKey与队列名称相同。有了这个默认的交换机和绑定,使我们只关系队列这一层即可,这个比较使用做一些简单的应用。

总结

在Exchange的基础上可以通过简单的配置绑定关系来灵活的使用消息路由,在简单的应用中也可以直接使用RabbitMQ提供的Default Exchage而无需关系Exchange和绑定关系。Direct Exchange、Topic Exchange、Fanout Exchange 三种类型的交换机的使用方式也很简单,容易掌握。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值