RabbitMQ。 第 2 部分:了解交换

Exchange - 交换器或交换点。 消息被发送给它。 Exchange 分发消息 在一个或多个队列中。 他 将消息路由到队列 基于创建的链接(bindings)在它和队列之间。

Exchange 不是 Erlang进程。 出于可扩展性的原因 exchange 是嵌入式数据库中的一个字符串(带有路由逻辑所在代码的模块的链接) 健忘症。 1个交换机仅消耗1MB内存。

目录

直接交换

Direct exchange - 需要时使用 将消息传递到特定队列。 该消息以特定的方式发布到交换器 路由键 并进入与具有相似路由键的该交换器关联的所有队列。 路由键是一个字符串。 匹配是使用完成的 检查字符串是否相等.

消息流的图形表示:

RabbitMQ。 第 2 部分:了解交换

В rabbitmq 有一个概念 默认交换器。 它 direct exchange 无名。 如果使用默认交换器,则消息将被路由到名称等于的队列 消息路由密钥.

话题交流

Topic exchange - 相似的 direct exchange 通过比较路由键来启用选择性路由。 但是,在这种情况下,给出了密钥 按图案。 创建模板时,使用 0 或更多单词(字母 AZ и az 和数字 0-9),用点分隔,以及符号 * и #.

  • * - 可以完全替换为 1 слово
  • # - 可以替换为 0 或更多字

消息流的图形表示:

RabbitMQ。 第 2 部分:了解交换

从版本开始 RabbitMQ 2.4.0 路由算法 topic exchange 开始工作直到 145 快几倍。 他们通过实施该方法实现了这一目标 尝试实现,这涉及将模式表示为树结构。 例如模板 a.b.c, a.*.b.c, a.#.c и b.b.c 将由以下结构表示:

RabbitMQ。 第 2 部分:了解交换

模式匹配是从根开始,从上到下进行搜索的。

产品特点:

  • 使用该交换器可以成为 未来可能的应用程序开发的不错选择, 因为模板始终可以自定义,以便以类似的方式发布消息 direct exchange или fanout exchange
  • 使用的模板 * 快多了比使用的模板 #.
  • topic exchangedirect exchange

扇出交换

Fanout exchange所有消息都传递到所有队列 即使消息中指定了路由密钥。

产品特点:

  • RabbitMQ 不适用于路由键和模板 这对性能有积极的影响。 这是最快的 exchange;
  • 所有消费者必须能够处理所有消息;

消息流的图形表示:

RabbitMQ。 第 2 部分:了解交换

标题交换

Headers exchange - 根据(键,值)属性对的比较将消息定向到相关队列 headers 绑定和类似的消息属性。 headers 它代表 Dictionary<ключ, значение>.

如果你在字典中添加一个特殊的键 x-match 有意义 any,如果(键,值)对部分匹配,则消息将被路由。 此行为类似于运算符 or.

var bindingArguments = new Dictinary<String, Object>();
bindingArguments.add("x-match", "any");

默认键 x-match 包含一个值 all。 这意味着当(键、值)对完全匹配时消息将被路由。 此行为类似于运算符 and.

消息流的图形表示:

RabbitMQ。 第 2 部分:了解交换

产品特点:

  • 额外的灵活性
  • 额外的计算开销。 属性的所有对(键、值) headers 在计算消息路由值之前必须按键名称排序。 比其他类型的交换慢.

一致的哈希交换

这个交换器是 插入 и 没有内置 в RabbitMQ.

Consistent-hashing exchange (哈希一致交换)- 当有多个队列是消息的潜在接收者并且需要在它们之间进行负载平衡时使用。 消息按权重(来自的条件字符串值)与队列关联 0 - n).

队列的等效权重-表示每个队列都会收到 大约相同的数量 消息(每条消息将仅放入一个队列中)。 无法完全保证消息的均匀分布.

消息流的图形表示:

RabbitMQ。 第 2 部分:了解交换

Hash 根据路由键或属性计算 headers 消息。 如果所有发布的消息都有不同的路由键,或者 headers,那么将按权重进行分配。 否则,将使用路由密钥,或者 headers.

当消费者吞吐量需要增长到高于多个消费者使用同一队列的解决方案时,应该会有所帮助。

交换机组合(E2E)

可以使用通信来组合所有交换器的行为 交易所到交易所 (交换器组合不包含在规格中 AMQP。 这是侧面的协议扩展 RabbitMQ).

消息流的图形表示:

RabbitMQ。 第 2 部分:了解交换

通过 E2E 我们可以找到满足当前和不断增长的需求的正确可扩展配置。

创建交易所

交换器是使用同步创建的 RPC 向服务器请求。 使用该方法发出请求 Exchange.Declare使用参数调用:

  • 交换器名称
  • 交换器类型
  • 其他选择

创建示例 exchange 通过 RabbitMQ.客户端:

//...
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 (替代交换器)。 如果消息无法通过原始路由,则可以将其发送到备用交换机,以便沿着不同的路径进行路由。

RabbitMQ。 第 2 部分:了解交换

如果创造 exchange 也许,然后服务器将向客户端发送同步 RPC 回答 Exchange.DeclareOk。 如果创造 不可能 (请求被拒绝 Exchange.Declare) 然后 通道将关闭 使用异步命令的服务器 Channel.Close 客户端会得到一个异常 操作中断异常,其中将包含错误代码及其描述。

过帐前必须创建交换器。 如果您向某个不存在的交换器发布消息 - RabbitMQ 默默地删除它。

创建 Exchange 图形用户界面

转到管理面板 RabbitMQ 在用户下 guest (用户名: guest 和密码: guest)。 请注意,用户 guest 只能从本地主机连接。 现在让我们转到选项卡 Exchanges 然后点击 Add a new exchange。 填写属性:

RabbitMQ。 第 2 部分:了解交换

上面已经描述了大部分属性。 这里我们注意到,如果我们设置 Internal,那么兑换只能用于 E2E. Producer 将无法向此类交换发送消息。

结论

开发系统时,方便描述拓扑 路由 使用图表。 但在开始构建图表之前,值得突出显示高流量的路径,因为。 他们需要 更高的吞吐量 (表现)。 接下来,您可以对流量进行分类。 然后开始构建。

如果构造的图中存在 有限集 那么,路由键值得关注几个 fanout exchange,与路由键 1:1 相关。 请记住 fanout exchange 最快的。

如果路线数量 趋于无穷大,值得关注 topic exchange 或者,如果不需要模板,那么您可以选择 direct exchnge, 因为他更快 topic exchange.

各种组合 exchange 应该可以帮助您找到合适的。 可扩展配置,满足当前和不断增长的系统要求。

数量 exchange 与路线数量相比,队列应该最少。

在下一篇文章中,我们将开始更多地了解队列和绑定。

引用

来源: habr.com

添加评论