使用 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
…