学习纪录片:三、消息队列下—RbbitMQ
目录
前言
一、死信队列
概念
产生原因
死信队列的架构图
二、延迟队列
概念
使用场景
三、优先级队列
四、惰性队列
使用场景
两种模式
性能对比
RabbitMQ集群
使用集群的原因
搭建集群步骤
镜像队列
创建镜像队列
联邦交换机 Federation Exchange
步骤
联邦队列Federation Queue
总结
前言
继上一篇章了解完了消息队列的基本概念与使用场景,另外还讲解了RabbitMQ的几种工作模式,这一篇章我们来对RabbitMQ的死信队列,延迟队列,以及RabbitMQ的集群搭建等内容进行学习。
一、死信队列
概念
先从概念解释上搞清楚这个定义,死信,顾名思义就是无法被消费的消息,字面意思可以这样理 解,一般来说,生产者 将消息投递到 交换机或者直接到 队列里里了,消费者从队列取出消息 进行消费,但某些时候由于特定的原因导致 queue 中的某些消息无法被消费,这样的消息如果没有 后续的处理,就变成了死信,有死信自然就有了死信队列。
应用场景:为了保证订单业务的消息数据不丢失,需要使用到 RabbitMQ 的死信队列机制,当消息 消费发生异常时,将消息投入死信队列中.还有比如说: 用户在商城下单成功并点击去支付后在指定时 间未支付时自动失效。
产生原因
消息 TTL 过期
队列达到最大长度(队列满了,无法再添加数据到 mq 中)
消息被拒绝(basic.reject 或 basic.nack)并且 requeue=false
死信队列的架构图
开始按照正常步骤,生产者将消息传送给交换机,交换机通过zhangsan 这个key与队列normal绑定,然而这个时候,如果传输的消息由于被拒绝,或者TTL时间过期,队列已满的原因会进入到另一个交换机dead中,然后传输到死信队列dead中,交给c2消费者进行消费。如果没有出现问题,消息会按照正常情况由c1消费者进行消费。
二、延迟队列
概念
顾名思义 延迟队列的概念即我们队列中的消息不会立刻由消费者取出并进行消费,而是延迟到我们设定的时间后再进行消费。
使用场景
1.订单在十分钟之内未支付则自动取消
2.新创建的店铺,如果在十天内都没有上传过商品,则自动发送消息提醒。
3.用户注册成功后,如果三天内没有登陆则进行短信提醒。
4.用户发起退款,如果三天内没有得到处理则通知相关运营人员。
5.预定会议后,需要在预定的时间点前十分钟通知各个与会人员参加会议
这些场景都有一个特点,需要在某个事件发生之后或者之前的指定时间点完成某一项任务,如: 发生订单生成事件,在十分钟之后检查该订单支付状态,然后将未支付的订单进行关闭;看起来似乎 使用定时任务,一直轮询数据,每秒查一次,取出需要被处理的数据,然后处理不就完事了吗?如果 数据量比较少,确实可以这样做,比如:对于“如果账单一周内未支付则进行自动结算”这样的需求, 如果对于时间不是严格限制,而是宽松意义上的一周,那么每天晚上跑个定时任务检查一下所有未支 付的账单,确实也是一个可行的方案。但对于数据量比较大,并且时效性较强的场景,如:“订单十 分钟内未支付则关闭“,短期内未支付的订单数据可能会有很多,活动期间甚至会达到百万甚至千万 级别,对这么庞大的数据量仍旧使用轮询的方式显然是不可取的,很可能在一秒内无法完成所有订单 的检查,同时会给数据库带来很大压力,无法满足业务要求而且性能低下。
在讲延迟队列的时候,我们首先要了解一个概念 “TTL属性”。
三、优先级队列
在我们创建队列的时候可以勾选让之成为优先级队列,然后在创建消息的时候对其设置优先级,这样消费者在队列中有多个消息的时候会优先取优先级最高的消息进行消费。
四、惰性队列
使用场景
两种模式
Map<String, Object> args = new HashMap<String, Object>();
args.put("x-queue-mode", "lazy");
channel.queueDeclare("myqueue", false, false, false, args);
性能对比
在发送 1 百万条消息,每条消息大概占 1KB 的情况下,普通队列占用内存是 1.2GB,而惰性队列仅仅占用 1.5MB。
RabbitMQ集群
使用集群的原因
搭建集群步骤
vim /etc/hostname
vim /etc/hosts10.211.55.74 node110.211.55.75 node210.211.55.76 node3
scp /var/lib/rabbitmq/.erlang.cookie root@node2:/var/lib/rabbitmq/.erlang.cookiescp /var/lib/rabbitmq/.erlang.cookie root@node3:/var/lib/rabbitmq/.erlang.cookie
rabbitmqctl stop_app(rabbitmqctl stop 会将 Erlang 虚拟机关闭,rabbitmqctl stop_app 只关闭 RabbitMQ 服务)rabbitmqctl resetrabbitmqctl join_cluster rabbit@node1rabbitmqctl start_app(只启动应用服务)
rabbitmqctl resetrabbitmqctl join_cluster rabbit@node2rabbitmqctl start_app
rabbitmqctl stop_apprabbitmqctl resetrabbitmqctl start_apprabbitmqctl cluster_statusrabbitmqctl forget_cluster_node rabbit@node2(node1 机器上执行)
镜像队列
创建镜像队列
联邦交换机 Federation Exchange
1.需要保证每台节点单独运行2.在每台机器上开启 federation 相关插件rabbitmq-plugins enable rabbitmq_federationrabbitmq-plugins enable rabbitmq_federation_management3.原理图(先运行 consumer 在 node2 创建 fed_exchange)4.在 downstream(node2)配置 upstream(node1)5.添加 policy6.成功的前提
步骤
联邦队列Federation Queue
总结
消息队列作为开发中常用的中间件,是当下热门的技术之一,除了RabbitMQ以外,还有.ActiveMQ,Kafka,RocketMQ等等,消息队列在多种场景都可以使用。
学习纪录片:三、消息队列下—RbbitMQ相关推荐
- Redis学习笔记~实现消息队列比MSMQ更方便
回到目录 什么是队列:简单的说就是数据存储到一个空间里(可以是内存,也可以是物理文件),先存储的数据对象,先被取出来,这与堆栈正好相反,消息队列也是这样,将可能出现高并发的数据进行队列存储,并按着入队 ...
- 进程通信学习笔记(Posix消息队列)
在某个进程往一个队列写入消息之前,并不需要另外有个进程在该队列上等待消息的到达,这跟管道和FIFO是相反的,对于后两者来说,除非读出者已存在,否则先有写入者是没有意义的 1.mq_open.mq_cl ...
- exit函数_Linux进程间通信详解(三) 消息队列及函数
消息队列的概念 消息队列就是一个消息的链表,每个消息队列都有一个队列头,用结构struct msg_queue来描述.队列头中包含了该队列的大量信息,包括消息队列的键值.用户ID.组ID.消息数目.读 ...
- Linux进程间通信详解(三) —— 消息队列及函数
消息队列的概念 消息队列就是一个消息的链表,每个消息队列都有一个队列头,用结构struct msg_queue来描述.队列头中包含了该队列的大量信息,包括消息队列的键值.用户ID.组ID.消息数目.读 ...
- JAVA03_21学习总结(RabbitMQ消息队列)
今日内容 1. RabbitMQ 消息队列 Rabbitmq 消息队列基于AMQP协议的消息队列就是将本来一次性完成的,耗时的,需要等待的操作分离出来-形成一个单独的模块,就是消息队列-例子:普通方式 ...
- linux 进程uhxuhao,linux 进程间通信三 消息队列以及实例
转自 http://blog.csdn.net/liang890319/article/details/8280934 代码来自:嵌入式Linux应用开发标准教程 消息可以理解为写信给某个人,这里在应 ...
- RabbitMQ入门学习系列(三).消息发送接收
快速阅读 用Rabitmq的队列管理,以及如何保证消息在队列中不丢失.通过ack的消息确认和持久化进行操作.以及Rabbit中如何用Web面板进行管理队列.消费者如何处理耗时的任务 生产者代码创建链接 ...
- 【Python学习系列三】Windows下Python第三方常用库安装
Python有丰富的第三方库,提供丰富的爬虫.数据分析等功能. 方法一:下载完整包,含编译器和常见库,https://www.continuum.io/downloads/ 针对操作 ...
- Rplidar学习(三)—— ROS下进行rplidar调试
一.建立工作空间.编译包 mkdir -p ~/catkin_rplidar/src #创建目录 cd ~/catkin_rplidar/src #打开目录#下载rplidar_ros数据包,进行移动 ...
最新文章
- 海量数据处理:从并发编程到分布式系统
- Numpy核心语法和代码整理汇总!
- sersync + rsync 实现文件的实时同步
- WebDriverAgent安装到iphone真机
- tidb mysql5.7_MYSQL5.7实时同步数据到TiDB
- Shell 编程进阶笔记
- SQL数据分析实战:好用的窗口函数
- Luogu2114 [NOI2014]起床困难综合症 【位运算】
- 设计模式(7) 续原型模式
- python的浮点数_Python的浮点数损失精度问题
- 技术人 | 如何做一个明白状况的研发主管?
- 布朗大学计算机专业怎么样,Offer捷报 | 恭喜Z同学收获布朗大学计算机科学专业Offer!...
- 百度新营销:不只是关键词了
- 海湾汉字编码表全部_汉字编码对照表
- 大华监控相机RTSP视频流
- 微信分享wx.config配置时遇到invalid signature错误的解决办法
- 【马克思主义基本原理】--第一章--【世界的物质性及发展规律】
- 曾经爱过就是彼此的慈悲
- Kotlin学习系列之:协程的取消和超时
- 【报错】VMware Workstation 与 Device/Credential Guard 不兼容.在禁用 Device/Credenti