RabbitMQ学习笔记--基础篇

RabbitMQ--基于AMQP协议使用Erlang语言开发的一款消息队列产品

一、简单介绍

使用前程序结构--->程序呈现链式结构,B或C服务一旦出现问题,会影响主程序

开始-主任务-B-C-结束

使用后程序结构--->主程序正常运行,B或C服务出现问题,不会影响主任务的正常执行

开始--主任务--结束

| |

消息中间件

| |

B C

MQ优势:

1、应用解耦

--提高系统容错性和可维护性

2、异步提速

--提升用户体验和系统吞吐量

3、削峰填谷

--提高系统稳定性

MQ劣势:

1、系统可用性降低

--系统引入的外部依赖越多,系统稳定性越差。一旦MQ宕机,就会对业务造成影响,怎么保证MQ高可用?

2、系统复杂度提高

--MQ的加入提高了系统的复杂度,MQ实现了异步调用,怎么保证消息没有被重复消费?怎么处理消息丢失的情况?怎么表征消息之间传递的顺序?

3、一致性问题

--MQ把任务传递给B、C,如果其中有服务处理失败,怎么保证消息数据的一致性?

使用MQ需要满足什么条件?

1、生产者不需要从消费者处拿到反馈

2、容许短暂的不一致性

3、确实用了更有效果,即MQ优势带来的效益要大于劣势

RabbitMQ中相关概念:
RabbitMQ学习笔记--基础篇_第1张图片

Producer:消息生产者,向交换器发布消息的客户端应用程序

Exchange:交换器,用来接收生产者发送的消息并将这些消息路由给服务器中的队列。Exchange由四种类型:direct直接(默认)、fanout扇出、topic主题、headers,不同类型的Exchange转发消息的策略有所区别

补充:

direct exchange----路由键与队列名完全匹配的模式,完全匹配、单播模式、点对点通讯模式;
fanout exchange----fanout交换器不处理路由键,而是根据绑定关系转发消息,只要与这个交换机绑定,发送到交换器上的消息都会被转发到与该交换器绑定的所有队列上;
topic exchange----会根据路由键和绑定之间的关系进行匹配来将消息转发到符合条件的队列上,单词之间用点(".")隔开,还可以使用两种通配符("#"、"*"),#表示匹配0个或多个单词,*匹配一个单词;
headers exchange----headers匹配AMQP消息的header而不是路由键,headers交换器和direct交换器完全一致,但是性能会差很多,几乎不用;

Queue:消息队列,用来保存消息直到发送给消费者。它是消息的容器,也是消息的终点。一个消息可以投入多个队列,消息一直在队列里面,等待消费者连接到这个队列将它消费

Binding:绑定,用于消息队列和交换器之间的关联。一个绑定就是基于路由键将交换器和消息队列连接起来的路由规则,所以可以将交换器理解成一个由绑定构成的路由表。Exchange和Queue的绑定可以是多对多的关系

Connection:publisher/consumer和broker之间的TCP连接

Channel:信道,多路复用连接中的一条独立的双向数据流通通道。信道是建立在真实的TCP连接内的虚拟连接,AMQP命令都是通过信道发出去的,不管是发布消息、订阅队列还是接收消息,这些动作都是通过信道完成。因为对于操作系统来说,建立和销毁TCP都是非常昂贵的开销,所以引入了信道的概念,以复用一条TCP连接

Consumer:消息的消费者,从消息队列中取得消息的客户端应用程序

Virtual host: 虚拟主机,表示一批交换机、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个vhost本质上就是一个mini版的RabbitMQ服务器,拥有自己的队列、交换器、绑定和权限机制。vhost是AMQP概念的基础,必须在连接时指定,RabbitMq默认的vhost是/

Broker:表示消息队列服务器实体

补充:

1、生产者将消息发给的是交换器(4种exchange),消费者监听的是队列(queue)

2、JMS--java消息服务(JavaMessage Service)应用程序接口,是一个Java平台中关于面向消息中间件的API,是JavaEE规范中的一种。

二、RabbitMQ的安装

官网:https://www.rabbitmq.com/

docker安装方式:

docker run -d --name rabbitmq \
-p 5671:5671 \
-p 5672:5672 \
-p 4369:4369 \
-p 25672:25672 \
-p 15671:15671 \
-p 15672:15672 \
--restart=always \
rabbitmq:management 


4369,25672---是Erlang发现和集群端口
5672,5671---AMQP端口
15672---web后台管理端口(默认登录名guest密码guest)
61613,61614---STOMP协议端口
1883,8883---MQTT协议端口

web后台管理

http://xxx.xxx.xxx.xxx:15672

--默认登录名guest 密码guest

你可能感兴趣的:(java-rabbitmq,rabbitmq,学习)