8.2 使用 RabbitMQ 和 AMQP
RabbitMQ 可以说是 AMQP 最优秀的实现,它提供了比 JMS 更高级的消息路由策略。JMS 消息使用接收方将从中检索它们的目的地的名称来寻址,而 AMQP 消息使用交换器的名称和路由键来寻址,它们与接收方正在监听的队列解耦。交换器和队列之间的这种关系如图 8.1 所示。
图 8.1 发送到 RabbitMQ 交换器的消息被路由到多个队列
当消息到达 RabbitMQ broker 时,它将转到它所寻址的交换器。交换器负责将其路由到一个或多个队列,具体取决于交换器的类型、交换器与队列之间的绑定以及消息的路由键的值。
有几种不同的交换方式,包括以下几种:
  • Default —— 一种特殊的交换器,通过 broker 自动创建。它将消息路由到与消息的路由键的值同名的队列中。所有的队列将会自动地与交换器绑定。
  • Direct —— 路由消息到消息路由键的值与绑定值相同的队列。
  • Topic —— 将消息路由到一个或多个队列,其中绑定键(可能包含通配符)与消息的路由键匹配。
  • Fanout —— 将消息路由到所有绑定队列,而不考虑绑定键或路由键。
  • Headers —— 与 topic 交换器类似,只是路由基于消息头值而不是路由键。
  • Dead letter —— 对无法交付的消息(意味着它们不匹配任何已定义的交换器与队列的绑定)的全部捕获。
最简单的交换形式是 Default 和 Fanout,因为它们大致对应于 JMS 队列和主题。但是其他交换允许定义更灵活的路由方案。
需要理解的最重要的一点是,消息是用路由键发送到交换器的,它们是从队列中使用的。它们如何从一个交换到一个队列取决于绑定定义以及什么最适合相应的情况。
使用哪种交换类型以及如何定义从交换到队列的绑定与 Spring 应用程序中消息的发送和接收方式关系不大。因此,我们将重点讨论如何编写使用 RabbitMQ 发送和接收消息的代码。
注意
有关如何最好地将队列绑定到交换器的更详细讨论,请参见 Alvaro Videla 和 Jason J.W. Williams(Manning, 2012)的《RabbitMQ 实战》
复制链接