# mq **Repository Path**: jietuo/mq ## Basic Information - **Project Name**: mq - **Description**: rabbitmq、rocketmq、kafka等各种消息队列的使用 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2021-02-14 - **Last Updated**: 2022-02-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README **MQ学习** [代码地址][https://gitee.com/jietuo/mq] [toc] # RabbitMQ ## 简介 ~~~ MQ全称为Message Queue,即消息队列, RabbitMQ是由erlang语言开发,基于AMQP(Advanced Message Queue 高级消息队列协议)协议实现的消息队列,它是一种应用程序之间的通信方法,消息队列在分布式系统开 发中应用非常广泛。 ~~~ 应用场景: - 任务异步处理 将不需要同步处理的并且耗时长的操作由消息队列通知消息接收方进行异步处理。提高应用程序的响应时间。 - 应用解耦 MQ相当于一个中介,生产方通过MQ 与消费方交互,它将应用程序解耦。 ## 优势 - 使用简单,功能强大 - 基于AMQP协议 - 社区活跃,文档完善 - 高并发性能好,这主要得益于Erlang语言。 - SpringBoot 默认已集成RabbitMQ ## JMS与AMQP的区别 ~~~百度百科 JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。 ~~~ ~~~百度百科 AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。 ~~~ 总结:JMS是Java提供的一套消息服务API标准,其目的是为所有的Java应用程序提供统一的消息通信的标准,类似Java的jdbc,只要遵循jms标准的应用程序之间都可以进行消息通信。 jms是Java语言专属的消息服务标准,它是在api层定义标准,并且只能用于Java应用,而AMQP是在协议层定义的标准,是跨语言的。 ## 快速入门 ![](resource/RabbitMQ_工作原理.png) - **Producer**:消息生产者,即生产方客户端,生产方客户端将消息发送到MQ。 - **Connection**:网络连接 - **Channel**:信道,多路复用连接中的一条独立的双向数据流通道。信道是建立在真实的TCP连接内地虚拟连接,AMQP 命令都是通过信道发出去的,不管是发布消息、订阅队列还是接收消息,这些动作都是通过信道完成。因为对于操作系统来说建立和销毁 TCP 都是非常昂贵的开销,所以引入了信道的概念,以复用一条 TCP 连接。 - **Broker**:消息队列服务进程,此进程包括两部分,Exchange,Queue。实现amqp实体服务 - **Virtual Host**:虚拟主机,是一个逻辑概念,出于多租户和安全因素设计的,把 AMQP 的基本组件划分到一个虚拟的分组中,类似于网络中的 namespace 概念。在最上层的消息路由,一个虚拟主机中可以包含多个Exchange和Queue,但一个虚拟主机中不能有名称相同的。(tips:可以理解为数据库,而Exchange就是数据库中的表,必须得先创建数据库,才能创建表。) - **Exchange**:消息队列交换机,按一定的规则将消息路由转发到某个队里,对消息进行过滤。 - **Queue**:消息队列,存储消息的队列,消息到达队列并转发给指定的消费方 ~~~ 发送消息 1、生产者和Broker建立TCP连接 2、生产者和Broker建立通道 3、生产者通过通道将消息发送给Broker,由Exchange将消息转发 4、Exchange将消息转发到指定的Queue ~~~ ~~~ 接收消息 1、消费者和Broker建立TCP连接 2、消费者和Broker建立通道 3、消费者监听指定的Queue 4、当有消息到达Queue时,Broker默认将消息推动给消费者 5、消费者接收到消息 ~~~ ## 单机MQ环境搭建 RabbitMQ由Erlang语言开发,Erlang语言用于并发及分布式系统的开发,在电信领域应用广泛,OTP(Open Telecom Platform)作为Erlang语言的一部分,包含了很多基于Erlang开发的中间件及工具库,安装RabbitMQ需 要安装Erlang/OTP,并保持版本匹配,参考https://www.rabbitmq.com/which-erlang.html 基于centos7搭建 ``` 下载安装erlang环境 wget www.rabbitmq.com/releases/erlang/erlang-18.3-1.el7.centos.x86_64.rpm rpm -ivh erlang-18.3-1.el7.centos.x86_64.rpm 下载安装socat环境 wget http://repo.iotti.biz/CentOS/7/x86_64/socat-1.7.3.2-5.el7.lux.x86_64.rpm rpm -ivh socat-1.7.3.2-5.el7.lux.x86_64.rpm 下载安装rabbitmq wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.11/rabbitmq-server-3.8.11-1.el7.noarch.rpm rpm -ivh rabbitmq-server-3.8.11-1.el7.noarch.rpm 开启管理界面 rabbitmq-plugins enable rabbitmq_management ``` ## RabbitMQ的7中工作模式 ### 简单模式 ![RabbitMQ_1](rabbitmq-api/src/main/resources/RabbitMQ_1.png) https://www.rabbitmq.com/tutorials/tutorial-one-java.html 代码参见:cn.jietuo.helloworld ### work queues ![RabbitMQ_1](rabbitmq-api/src/main/resources/RabbitMQ_2.png) ### Publish/Subscribe ![RabbitMQ_1](rabbitmq-api/src/main/resources/RabbitMQ_3.png) ### Routing ![RabbitMQ_1](rabbitmq-api/src/main/resources/RabbitMQ_4.png) ### Topics ![RabbitMQ_1](rabbitmq-api/src/main/resources/RabbitMQ_5.png) ### RCP ![RabbitMQ_1](rabbitmq-api/src/main/resources/RabbitMQ_6.png) ### Publisher Confirms ![RabbitMQ_1](rabbitmq-api/src/main/resources/RabbitMQ_7.png)