RabbitMQ相关简介

一、简介
1.AMQP

  AMQP是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。目标是实现一种在全行业广泛使用的标准消息中间件技术,以便降低企业和系统集成的开销,并且向大众提供工业级的集成服务。

2.RabbitMQ

RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写。

二、RabbitMQ介绍
1.相关要素

   1.1 Producer:生产者,负责生产消息以及投递消息到Exchange(交换机)
   1.2 Exchange:交换机,根据交换机类型的不同,按照不同的规则,通过RoutingKey(路由键)投递到某个Queue(队列)里
   1.3 RoutingKey:路由键,通过RoutingKey(路由键)将Queue(队列)与Exchange(交换机)Binding(绑定)在一起, Exchange(交换机)通过RoutingKey(路由键)将消息投递到某个Queue(队列)
  1.4 Queue:队列,消息都存放在Queue(队列)里,Exchange(交换机)通过RoutingKey(路由键)将消息投递到某个Queue(队列)
   1.5 Binding:绑定,通过RoutingKey(路由键)将Queue(队列)与Exchange(交换机)Binding(绑定)在一起
  1.6 Consumer:消费者,负责从Queue(队列)里取消息及消费消息
  1.7 Vhost:虚拟主机,即消息队列服务器实体
  1.8 Channel:信道。信道(Channel)是多路复用连接中的一条独立的双向数据流通道,消息发布接受订阅都依靠信道完成。
  信道是生产消费者与rabbit通信的渠道,生产者publish或是消费者subscribe一个队列都是通过信道来通信的。信道是建立在TCP连接上的虚拟连接,什么意思呢?就是说rabbitmq在一条TCP上建立成百上千个信道来达到多个线程处理,这个TCP被多个线程共享,每个线程对应一个信道,信道在rabbit都有唯一的ID ,保证了信道私有性,对应上唯一的线程使用。
  疑问:为什么不建立多个TCP连接呢?原因是rabbit保证性能,系统为每个线程开辟一个TCP是非常消耗性能,每秒成百上千的建立销毁TCP会严重消耗系统。所以rabbitmq选择建立多个信道(建立在tcp的虚拟连接)连接到rabbit上。
在这里插入图片描述

2.常见问题

  2.1 如果消息达到无人订阅的队列会怎么办?消息会一直在队列中等待,RabbitMq默认队列是无限长度的。
  2.2 多个消费者订阅到同一队列怎么办?消息以循环的方式发送给消费者,每个消息只会发送给一个消费者。
  2.3 消息路由到了不存在的队列怎么办?一般情况下,凉拌,RabbitMq会忽略,当这个消息不存在,也就是这消息丢了。

3.消息的确认

  3.1 消费者收到的每一条消息都必须进行确认(自动确认和自行确认)。
  3.2 消费者在声明队列时,可以指定autoAck参数,当autoAck=false时,RabbitMQ会等待消费者显式发回ack信号后才从内存(和磁盘,如果是持久化消息的话)中移去消息。否则,RabbitMQ会在队列中消息被消费后立即删除它。
  3.3 采用消息确认机制后,只要令autoAck=false,消费者就有足够的时间处理消息(任务),不用担心处理消息过程中消费者进程挂掉后消息丢失的问题,因为RabbitMQ会一直持有消息直到消费者显式调用basicAck为止。
  3.4 当autoAck=false时,对于RabbitMQ服务器端而言,队列中的消息分成了两部分:一部分是等待投递给消费者的消息;一部分是已经投递给消费者,但是还没有收到消费者ack信号的消息。如果服务器端一直没有收到消费者的ack信号,并且消费此消息的消费者已经断开连接,则服务器端会安排该消息重新进入队列,等待投递给下一个消费者(也可能还是原来的那个消费者)。
  3.5 RabbitMQ不会为未ack的消息设置超时时间,它判断此消息是否需要重新投递给消费者的唯一依据是消费该消息的消费者连接是否已经断开。这么设计的原因是RabbitMQ允许消费者消费一条消息的时间可以很久很久。

4.交换器类型

共有四种direct,fanout,topic,headers,其种headers(几乎和direct一样)不实用,可以忽略。
  4.1 Direct:路由键完全匹配,消息被投递到对应的队列,每个amqp的实现都必须有一个direct交换器,包含一个空白字符串名称的默认交换器。声明一个队列时,会自动绑定到默认交换器,并且以队列名称作为路由键:channel->basic_public($msg,’ ’,’queue-name’)
  4.2 Fanout:消息广播到绑定的队列
  4.3 Topic:通过使用“”和“#”,使来自不同源头的消息到达同一个队列,”.”将路由键分为了几个标识符,“”匹配1个,“#”匹配一个或多个。例如日志处理:
  假设有交换器log-exchange,日志级别有error,info,warning,应用模块有user,order,email,服务器有 A、B、C、D
路由键的规则为 服务器+“.”+日志级别+“.”+应用模块名,如:A. info .email。
(1)、要关注A服务器发送的所有应用错误的消息,怎么做?
声明队列名称为“a-app-error-queue”并绑定到交换器上:channel. queueBind (‘a-app-error-queue’,’logs-change’,’A.error.’)
(2)、关注B服务器发送的的所有日志,怎么办?
声明队列名称为“b-all-queue”并绑定到交换器上:channel. queueBind (b-all-queue’,’logs-change’,’ B.#’)或channel. queueBind (b-all-queue’,’logs-change’,’ B.
.*’)
(3)、关注所有服务器发送的email的所有日志,怎么办?
声明队列名称为“email-all-queue”并绑定到交换器上:channel. queueBind (email -all-queue’,’logs-change’,’ ..emal’)
(4)、想要接收所有日志:channel->queue_bind(‘all-log’,’logs-change’,’#’)

5.docker安装rabbitmq
// 拉取镜像,management带有web页面
docker pull rabbitmq:management
// 创建本地数据存储
 mkdir -p ~/data/docker/rabbitmp
// 运行容器
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 -v ~/data/docker/rabbitmq:/var/lib/rabbitmq --hostname my-rabbit -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=123456 rabbitmq:management-d 指定docker容器在后台运行

--name 定义一个容器的名字
-p 5672:5672 端口映射,5672应用访问端口
-p 15672:15672 端口映射,15672控制台Web端口号
-v /data/docker/rabbitmq:/var/lib/rabbitmq绑定一个数据卷
-e RABBITMQ_DEFAULT_USER=admin 默认用户的用户名
-e RABBITMQ_DEFAULT_PASS=123456 默认用户的密码
--hostname my-rabbit 主机名(RabbitMQ 的一个重要注意事项是它根据所谓的 节点名称 存储数据,默认为主机名)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码出天空

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值