异步化组件的场景选型及实现

本文探讨了在Java开发中处理无血缘关系任务的异步化需求,分析了Akka和RxJava方案的优缺点,并提出了一种基于JUC包的完整解决方案,强调可监控性、容灾性和零成本接入。通过实例展示了如何实现超时控制和资源管理,最终选择了JUC的升级版作为异步化组件。
摘要由CSDN通过智能技术生成

前景概要

在我们日常的开发过程中经常会碰到无血缘关系的流水账逻辑(数据补全、通知逻辑等),这个时候我们通常会采用异步化的方式去处理从而加快响应速度。与此同时,伴随着上下游依赖的服务变多,对应的可能也会产生一系列的问题包括不限于问题难以排查性能难以保证等。在闲鱼也不例外:

  • 补齐的串行操作(这里指串行去实现多次网络io)存在性能瓶颈,严重影响到了接口rt。

  • 逻辑单元化程度不好,逻辑"自由飞翔"导致代码可读性较差,单元逻辑相关指标也难以衡量。

基于上述的描述,我们想就此抽象出一个异步化组件去解决对应的问题。那先给自己定几个小目标吧!

  • 可监控:每个单元逻辑生命周期内的所有状态和行为(成功,失败,rt等关键指标)都在监控范围内。

  • 容灾性: 有fallback机制,当逻辑单元内出现大量异常(通常指的是超时)的时候能堪大用。

  • 零成本接入:接入使用方便,做到拆箱即用。

举个栗子

不超时场景

假设逻辑单元L有a, b, c三个任务, 执行时长分别为t1=1, t2=2, t3=3, 超时时间为4. 如图所示:

现在希望的结果是:

  1. 该逻辑单元L执行时间为3

  2. a任务执行成功1次耗时为1, b任务执行成功1次耗时为2, c任务执行成功1次耗时为3

超时场景

假设假设逻辑单元L有a, b, c三个任务, 执行时长分别为t1=3, t2=5, t3=6, 超时时间为4. 如图所示:

现在希望的结果是:

  1. 该逻辑单元L执行时间为4

  2. a任务执行成功1次耗时为3, b任务执行失败, c任务执行失败

  3. b和c线程在失败后线程停止, 不继续占用线程池资源

下面所有的方案都是围绕 超时场景展开

方案之akka

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值