手记

Spring AMQP杂记之AMQP基本概念

特别声明:强烈建议想要学习MQ的同学如果有时间慢慢啃的话还是推荐直接去官网看英文doc,遇到实在不理解的地方再去博客或者其他网站上找资料。

接下来步入正题:AMQP本质是一个消息队列协议而并非一个框架,我们熟知的RabbitMQ,RocketMQ才是实现了AMQP的消息队列框架。Spring默认的AMQP实现也是唯一的实现是RabbitMQ。至于阿里的火箭MQ,apache的activeMQ就没有提供实现啦。至于以上这些MQ框架孰优孰劣,要根据实际情况自己判断了。本人更偏向于使用RabbitMQ,一个因为是Spring对其进行了封装,使用起来比较简单。。。(最主要的原因),二是因为本身他是Erlang语言编写,对于并发的支持较好,而且网上的各家MQ的性能测试对比中表现的也比较好。

首先介绍AMQP中几个重要的概念:下面这张图片是RabbitMQ官网中对于AMQP模型的抽象

AMQP模型

如图,整个消息流转的过程是:生产者将消息发送到Exchange中,Exchange再将消息根据一定的规则路由到指定的队列中,最后消费者从指定的队列中获取消息。其中被方框圈起来的组件可以称为Broker,即MQ服务器,Publisher和Consumer就是我们自己实现的生产者和消费者。接下来详细介绍一下上面的几个组件。

Exchange

Exchange(交换机)类型:他是生产者发送消息的地方,交换机收到消息后将消息路由到0或多个队列中,AMQP一共定义了4种交换机,如图:

RabbiMQ官网图

其实还有一个Default Exchange,只不过它是被MQ服务器提前声明的一种没有名字的Direct exchange。但是它有一个很重要的属性,创建的每一个队列都会自动的用队列名作为路由键(路由key路由的规则)绑定到该exchange中。打个比方,比如你创建了一个名称为“talk-is-cheap——show-me-the-code”的队列,MQ会自动的用“talk-is-cheap——show-me-the-code”作为路由key绑定到Default exchange,所以当生产者发送的消息携带名为“talk-is-cheap——show-me-the-code”的路由key时就会发送到声明的队列中去了。


Direct exchange:

官网盗图

他是根据路由key将消息发送到指定队列,比较适合一对一的场景。工作流程如下:声明队列时指定一个路由key绑定到exchange,当有携带相同key的消息到达exchange中时就会自动的转发给该队列了。


Fanout  exchange:

官网盗图

如图,该交换机是将消息转发到所有绑定到该交换机上的队列,这个时候如果你发给交换机的消息携带路由key,他也会忽略掉。这个场景最适合的就是广播了,类似村书记喇叭一喊,大家都能听到了。这里贴几个官网对于该交换机几个使用场景的介绍。

大型多玩家在线(MMO)游戏可以使用它来更新排行榜或其他全球事件

体育新闻网站可以使用fanout交换器向移动客户实时分发分数更新

分布式系统可以广播各种状态和配置更新(记得Spring Cloud Bus的配置广播吗?)

Topic Exchange:

官网盗图

他通过一定的路由策略将符合条件的路由key转发到多个符合路由策略的队列上,和直连交换机类似,只不过他匹配的是key的模式,类似于正则匹配。其中*代表任意的一个词,#代表0或多个词。使用场景比如这个任务队列里的消息需要多个消费者处理,而每个消费者只能处理特定的任务。


Headers Exchange:

类似于http的head,可以设置多个属性,根据属性进行队列匹配。首部交换机也会忽略路由键。当有多个首部的时候怎么知道该匹配哪一个呢?交换机有一个“x-match”参数,设置为any表示任意一个匹配即可,设置为all则表示所有的头部信息都匹配才会发送到指定队列。这个交换机工作中不咋用,好像略微有点鸡肋。

Queue

呃,这个其实和普通的队列没啥区别,只不过它里面可以设置一些额外的属性,例如持久化、自动删除等。有一个地方需要注意,如果不能将AMQP消息路由到任何队列(例如,路由键没有对应的队列),则可以根据发布者设置的消息属性,将其删除或返回给发布者。这个设置在保证消息可靠性时是十分重要的。



作者:叫我田露就行
链接:https://www.jianshu.com/p/b21a3c298737


0人推荐
随时随地看视频
慕课网APP