17.3.1 AMQP 简介
Last updated
Last updated
简单回忆一下 JMS 的消息模型,可能会有助于理解 AMQP 的消息模型。在 JMS 中,有三个主要的参与者:消息的生产者、消息的消费者以及在生产者和消费者之间传递消息的通道(队列或主题)。JMS 消息模型中的关键元素在图 17.3 和图 17.4 中进行了描述。
在 JMS 中,通道有助于解耦消息的生产者和消费者,但是这两者依然会与通道相耦合。生产者会将消息发布到一个特定的队列或主题上,消费者从特定的队列或主题上接收这些消息。通道具有双重责任,也就是传递数据以及确定这些消息该发送到什么地方,队列的话会使用点对点算法发送,主题的话就使用发布-订阅的方式。
与之不同的是,AMQP 的生产者并不会直接将消息发布到队列中。AMQP 在消息的生产者以及传递信息的队列之间引入了一种间接的机制:Exchange。这种关系如图 17.8 所示。
可以看到,消息的生产者将信息发布到一个 Exchange。Exchange 会绑定到一个或多个队列上,它负责将信息路由到队列上。信息的消费者会从队列中提取数据并进行处理。 图 17.8 所没有展现出来的一点是 Exchange 不是简单地将消息传递到队列中,并不仅仅是一种穿透(pass-through)机制。AMQP 定义了四种不同类型的 Exchange,每一种都有不同的路由算法,这些算法决定了是否要将信息放到队列中。根据 Exchange 的算法不同,它可能会使用消息的 routing key 和 / 或参数,并将其与 Exchange 和队列之间 binding 的 routing key 和参数进行对比。(routing key 可以大致理解为 Email 的收件人地址,指定了预期的接收者。)如果对比结果满足相应的算法,那么消息将会路由到队列上。否则的话,将不会路由到队列上。
四种标准的 AMQP Exchange 如下所示:
Direct:如果消息的 routing key 与 binding 的 routing key 直接匹配的话,消息将会路由到该队列上;
Topic:如果消息的 routing key 与 binding 的 routing key 符合通配符匹配的话,消息将会路由到该队列上;
Headers:如果消息参数表中的头信息和值都与 bingding 参数表中相匹配,消息将会路由到该队列上;
Fanout:不管消息的 routing key 和参数表的头信息 / 值是什么,消息将会路由到所有队列上。
借助这四种类型的 Exchange,很容易就能想到我们可以定义任意数量的路由模式,而不再仅限于点对点和发布-订阅的方式。好消息是,当发送和接收消息的时候,所涉及的路由算法对于如何编写消息的生产者和消费者并没有什么影响。简单来讲,生产者将信息发送给 Exchange 并带有一个 routing key,消费者从队列中获取消息。
我们已经快速了解了 AMQP 消息的基本知识 —— 此时应该已经能够理解我们接下来所要介绍的如何使用 Spring 发送和接收消息。但是,我建议你更深入的学习一下 AMQP,可以阅读规范和 www.amqp.org 站点上的其他资料,或者可以阅读 Alvaro Videla 和 Jason J.W. Williams 所编写的《RabbitMQ in Action》(Manning, 2012, www.manning.com/videla/)。
现在,我们结束对 AMQP 的抽象讨论,开始着手编写借助 Spring AMQP 发送和接收消息的代码。首先我们将看到的是一些通用的配置,它们同时适用于生产者和消费者。