RabbitMQ(一)基础概念

一、RabbitMQ是什么?
RabbitMQ 是一个由Erlang 语言开发的AMQP 的开源实现消息中间件
 
二、消息中间件的作用 
  • 业务解耦
  • 流量削峰
  • 同步变异步

 

 

三、基础概念
1、AMQP :Advanced Message Queue,高级消息队列协议。
2、生产者:生产消息发送到消息中间件
3、消费者:从消息中间件获取消息,并进行消费
4、消息:有效内容+内容标签
  • 有效内容:可以是任何内容,一个数组,一个集合,甚至二进制数据都可以
  • 内容标签:描述有效内容,是 RabbitMQ 用来决定谁将获得消息
 
5、信道
信道是建立在“真实的”TCP 连接内的虚拟连接,AMQP 命令都是通过信道发送出去的,每条信道都会被指派一个唯一的ID(AMQP库会帮你记住ID的),不论是发布消息、订阅队列或者接收消息,这些动作都是通过信道来完成的。
为什么使用信道,而不直接使用TCP进行数据传输呢?一般情况下,消费者和生产者都是并发操作mq的,而每次建立和销毁 TCP 会话是非常昂贵的开销,但是一个TCP连接可以创建多个信道,开销比较小
 
6、队列
容纳消息的场所,生产者发送到RabbitMQ服务器的消息会在队列中等待消费者消费。
 
7、交换器
消息进入RabbitMQ 服务器时,会首先将消息发送到交换器,然后交换器会根据特定的路由算法以及消息的内容标签将消息绑定到相应的队列
 
8、虚拟主机
默认的虚拟主机是“/”。
虚拟主机其实就是一个迷你版的RabbitMQ 服务器,它拥有自己的交换器和队列,更重要的是虚拟主机拥有自己的权限机制,一个服务器能够创建多个虚拟主机
 
 
9、Prefetch count
prefetchCount指定Queue每次发送给每个消费者的消息数,比如我们设置prefetchCount=1,则Queue每次给每个消费者发送一条消息;消费者处理完这条消息后Queue会再给该消费者发送一条消息。
 
 
10、消息确认
在实际应用中,可能会发生消费者收到Queue中的消息,但没有处理完成就宕机(或出现其他意外)的情况,这种情况下就可能会导致消息丢失。为了避免这种情况发生,我们可以要求消费者在消费完消息后发送一个回执给RabbitMQ,RabbitMQ收到消息回执(Message acknowledgment)后才将该消息从Queue中移除;如果RabbitMQ没有收到回执并检测到消费者的RabbitMQ连接断开,则RabbitMQ会将该消息发送给其他消费者(如果存在多个消费者)进行处理。这里不存在timeout概念,一个消费者处理消息时间再长也不会导致该消息被发送给其他消费者,除非它的RabbitMQ连接断开。
 
 
11、持久化
如果我们希望即使在RabbitMQ服务重启的情况下,也不会丢失消息,我们可以将Queue与Message都设置为可持久化的(durable),这样可以保证绝大部分情况下我们的RabbitMQ消息不会丢失。但依然解决不了小概率丢失事件的发生(比如RabbitMQ服务器已经接收到生产者的消息,但还没来得及持久化该消息时RabbitMQ服务器就断电了)
 

 

 

四、使用docker部署rabbitmq
docker run --name rabbitmq-3.7.16 \
-e RABBITMQ_DEFAULT_PASS="12345678" \
-e RABBITMQ_DEFAULT_USER="root" \
-v /data/rabbitmq:/var/lib/rabbitmq \
--network=host -d harbor.tenserpay.xyz/op/rabbitmq:3.7.16-management

访问web管理界面:http://ip:15672

posted @ 2020-11-11 14:33  guoxianqi  阅读(144)  评论(0编辑  收藏  举报