【RabbitMQ 实战指南】一 延迟队列】的更多相关文章

1.什么是延迟队列 延迟队列中存储延迟消息,延迟消息是指当消息被发送到队列中不会立即消费,而是等待一段时间后再消费该消息. 延迟队列很多应用场景,一个典型的应用场景是订单未支付超时取消,用户下单之后30分钟内未支付成功,则把订单取消. 2.使用要求 RabbitMQ 本身没有直接支持延迟队列的功能,但是可以通过过期时间TTL和死信队列来模拟延迟队列. 过期时间TTL 可以参考文章: [RabbitMQ 实战指南]一 过期时间TTL 死信队列可以参考文章:[RabbitMQ 实战指南]一 死信队列…
1.RabbitMQ 安装 RabbitMQ 的安装可以参考官方文档:https://www.rabbitmq.com/download.html 2.管理页面 rabbitmq-management插件提供基于HTTP的API方式管理和监控你的RabbitMQ服务器. 2.1.开启 rabbitmq_management 插件 rabbitmq-plugins enable rabbitmq_management windows 下运行如下命令 rabbitmq-plugins.bat ena…
简介 延迟队列存储的消息是不希望被消费者立刻拿到的,而是等待特定时间后,消费者才能拿到这个消息进行消费.使用场景比较多,例如订单限时30分钟内支付,否则取消,再如分布式环境中每隔一段时间重复执行某操作. 下面举一个简单的例子,例子大概意思是分别在首次发送消息后的10秒.40秒.100秒后重新读取到消息.为了直观,不使用RabbitMQ其他多余的特性.   准备工作 在Centos7下安装RabbitMQ,版本为3.6.12单机版本(非集群),IP是127.0.0.1,端口是15672,使用web…
备份交换器 备份交换器,英文名称为Alternate Exchange,简称AE.通过在声明交换器(调用channel.ExchangeDeclare方法)时添加alternate-exchange参数来实现. 备份交换器工作流程如下: using (var channel = connection.CreateModel()) { //设置备胎交换器参数 var arguments = new Dictionary<string, object>(); arguments.Add("…
RabbitMQ 可以对消息和队列设置过期时间(TTL) 1.设置消息的TTL 目前有两种方式可以设置消息的TTL 第一种方式是通过队列属性设置,队列中所有消息都有相同的过期时间 第二种方式是对消息本身进行单独的设置,每条消息的TTL可以不同 如果两种方法一起使用,则消息的TTL已较小的数值为准. 1.1.通过设置队列属性来控制消息的TTL 在声明队列的时候可以通过 x-message-ttl 属性来控制消息的TTL, 这个参数的单位是毫秒.如果不设置 TTL.则表示此消息不会过期 ;如果将 T…
开发中关键的Class和Interface有Channel.Connection.ConnectionFactory.Consumer等,与RabbitMQ相关的开发工作,基本上是围绕Connection和Channel这两个类展开的. 连接RabbitMQ 一个Connection可以创建多个Channel实例,但Channel实例不能在线程间共享,应用程序应该为每一个线程开辟一个Channel. Channel或者Connection中有个isOpen方法可以用来检测其是否已处于开启状态.但…
什么是消息中间件 消息(Message)是指在应用间传送的数据.消息可以非常简单,比如只包含文本字符串.JSON等,也可以很复杂,比如内嵌对象. 消息队列中间件(Message Queue Middleware,简称为MQ)是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成.通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信. 面向消息的中间件(简称为MOM,Message Oriented Middleware)提供了以松散耦合的灵活…
1.死信队列 DLX,全称为 Dead-Letter-Exchange,可以称之为死信交换器.当消息在一个队列中变成死信(dead message)之后,它能被发送到另一个交换器中,这个交换器就是DLX,绑定DLX的队列就称之为死信队列. DLX 也是一个正常的交换器,和一般的交换器没有区别,它能在任何的队列上被指定,实际上就是设置某个队列的属性.当这个队列中存在死信时,RabbitMQ就会自动地将这个消息重新发布到设置的DLX上去,进而被路由到另一个队列,即死信队列.然后可以监听这个死信队列中…
1.消息中间件 1.1.什么是消息中间件 消息中间件(Message Queue Middleware,简称 MQ)是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通道来进行分布式系统的集成. 1.2.消息中间件的作用 解耦:在项目启动之初来预测将来项目会碰到什么需求,是极其困难的.消息队列在处理过程中间插入了一个隐含的.基于数据的接口层,两边的处理过程都要实现这一接口.这允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 冗余(存储):有时在处理数据的时候…
持久化 持久化可以提高RabbitMQ的可靠性,防止异常情况下的数据丢失.RabbitMQ的持久化分为三个部分:交换器的持久化.队列的持久化和消息的持久化. 交换器的持久化通过声明队列时将durable参数置为true实现.如果交换器不设置持久化,在RabbitMQ服务重启之后,相关交换器的元数据会丢失,但消息不会丢失,只是不能再将消息发送到这个交换器.一个长期使用的交换器来建议将其置为持久化的. 队列的持久化通过在声明队列时将durable参数置为true实现.如果队列不设置持久化,在Rabb…
RabbitMQ Management插件还提供了基于RESTful风格的HTTP API接口来方便调用.一共涉及4种HTTP方法:GET.PUT.DELETE和POST.GET方法一般用来获取如集群.节点.队列.交换器等信息.PUT方法用来创建资源,如交换器.队列之类的.DELETE方法用来删除资源.POST方法也是用来创建资源的,与PUT不同的是,POST创建的是无法用具体名称的资源.比如绑定关系(bindings)和发布消息(publish)无法指定一个具体的名称. 点击Web管理界面左下…
RabbitMQ的日出输入方式有很多种:file.console .syslog .exchange. 在RabbitMQ中,日志级别有none(0).critical(4).error(8).warning(16).info(64).debug(128)这5种,如果消息的级别高于日志的级别则不会被发送,比如warning级别的日志包含warning和error级别的日志,none表示不输出日志. 日志文件 RabbitMQ的日志文件默认存放在/var/log/rabbitmq文件夹内. 通过c…
RabbitMQ 的优化 channel prefetch Count 死信队列 什么是死信队列 使用场景 代码实现 延迟队列 什么是延迟队列 使用场景 实现延迟队列的方式 Queue TTL Message TTL 使用 Queue TTL 设置过期时间 使用 Message TTL 设置过期时间 使用插件还是Queue TTL处理延迟队列呢? 参考 RabbitMQ 的优化 channel 生产者,消费者和 RabbitMQ 都会建立连接.为了避免建立过多的 TCP 连接,减少资源额消耗.…
目录 应用场景 消息延迟推送的实现 测试结果 应用场景 目前常见的应用软件都有消息的延迟推送的影子,应用也极为广泛,例如: 淘宝七天自动确认收货.在我们签收商品后,物流系统会在七天后延时发送一个消息给支付系统,通知支付系统将款打给商家,这个过程持续七天,就是使用了消息中间件的延迟推送功能. 12306 购票支付确认页面.我们在选好票点击确定跳转的页面中往往都会有倒计时,代表着 30 分钟内订单不确认的话将会自动取消订单.其实在下订单那一刻开始购票业务系统就会发送一个延时消息给订单系统,延时30分…
延迟任务应用场景 场景一:物联网系统经常会遇到向终端下发命令,如果命令一段时间没有应答,就需要设置成超时. 场景二:订单下单之后30分钟后,如果用户没有付钱,则系统自动取消订单. 场景三:过1分钟给新注册会员的用户,发送注册邮件等. 实现方案 定时任务轮询数据库,看是否有产生新任务,如果产生则消费任务 pcntl_alarm为进程设置一个闹钟信号 swoole的异步高精度定时器:swoole_time_tick(类似javascript的setInterval)和swoole_time_afte…
什么是消息队列? 就是生产者生产一条消息,发送到这个rabbitmq,消费者连接rabbitmq并且进行消费,生产者和消费者并需要知道对方是如何工作的,从而实现程序之间的解耦,异步和削峰,这也就是消息队列的作用. 使用的场景也有很多,比如用户支付购买之后的发送短信,增加用户积分等等,只要能将业务逻辑抽象出来,就能很好得使用它. 下面进入正题: 先来介绍一下基本概念和参与生命周期的各个成员. publisher:消息生产者,负责创建消息,并发送到代理服务器(rabbitmq) message:发送…
前言 在 jdk 的 juc 工具包中,提供了一种延迟队列 DelayQueue.延迟队列用处非常广泛,比如我们最常见的场景就是在网购或者外卖平台中发起一个订单,如果不付款,一般 15 分钟后就会被关闭,这个直接用定时任务是不好实现的,因为每个用户下单的时间并不确定,所以这时候就需要用到延迟队列. 什么是延迟队列 延迟队列本身也是队列,只不过这个队列是延迟的,意思就是说当我们把一条消息放入延迟队列,消息并不会立刻出队,而是会在到达指定时间之后(或者说过了指定时间)才会出队,从而被消费者消费. 利…
本文来自 网易云社区 . RabbitMQ在金融系统,OpenStack内部组件通信和通信领域应用广泛,它部署简单,管理界面内容丰富使用十分方便.笔者最近在研究RabbitMQ部署运维和代码架构,本篇文章主要记录下RabbitMQ存储机制相关内容和源码分析. 一.RabbitMQ进程架构 Erlang是基于Actor模型的一门天然多进程.分布式和高并发的语言.一个Erlang虚拟机对应一个操作系统进程,一个Erlang进程调度器对应一个操作系统线程,一般来说,有多少个CPU核就有多少个调度器.…
一.需求背景 当用户在商城上进行下单支付,我们假设如果8小时没有进行支付,那么就后台自动对该笔交易的状态修改为订单关闭取消,同时给用户发送一份邮件提醒.那么我们应用程序如何实现这样的需求场景呢?在之前的<C# Redis缓存过期实现延迟通知实战演练>分享课程中阿笨最后总结的时候说过Redis Pub/Sub是一种并不可靠地消息机制,他不会做信息的存储,只是在线转发,那么肯定也没有ack确认机制,另外只有订阅段监听时才会转发!我们是否有更好的方式去实现呢?今天给大家分享的比较好的解决方案就是通过…
前言 前段时间在编写通用的消息通知服务时,由于需要实现类似通知失败时,需要延后几分钟再次进行发送,进行多次尝试后,进入定时发送机制.此机制,在原先对接银联支付时,银联的异步通知也是类似的,在第一次通知失败后,支付标准服务会重发,最多发送五次,每次的间隔时间为1.4.8.16分钟等.本文就简单讲解下使用RabbitMQ实现延时消息队列功能. 前言 一点知识 延时队列使用场景 RabbitMQ实现延时队列 存活时间(Time-To-Live 简称 TTL) 死信交换(Dead Letter Exch…
最近在研究rabbitmq,项目中有这样一个场景:在用户要支付订单的时候,如果超过30分钟未支付,会把订单关掉.当然我们可以做一个定时任务,每个一段时间来扫描未支付的订单,如果该订单超过支付时间就关闭,但是在数据量小的时候并没有什么大的问题,但是数据量一大轮训数据库的方式就会变得特别耗资源.当面对千万级.上亿级数据量时,本身写入的IO就比较高,导致长时间查询或者根本就查不出来,更别说分库分表以后了.除此之外,还有优先级队列,基于优先级队列的JDK延迟队列,时间轮等方式.但如果系统的架构中本身就有…
一.前言 延迟队列的使用场景:1.未按时支付的订单,30分钟过期之后取消订单:2.给活跃度比较低的用户间隔N天之后推送消息,提高活跃度:3.过1分钟给新注册会员的用户,发送注册邮件等. 实现延迟队列的方式有两种: 通过消息过期后进入死信交换器,再由交换器转发到延迟消费队列,实现延迟功能: 使用rabbitmq-delayed-message-exchange插件实现延迟功能: 注意: 延迟插件rabbitmq-delayed-message-exchange是在RabbitMQ 3.5.7及以上…
1. demo详解 1.1 工程结构: 1.2 pom 定义jar包依赖的版本.版本很重要,rabbit依赖spring,两者必须相一致,否则报错: <properties> <springframework.version>4.2.7.RELEASE</springframework.version> <spring-rabbit.version>1.6.1.RELEASE</spring-rabbit.version> </proper…
一.说明 在实际业务场景中可能会用到延时消息发送,例如异步回调失败时的重发机制. RabbitMQ本身不具有延时消息队列的功能,但是可以通过rabbitmq-delayed-message-exchange来实现(也可以通过TTL(Time To Live).DLX(Dead Letter Exchanges)特性实现,我们主要讲解通过延迟插件来实现的方法).利用RabbitMQ的这种特性,应该可以实现很多现实中的业务,我们可以发挥想象. 二.安装插件 RabbitMQ的安装请参考我的文章“Ra…
rabbitmq延迟队列 rabbitmq实现延迟队列用了rabbitmq-delayed-message-exchange插件,需要提前安装,并启用. 原理 其原理是通过Exchange来实现延迟功能,即在Exchange中根据各个message的x-delay头设置延迟时间,时间到达后才发送到对应的queue,进而被queue消费. 实现 其实现方法为: 正常我们申明一个Exchange只需要指定其类型(direct,fanout,topic等)即可,而声明延迟Exchange需要指定typ…
延迟消息就是指当消息被发送以后,并不想让消费者立即拿到消息,而是等待指定时间后,消费者才拿到这个消息进行消费. 延迟队列 订单业务: 在电商/点餐中,都有下单后30分钟内没有付款,就自动取消订单. 短信通知:下单成功后60s之后给用户发送短信通知. 失败重试:业务操作失败后,间隔一定的时间进行失败重试. 这类业务的特点就是:非实时的,需要延迟处理,需要进行失败重试.一种比较笨的方法是采用定时任务,轮训数据库,方法简单好用,但性能低下,在高并发情况下容易弄死数据库,间隔时间不好设置,时间过大,影响…
在第三方支付中,例如支付宝.或者微信,对于订单请求,第三方支付系统采用的是消息同步返回.异步通知+主动补偿查询的补偿机制. 由于互联网通信的不可靠性,例如双方网络.服务器.应用等因素的影响,不管是同步返回.异步通知.主动查询报文都可能出现超时无响应.报文丢失等情况,所以像支付业务,对结果的通知一般采用几种方案结合的补偿机制,不能完全依赖某一种机制. 例如一个支付结果的通知,一方面会在支付页面跳转时候返回支付结果(一般只用作前端展示使用,非最终状态),同时会采用后台异步通知机制(有前台.后台通知的…
本文口味:鱼香肉丝   预计阅读:10分钟 一.说明 在上一篇中,介绍了RabbitMQ中的死信队列是什么,何时使用以及如何使用RabbitMQ的死信队列.相信通过上一篇的学习,对于死信队列已经有了更多的了解,这一篇的内容也跟死信队列息息相关,如果你还不了解死信队列,那么建议你先进行上一篇文章的阅读. 这一篇里,我们将继续介绍RabbitMQ的高级特性,通过本篇的学习,你将收获: 什么是延时队列 延时队列使用场景 RabbitMQ中的TTL 如何利用RabbitMQ来实现延时队列 二.本文大纲…
场景 用户下单后,如果30min未支付,则删除该订单,这时候就要可以用延迟队列 准备 利用rabbitmq_delayed_message_exchange插件: 首先下载该插件:https://www.rabbitmq.com/community-plugins.html 然后把该插件放到rabbitmq安装目录plugins下: 进入到sbin目录下,执行"rabbitmq-plugins.bat enable rabbitmq_delayed_message_exchange";…
RabbitMQ延迟队列插件安装 一.下载插件 下载地址:https://www.rabbitmq.com/community-plugins.html 二.把下载的插件放到指定位置 下载的文件为zip格式,将zip格式解压,插件格式为ez,将文件复制到插件目录: Linux /usr/lib/rabbitmq/lib/rabbitmq_server-3.7.17/plugins Windows C:\Program Files\RabbitMQ Server\rabbitmq_server-3…