为一个高可伸缩系统设计良好的路由拓扑就像绘制一张图。需要考虑许多事项,例如问题、环境的约束、消息传递实现的约束以及性能策略。我们经常遇到的问题是,路由在满足我们的需求时缺乏灵活性和表达能力。这正是 RabbitMQ 的优势所在。
基本概念
任何熟悉消息传递的人都知道从 A 到 B 路由消息的概念。路由可以简单或相当复杂,在为可伸缩的复杂系统设计路由拓扑时,它必须优雅。保持干净和解耦,组件可以很好地应对不同的负载。这可以表示为一个简单的地图或复杂的图。在最简单的形式下,路由拓扑可以表示为节点,例如分层节点

对于刚接触 RabbitMQ 或
AMQP 的人(请注意 Rabbit 支持包括
STOMP、HTTP、HTTPS、XMPP 和 SMTP 在内的许多协议),以下是一些基本组件描述
- 交换机 (Exchange) 服务器内的实体,接收来自生产者应用的消息,并可选择将这些消息路由到服务器内的消息队列
- 交换机类型 (Exchange type) 是一种特定交换机模型的算法和实现。与“交换机实例”相对,交换机实例是服务器内接收和路由消息的实体
- 消息队列 (Message queue) 一个命名实体,用于保存消息并将其转发给消费者应用
- 绑定 (Binding) 一个在消息队列和交换机之间建立关系的实体
- 路由键 (Routing key) 交换机可用于决定如何路由特定消息的虚拟地址
对于点对点路由,路由键通常是消息队列的名称。对于主题发布/订阅路由,路由键通常是分层性质的
api.agents.agent-{id}.operations.{operationName}
在更复杂的场景中,路由键可以与基于消息头字段和/或消息内容的路由相结合。交换机检查消息的属性、头字段、消息体内容以及可能来自其他来源的数据,然后决定如何路由消息。从上述路由键概念派生的绑定模式可能如下所示: api.agents..operations.
其中我们将交换机 E1
绑定到队列 Q1
使用绑定模式 api.agents..operations.
这样任何发送到 E1
都会路由到 Q1
…