为什么需要学习 Java 并发?
从提升性能角度来说
从开发者角度来说
实践一:风控规则引擎——策略执行
互联网企业风控安全部门每时每刻都需要和黑灰产对抗,保护企业遭受不必要的经济损失。风控策略团队在对抗的过程中,沉淀出一系列风险识别策略,用以检测当前业务请求中否存在高危操作。
风控安全团队需要评估业务在运行流程中,是否存在黑产能够获取利益点的地方,即“ 风险卡点 ”。评估后,需要业务在每次流程经过风险卡点处,需透传业务信息给风控服务,风控服务在很多时间内进行大量决策计算,并返回业务方决策结果(ACCEPT-通过/REVIEW-人工,需进一步信息确认/REJECT-拒绝,高危操作)。如图展示的是营销活动——裂变类活动风险卡点。

营销裂变流程风险卡点图
一条业务请求耗时一般在 300 ~ 500 ms 之间,如果超过这个区间,可能就需要定位调优哪个节点耗时高了。大型互联网公司系统架构比较复杂,完整的业务可能有几十甚至上百个服务系统,你触发的一次请求,可能中途会经过多少服务超过你想象。
如上述,业务对风控服务的性能要求很高,一般控制在 100 ms 以内。但风控内部排查业务请求涉及大量策略和规则,如何短时间内执行完,且又不阉割策略呢?答案是并发变成。风控内部大量使用并发,以满足海量请求和计算需求,我将以策略规则的执行来举例如何编写编发变成代码。如下是风控服务一次请求的大致执行流程:

风控流程执行图
可以看到,一次风控请求的判定,涉及大量的规则判定,此时如果没有并发,会出现什么效果?

串行&并行执行规则图
全部串行执行策略和规则的话,可能几秒都不定能计算出来,此时我们需要使用 Java 并发来满足性能需求。 核心代码如下:
- public class RuleSessionExecutor {
-
- // 线程池
- private final static ExecutorService executor = new ThreadPoolExecutor(
- Runtime.getRuntime().availableProcessors() * 8,
- Runtime.getRuntime().availableProcessors() * 8,
- 0L, TimeUnit.MILLISECONDS,
- new LinkedBlockingQueue<Runnable&