Exchange
- 交换器或交换点。 消息被发送给它。 Exchange
分发消息 在一个或多个队列中。 他 将消息路由到队列 基于创建的链接(bindings
)在它和队列之间。
Exchange
不是 exchange
是嵌入式数据库中的一个字符串(带有路由逻辑所在代码的模块的链接)
目录
RabbitMQ。 第 1 部分:简介。 Erlang、AMQP 和 RPC RabbitMQ。 第 2 部分:了解交换 - RabbitMQ。 第 3 部分:了解队列和绑定
- RabbitMQ。 第 4 部分:处理消息和帧
- RabbitMQ。 第 5 部分:发布和消费消息性能
- RabbitMQ。 第 6 部分:Federation 和 Shovel 模块概述
- RabbitMQ。 第 7 部分. 有关 Connection 和 Chanel 的详细信息
- RabbitMQ。 第 8 部分..NET 中的 RabbitMQ
- RabbitMQ。 第 9 部分. 监控
直接交换
Direct exchange
- 需要时使用 将消息传递到特定队列。 该消息以特定的方式发布到交换器 路由键 并进入与具有相似路由键的该交换器关联的所有队列。 路由键是一个字符串。 匹配是使用完成的 检查字符串是否相等.
消息流的图形表示:
В rabbitmq
有一个概念 默认交换器。 它 direct exchange
无名。 如果使用默认交换器,则消息将被路由到名称等于的队列 消息路由密钥.
话题交流
Topic exchange
- 相似的 direct exchange
通过比较路由键来启用选择性路由。 但是,在这种情况下,给出了密钥 按图案。 创建模板时,使用 0
或更多单词(字母 AZ
и az
和数字 0-9
),用点分隔,以及符号 *
и #
.
*
- 可以完全替换为1
слово#
- 可以替换为0
或更多字
消息流的图形表示:
从版本开始 RabbitMQ 2.4.0
路由算法 topic exchange
开始工作直到 145
快几倍。 他们通过实施该方法实现了这一目标 a.b.c
, a.*.b.c
, a.#.c
и b.b.c
将由以下结构表示:
模式匹配是从根开始,从上到下进行搜索的。
产品特点:
- 使用该交换器可以成为 未来可能的应用程序开发的不错选择, 因为模板始终可以自定义,以便以类似的方式发布消息
direct exchange
илиfanout exchange
- 使用的模板
*
快多了比使用的模板#
. topic exchange
慢direct exchange
扇出交换
Fanout exchange
– 所有消息都传递到所有队列 即使消息中指定了路由密钥。
产品特点:
RabbitMQ
不适用于路由键和模板 这对性能有积极的影响。 这是最快的exchange
;- 所有消费者必须能够处理所有消息;
消息流的图形表示:
标题交换
Headers exchange
- 根据(键,值)属性对的比较将消息定向到相关队列 headers
绑定和类似的消息属性。 headers
它代表 Dictionary<ключ, значение>
.
如果你在字典中添加一个特殊的键 x-match
有意义 any
,如果(键,值)对部分匹配,则消息将被路由。 此行为类似于运算符 or
.
var bindingArguments = new Dictinary<String, Object>();
bindingArguments.add("x-match", "any");
默认键 x-match
包含一个值 all
。 这意味着当(键、值)对完全匹配时消息将被路由。 此行为类似于运算符 and
.
消息流的图形表示:
产品特点:
- 额外的灵活性
- 额外的计算开销。 属性的所有对(键、值)
headers
在计算消息路由值之前必须按键名称排序。 比其他类型的交换慢.
一致的哈希交换
这个交换器是 RabbitMQ
.
Consistent-hashing exchange
(哈希一致交换)- 当有多个队列是消息的潜在接收者并且需要在它们之间进行负载平衡时使用。 消息按权重(来自的条件字符串值)与队列关联 0 - n
).
队列的等效权重-表示每个队列都会收到 大约相同的数量 消息(每条消息将仅放入一个队列中)。 无法完全保证消息的均匀分布.
消息流的图形表示:
Hash
根据路由键或属性计算 headers
消息。 如果所有发布的消息都有不同的路由键,或者 headers
,那么将按权重进行分配。 否则,将使用路由密钥,或者 headers
.
当消费者吞吐量需要增长到高于多个消费者使用同一队列的解决方案时,应该会有所帮助。
交换机组合(E2E)
可以使用通信来组合所有交换器的行为 交易所到交易所 (交换器组合不包含在规格中 AMQP
。 这是侧面的协议扩展 RabbitMQ
).
消息流的图形表示:
通过 E2E
我们可以找到满足当前和不断增长的需求的正确可扩展配置。
创建交易所
交换器是使用同步创建的 RPC
向服务器请求。 使用该方法发出请求 Exchange.Declare
使用参数调用:
- 交换器名称
- 交换器类型
- 其他选择
创建示例 exchange
通过
//...
channel.ExchangeDeclare(
exchange: "my_exchange",
type: "direct",
durable: "false",
autoDelete: "false",
arguments: null
);
//...
exchange
- 我们要创建的交换器的名称。 名称必须是唯一的type
- 交换器类型durable
- 如果已安装true
,然后exchange
将是永久的。 它将存储在磁盘上,并且能够在服务器/代理重新启动后继续存在。 如果值false
,然后exchange
是临时的,当服务器/代理重新启动时将被删除autoDelete
- 自动删除。Exchange
当所有关联队列被删除时,该队列也会被删除arguments
是可选参数。 大多数情况下,通过参数集alternative exchange
(替代交换器)。 如果消息无法通过原始路由,则可以将其发送到备用交换机,以便沿着不同的路径进行路由。
如果创造 exchange
也许,然后服务器将向客户端发送同步 RPC
回答 Exchange.DeclareOk
。 如果创造 不可能 (请求被拒绝 Exchange.Declare
) 然后 通道将关闭 使用异步命令的服务器 Channel.Close
客户端会得到一个异常
过帐前必须创建交换器。 如果您向某个不存在的交换器发布消息 - RabbitMQ
默默地删除它。
创建 Exchange 图形用户界面
转到管理面板 RabbitMQ
在用户下 guest
(用户名: guest
和密码: guest
)。 请注意,用户 guest
只能从本地主机连接。 现在让我们转到选项卡 Exchanges
然后点击 Add a new exchange
。 填写属性:
上面已经描述了大部分属性。 这里我们注意到,如果我们设置 Internal
,那么兑换只能用于 E2E
. Producer
将无法向此类交换发送消息。
结论
开发系统时,方便描述拓扑
如果构造的图中存在 有限集 那么,路由键值得关注几个 fanout exchange
,与路由键 1:1 相关。 请记住 fanout exchange
最快的。
如果路线数量 趋于无穷大,值得关注 topic exchange
或者,如果不需要模板,那么您可以选择 direct exchnge
, 因为他更快 topic exchange
.
各种组合 exchange
应该可以帮助您找到合适的。 可扩展配置,满足当前和不断增长的系统要求。
数量 exchange
与路线数量相比,队列应该最少。
在下一篇文章中,我们将开始更多地了解队列和绑定。
引用
来源: habr.com