你是否有过这样的经历:自己写的功能耗时比较长,导致用户操作时需要等待好久。你我都知道此时他们的心中应该是:“一万只草泥马在策马奔腾“。接下来我们要做的就是「优化」了!( PS :这点 B 数还是有的)。当然,如果你没有这个问题,出门左拐!
说到优化,对于 WEB 程序来说,我们接触最多的应该是 “数据库层面“ 的优化,也就是 SQL 语句优化。一般能用到的优化方式有减少操作的数据量、避免复杂查询、减少回表次数、添加有效索引等等。但是如果这些 “骚操作” 我们都用上了,没有可以优化的余地了。这个时候该咋办?其实我们还可以换个角度出发,比如当前这段代码能否利用「并行处理」来进一步提升性能呢?
在 JAVA 中就是通过多线程的方式,并行处理数据,使代码的性能进一步的提升。
比如常用的任务调度框架 XXL-JOB 中就提供了这种解决问题的思路!对于处理大数据量的任务,XXL-JOB 中提供了「分片广播任务」功能。具体做法是通过将执行器以集群方式部署,目标任务的路由策略选择"分片广播"情况,这样一次任务调度将会广播触发集群中所有执行器执行一次任务,多个机器一次处理,达到并行处理的目的。其中做法就是要将待处理的大数据分成多份,每个执行器执行其中一份数据,从而达到快速处理的目的。
以上是多机器并行处理的案例。有时候我们写的应用就是在一台机器跑,此时想要达到并行的目的,只能通过多线程的方式实现。之前遇到过这样一个功能,通过程序将 10万 多条记录插入线上 MySQL 数据库。如果单线程循环插入,耗时在分钟级。这种的优化方式可以考虑用多线程加数据分片的方式处理,将 10万 条数据切分成多个小的数据集合,然后通过多线程并行插入。可以大幅缩短执行时间。当然这种做法也要看数据库的性能,如果数据库承受不住这种并发,则要考虑别的方式。这时候需要和 DBA 做好沟通。
好了,并行处理加数据分片是一种优化思路,当我们无法通过优化已有代码来提升性能的时候,不妨考虑下这个思路。