返回介绍

17.3.1 AMQP 简介

发布于 2024-08-17 00:45:49 字数 1762 浏览 0 评论 0 收藏 0

简单回忆一下JMS的消息模型,可能会有助于理解AMQP的消息模型。在JMS中,有三个主要的参与者:消息的生产者、消息的消费者以及在生产者和消费者之间传递消息的通道(队列或主题)。JMS消息模型中的关键元素在图17.3和图17.4中进行了描述。

在JMS中,通道有助于解耦消息的生产者和消费者,但是这两者依然会与通道相耦合。生产者会将消息发布到一个特定的队列或主题上,消费者从特定的队列或主题上接收这些消息。通道具有双重责任,也就是传递数据以及确定这些消息该发送到什么地方,队列的话会使用点对点算法发送,主题的话就使用发布-订阅的方式。

与之不同的是,AMQP的生产者并不会直接将消息发布到队列中。AMQP在消息的生产者以及传递信息的队列之间引入了一种间接的机制:Exchange。这种关系如图17.8所示。

图17.8 在AMQP中,通过引入处理信息路由的Exchange,
消息的生产者 与消息队列之间实现了解耦

可以看到,消息的生产者将信息发布到一个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,很容易就能想到我们可以定义任意数量的路由模式,而不再仅限于点对点和发布-订阅的方式。[3]好消息是,当发送和接收消息的时候,所涉及的路由算法对于如何编写消息的生产者和消费者并没有什么影响。简单来讲,生产者将信息发送给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发送和接收消息的代码。首先我们将看到的是一些通用的配置,它们同时适用于生产者和消费者。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文