使用java纤程解决风控第三方交互问题 java 纤程

背景

 

我们微服务架构中,内部调用采用一些rpc调用,外部通常使用一些http rest风格的接口进行互相访问。比如我们一个风控审核流程,需要调用一些第三方数据源数据或者一些第三方公司提供的数据结果集,我们整个流程的优化很大一部分在这里,我们没有办法控制它们的响应时间,也就是Latency太高了。

 

真实问题

 

我们对引擎的优化前期重点放在了对规则集匹配的部分。比如自有流程构建成引擎,前置后置调用,优化数据源匹配等,在测试环境也没有问题,但生产上就出现了效果不理想。

原因:

系统从clicent接收request,然后每个request都需要时间去调用例如B、C、D等多个服务,所以完成一个就需要几秒的时间。我们创建了一个forkjoin线程池或ThreadPoolTaskExecutor,但线程之间还是会相互阻塞,导致系统延迟度很高。

 

方案一:

就是一开始的,加入线程池,比如这样:

 

 

随着线程池的增大,吞吐量增大。但线程池不能无限增大,每个线程都会占用一定资源。

 

方案二

 

channel pool 

换成netty,所有服务都会变成异步,这涉及到流程的一些迁移和风险不可控,可以在一开始构建流程设计的时候使用,推荐。暂时发现了更好的方案

 

 

方案三

纤程 quasar

 

纤程使用的资源更少,它主要保存栈信息,所以一个系统中可以创建上万的纤程Fiber,而实际的纤程调度器只需要几个Java线程即可。

当我们在使用多线程的时候,如果存在长时间的I/O操作。这个时候线程一直处于阻塞状态,如果线程很多的时候,会存在很多线程处于空闲状态,造成了资源应用不彻底。相对的协程不一样了,在单线程中多个任务来回自行如果出现长时间的I/O操作,让其让出目前的协程调度,执行下一个任务。当然可能所有任务,全部卡在同一个点上,但是这只是针对于单线程而言,当所有数据正常返回时,会同时处理当前的I/O操作。

 

简单操作:

 

Fiber<Integer> fiber = new Fiber<>((SuspendableCallable<Integer>) () -> {
//这里用于测试内存占用量
Fiber.sleep(1);
System.out.println("in-" + finalI + "-" + LocalDateTime.now().format(formatter));
return finalI;
});
//开始执行
fiber.start();

 

maven引入:

 

 

posted @ 2020-12-16 17:17  kirsSun  阅读(367)  评论(0)    收藏  举报