消息组件主要划分为JMS组件和AMQP组件两类。
- JMS(Java Message Service)组件:ActiveMQ性能较差。
- AMQP组件(协议):性能是最高的,而RabbitMQ是基于AMQP实现的应用最多的开源项目。
1. AMPQ
大多数中间件技术都是基于tcp/ip协议基础之上构建新型的协议规范,而RabbitMQ遵循的是AMQP协议(AMQP也是基于TCP的,填充TCP 协议层的数据部分)。
AMPQ全称:Advanced Message Queuing Protocol。
关于AMPQ 0-9-1,RabbitMQ官网文档写的挺好的:AMQP 0-9-1 Model Explained
网上有很多翻译的版本,写的都很好:
2. 消息代理和他们所扮演的角色
-
Publisher(也叫Producer):
- 消费发布方,一般是写在项目中,可用java/c#/python/..实现。
- 如果是java,与Spring Boot有很好的集成:spring-boot-starter-amqp,可以使用@RabbitListener, RabbitTemplate等类来发布消息。
-
Broker:
- Brokers从Producers那儿接收消息,并根据既定的路由规则把接收到的消息发送给Consumers。
- 下载安装:https://www.rabbitmq.com/download.html
- 可集群配置RabbitMQ broker (线上一般都是多台)。
- 如果是跑hello world例子,可以用windows binary版本或者使用docker安装,或者在MacOS下跑
-
Consumer:
- 消息消费方,一般写在另一个项目中,可用java/c#/python/..实现
AMQP模型,也可与Spring Boot集成(同Producer)。
- 消息消费方,一般写在另一个项目中,可用java/c#/python/..实现
3. Broker Console
在Broker启动后,默认情况下,Producer和Consumer可通过IP+端口为5672进行连接。
RabbitMQ也提供了UI操作:http://localhost:15672/#/
登陆:guest/guest
通过UI可以创建Vhost, Exchange, Queue等。
4. AMQP 0-9-1 模型简介
- Exchange:就像是邮局或者邮箱,Producer只需要将消息发送给Exchange就可以了,剩下的由Exchange负责将收到的消息根据路由规则分发给绑定的队列(Queue)。
- Routing key:路由关键字,Producer发送消息时会携带一个路由键(routing key)。
- Queue:存储消息队列,供Consumer订阅,Consumer订阅后,AMQP代理会将消息投递给订阅了此队列的Consumer程序 (Push模式),或者消费者按照需求自行获取(Pull模式)。
-
Message acknowledgements(消息确认或叫消息应答):
- 当消息被投递给Consumer后,如何通知Broker——消息已经被我接收了:自动确认或Consumer写代码手动确认。
- 启动消息确认功能后,Broker只有当收到Consumer的确认回执后才会将消费从队列中删除。
- 消息确认是默认打开的。我们通过显示的设置autoAsk=true关闭这种机制。
-
Dead Letter Queue(死信队列):在某些情况下,例如当一个消息无法被成功路由时,消息或许会被返回给发布者并被丢弃。或者,如果消息代理执行了延期操作,消息会被放入一个所谓的死信队列中。
5. 交换机和交换机类型
在#2中一开始就介绍了Exchange,它在消息中间件中是个非常重要的角色——负责消息分发——而且是按一定规则去分发。
5.1 Exchange的重要属性:
- Name
- Type
- Durability:是否持久化(消息代理重启后,交换机是否还存在)
- Auto-delete:当所有与之绑定的消息队列都完成了对此交换机的使用后,删掉它
- Arguments:选填,使用broker-specific或plugin插件时可能会用
【重要】5.2 Exchange类型
- Direct exchange:(Empty string) and amq.direct,不指定exchange时,即empty string,也会使用该类型
- Fanout exchange:amq.fanout
- Topic exchange:amq.topic
- Headers exchange:amq.match (and amq.headers in RabbitMQ)
关于Exchange类型,更详细的戳:https://www.jianshu.com/p/d9561f13e28b
参考:
- 《名师讲坛——Java微服务架构实战(SpringBoot+SpringCloud+Docker+RabbitMQ)》第14章 RabbitMQ消息组件:https://book.douban.com/subject/34943476/
- AMQP 0-9-1和1-0:https://www.it1352.com/1620745.html