Abstract在web开发过程中,我们经常会遇到接口RT高的情况。除了事后的监控和优化,我们还需要掌握一些常用的方法,避免写出慢接口。前端到后端的调用一般要经过网关层、应用层、存储层。每一层都可以优化,本文主要是应用层优化。对常见的性能优化思路进行了理论分析。性能优化方法通常需要对数据库进行批量请求。我们一般使用in来提高数据库查询效率和调用外部服务。我们还需要要求依赖方提供批量接口,避免多次网络请求批量查询。id的数量不宜过多。我在sqlIN一文中分析过,当IN数量过多时,性能会下降。同一个服务间调用,数据量太大,占用带宽大。所以这个时候需要分批调用。Listres=Lists.partition(ids,200).parallelStream().flatMap(batch->mServiceA.batchGetA(batch).stream()).collect(Collectors.toList());并行/并发处理,使用多线程可以提高效率。比如接口需要请求多个外部接口/数据库,相互之间不存在依赖关系,因为这些操作都是IO操作,可以从顺序执行变为并行执行,充分利用CPU的处理能力,例如CompletableFuturea=CompletableFuture.supplyAsync(()->mServiceA.getA());CompletableFutureb=CompletableFuture.supplyAsync(()->mServiceB.getB());CompletableFuture.allOf(a,b).加入();异步的、非强依赖的调用可以通过异步化来异步处理,分为读和写。比如写是弱依赖,可以使用@Async或者其他操作。如果是读取,则不是必要数据,还需要超时处理,因为外部调用有网络原因,都是不可靠的CompletableFuturea=CompletableFuture.supplyAsync(()->mServiceA.getA());CompletableFutureb=CompletableFuture.supplyAsync(()->mServiceB.getB());try{CompletableFuture.allOf(a,b).get(1000,TimeUnit.MILLISECONDS);}catch(Exceptionex){如果(!a.isDone()){}if(!b.isDone()){}}减少数据处理量,例如拉取外部数据,全周期拉取,增量使用事件通知机制,可以减少数据处理避免深度分页数据库的深度分页性能比较差,业务上需要避免深度分页缓存。缓存本质上是直接从读取速度快的设备中获取数据。通过空间交换时间。DB中的数据可以缓存,外部服务的数据也可以使用多级缓存来缓存,以达到性能最大化。