你知道如何处理大数据量吗?(数据拆分篇)


目录

  1. 前言
  2. 场景
  3. 为什么会很慢
  4. 优化数据获取
  5. 拆分数据
  6. 约定分片
  7. 高可用
  8. 总结

前言

最近发现员工在处理业务时,一旦遇到大的数据量,就会很慢,而且经常会把jvm搞死。小伙伴们还理所应当的反馈,数据量太大了,所以这样子。

记得毕业的时候,面试华为有个面试题,【如何网络传输几个G的大文件】?当初年轻没有答上来。下面我们就来分析一下如何处理大的数据量。

场景

现在有100万条数据等待着处理,我们怎么去处理它?而且

能否抽象成公共的方法进行处理?我们这边讨论的是数据已经准备好了,可以理解为已经存储在数据库中了。

我们来分析一下正常的处理数据流程

1、获取要处理的数据

2、处理数据

3、返回处理结果以及状态:成功或失败

4、处理结果进行上报

你知道如何处理大数据量吗?(数据拆分篇)

为什么会很慢

数据处理,一般的方法,先获得数据,再对数据进行处理,等待处理结果,再上报

  • 获取数据慢

如果有100万的数据量,那我们在获取数据这个逻辑,就要去获取100万次,数据存储在数据库中,那就要和数据库交互100万次,这个肯定会慢

  • 处理数据慢

如果处理一条数据,我们耗时需要100ms,那么处理100万条,就需要10万秒,也就是需要27.7个小时,单单处理数据就会很慢。

  • 上报数据慢

处理一条数据后,要把结果上报,如果一条数据处理完后,上报到业务系统需要100ms,那100万条,也需要27.7个小时,也会很慢

这个就是我们小伙伴按照正常的处理流程去处理大数据量时,会很慢的原因。根本原因是用同步方式进行业务处理

如何去解决?核心思想就是分拆模块,并行处理。

记得华为【如何网络传输几个G的大文件】的面试题吗?再想想一些下载软件,是如何下载大的文件的?小伙伴应该一下子就会说用多线程,把大文件分拆成N个小文件,1个线程单独去处理一个小文件。

优化数据获取

在获取数据时,一般是一次处理一条数据,每次到数据库中获取。那我们可以优化一下:

  • 批量数据

每次获取数据时,不要获取一条数据进行处理,如:每次去数据库获取个1000条数据到本地jvm缓存中,然后进行本地循环处理数据

处理完1000条之后,再去数据库取1000条数据,这样的批量获取数据,就极大的优化了和数据库交互的次数,提升了1000倍。

我们再想想可以不可以再优化一下。我们上面的批量方案,是在单个jvm进程中处理的,那能不能有多个进程或服务器去处理数据呢?

拆分数据

你知道如何处理大数据量吗?(数据拆分篇)

上图中,就利用多个服务器进行处理数据,这样又提升了处理数据的能力,其实就是把数据拆分到多个处理服务器中。不过引入这个方案就会遇到一个问题,就是如何避免数据重复处理?

这个问题的产生是因为在获取数据时,不知道数据是否已经被拿走去处理了,当然我们可以把数据增加个处理状态:【未处理,处理中,处理成功,处理失败】获取数据时选择【未处理】的数据,获取到数据后,要把数据的处理状态设置为【处理中】。

上面的业务逻辑是没有问题,但如果多个服务器去同时去获取时,会产生竞争,也会有可能获取到重复的数据。

  • 分布式锁

这个时候可以引入分布式锁,避免同时去获取数据, 小伙伴不了解分布式锁,可以看之前的文章。

我们再想一下,是否可以在优化一下,因为利用分布锁也是比较影响性能的,多服务器之间同时获取时,还是要等待的,虽然他们大多数的时候不可能同时完成一批数据,但也是有可能的。

约定分片

我们可以采取约定分片的方式,如服务器A只处理ID为【1~30万】数据,服务器B只处理ID【30万~60万】的数据,服务器C只处理【60万~100万】的数据

也就是程序在获取数据的时候,我们已经规划好分片的规则,让不同的服务器去处理不同的分片数据,这样多个服务器就不存在数据竞争的问题。因为他们处理的是不同的数据。

你知道如何处理大数据量吗?(数据拆分篇)

如果觉得服务器不够,可以在增加服务器,分片规则可以设置在数据库中,和之前的 原理类似。

高可用

我们发现上面的设计,一旦某个分片处理服务器挂了,那这些分片的数据就没法处理了。小伙伴有没有解决方案?其实很简单,就是在分片的基础上面,加上集群化处理

你知道如何处理大数据量吗?(数据拆分篇)

上图中,增加了服务器A-1,A-2,同时负责【1~30万】的数据处理任务,一旦服务器A挂了,A-1,A-2照样可以处理数据

当然一样会遇到数据重复处理的问题,这个时候就可以采用分布锁方案,进行小范围加锁。

总结

这里老顾介绍了如何把大数据量进行拆分,划分成小份,同步进行处理,这样就可以极大提升处理效率。

当然这里介绍的是处理大数据量第一步,如何设计获取数据?下面老顾还会介绍处理数据的优化、以及数据上报等,不过相对获取数据的方案,处理数据以及上报数据结果,相对比较简单,小伙伴们先自行思考一下。


-End-

如有收获,请帮忙转发,您的鼓励是作者最大的动力,谢谢!

10几年的经验实战分享

相关微服务,分布式,高并发,高可用,企业实战,干货等原创文章正在路上

1、

2、

3、

4、

5、

6、

7、

8、

9、

10、

11、

12、


分享到:


相關文章: