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