03 2017 档案
摘要:在团队的重试与延迟调度项目中,使用了基于DelayQueue的方式来实现时间调度和触发,此处,对DelayQueue进行一些梳理。 首先是Queue接口,关于队列的含义,不再赘述。如下,Queue接口方法,按抛异常或返回特定值(null)可以分为两类如下图: 接下来是BlockingQueue接口,
阅读全文
摘要:延迟调度系统,核心在于基于时间的调度。上问说道,粗糙的时间调度可以使用job来执行,其时间误差可能达到分钟级。当需要进行更加精确的时间调度,就需要引入额外的手段了,此处,主要介绍两个方法:DelayQueue与环形队列。 (一)基于DelayQueue的延迟调度 关于DelayQueue的阐述,参考
阅读全文
摘要:首先,来说一下业务场景,也即什么时候,需要有这么一个系统,举两个例子: 1. 订单推送——点评侧垂直业务产生新的订单之后,需要推送给美团订单中心,以在美团APP展示出来。这种通过RPC调用的推送,是可能调用失败的,那么失败之后怎么处理呢?业务线程自己立即重试还是睡一会再重试都不是很合理。在推送失败后
阅读全文
摘要:在项目中,常常会遇到这么一种场景,即对一批/一种/一堆数据,进行链式的处理。举个栗子,拿到一个task后,需要对这个task进行校验处理、状态变更处理、计算并回填数据处理等等各种处理,这种情况下,最适合的编码方式就是使用责任链了: 定义一个taskprocessor接口: 然后,再定义诸多的实现类,
阅读全文
摘要:首先说说与ThreadLocal相识的背景。在项目中,service有一些逻辑处理{如对主从延迟敏感的下单逻辑}需要强制走主库的。就查了查公司数据库框架zebra强制走主库的方式,发现其主要就是在业务线程的context中写入了一个ThreadLocal<Boolean>变量,当要进行SQL路由时,
阅读全文

浙公网安备 33010602011771号