【RabbitMQ的那点事】RabbitMQ入门

消息组件主要划分为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
网上有很多翻译的版本,写的都很好:

  • AMQP 0-9-1 简介
  • AMQP协议学习
  • RabbitMq系列之一:基础概念

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)。

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(死信队列):在某些情况下,例如当一个消息无法被成功路由时,消息或许会被返回给发布者并被丢弃。或者,如果消息代理执行了延期操作,消息会被放入一个所谓的死信队列中。
    AMQP 0-9-1 Model

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

你可能感兴趣的:(【RabbitMQ的那点事】RabbitMQ入门)