RabbitMQ 实现性能和可伸缩性的路由拓扑
为高可扩展系统设计一个好的路由拓扑结构就像绘制一个图表。许多事情需要考虑,例如问题、环境的约束、消息传递实现的约束以及性能策略。我们经常遇到的问题是路由在满足我们的需求方面缺乏灵活性和表现力。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.
,我们使用绑定模式 api.agents..operations.
将交换机 E1
绑定到队列 Q1
,以便发送到 E1
的任何消息都路由到 Q1
…