注:资料收集自网络与官方网站
1、RabbitMQ的整体架构与名词介绍:
2、RabbitMQ的四种Exchange(摘自官网)
Direct exchange(单一传播交换机)
direct exchange根据消息的routing key来传送消息。direct exchange是单一传播路由消息的最佳选择(尽管它们也可以用于多路传播路由),以下是它们的工作原理:
- 一个routing key为K的queue与exchange进行绑定
- 当一条新的routing key为R的消息到达direct exchange时,如果K=R,exchange 将它路由至该queue
direct exchange经常用于在多个工作者(同一应用程序的多个实例)之间分配任务。direct exchange可以用图形方式表示如下:
图源:官网
图源:网络
Fanout exchange(广播交换机)
fanout exchange路由消息到所有的与其绑定的queue中,忽略routing key。如果N个queue被绑定到一个fanout exchange,当一条新消息被发布到exchange时,消息会被复制并且传送到这N个queue。fanout exchange是广播路由的最佳选择。因为一个fanout exchange传送消息的副本到每一个与其绑定的queue,它的使用情况很相似:
- 大量的多用户在线(multi-player online MMO)游戏使用它更新排行榜或者其他的全体事件
- 体育新闻网站使用fanout exchange向手机客户端实时发送比分更新
- 分布式系统可以广播各种状态与配置更新
- 群聊可以使用fanout exchange让消息在参与者之间传输
一个fanout exchange图形化的表述如下:
图源:官网
图源:网络
Topic exchange(多路广播交换机)
Topic exchange路由消息到一个或者多个queue,基于消息的routing key和queue与exchange之间的绑定模式的匹配。Topic exchange经常被用于实现各种发布/订阅模式的变化。Topic exchanges通常被用于多路广播路由消息。
Topic exchange有非常多的应用场景。当一个问题牵涉到多个consumer/应用程序,他们有选择的选择他们接收何种何种类型的消息。可以考虑使用topic exchange。
使用示例:
- 销售与特定地理位置相关的数据,比如销售点
- 由多个工作者完成的后台任务处理,每个都能够负责处理指定的任务
- 库存价格更新(更新其他的财务数据)
- 包含分类与标签的新闻更新(例如只针对某一个特定的运动或团队)
- 不同种类的云服务编制 u 分布式结构/特定操作系统软件的构建与包装,每个处理者只能处理一个结构或者系统
一个topic exchange图形化的表述如下:
图源:网络
Headers exchange(首部交换机)
header exchange为在多个属性进行路由而设计的,这些属性更适合描述为消息头,而不是routing key。headers exchanges忽略routing key属性,相反用于路由的属性是从headers属性中获取的。如果消息头的值等于指定的绑定值,则认为消息是匹配的。
可以使用多个header匹配将一个queue绑定到header exchange。在这种情况下,broker需要从应用程序开发者那边获取多条信息,也就是说,是否应该考虑任何headers匹配的消息,还是所有headers都匹配的消息?这就是所谓的“x-match”绑定参数。当“x-match”参数的值被设为“any”,只要一个匹配的header值就足够了。相反的,设置“x-match”的值为“all”需要所有的headers值匹配。
Headers exchanges被视为“direct exchanges on steroids”。因为其依据headers值路由消息,可以被当做direct exchanges使用,routing key不必是一个字符串;举例来说它可以是一个整数或者一个hash(dictionary)
Default exchange(默认交换机)
default exchange是一个没有名称的(空字符串)被broker预先申明的direct exchange。它所拥有的一个特殊属性使它对于简单的应用程序很有作用:每个创建的queue会与它自动绑定,使用queue名称作为routing key。
举例说,当你申明一个名称为“search-indexing-online”的queue时,AMQP broker使用“search-indexing-online”作为routing key将它绑定到default exchange。因此,一条被发布到 default exchange并且routing key为"search-indexing-online"将被路由到名称为"search-indexing-online"的queue。换句话说,default exchange使直接传送消息到queue成为可能,即使从技术角度上而言,事实并不是这样。