java大数据、多线程及高并发的处理方案

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lihua5419/article/details/87706112

大数据量处理、多线程和高并发的问题一直是Java技术面试中比较喜欢问的问题之一,遂在此做个总结

一、数据量太大获取缓慢怎么办?

貌似这个问题在所有开发的应用系统中都会碰到这个问题,随着时间的推移,由于需求的不断演变,项目的数据量日渐增多,功能上的效率问题也会逐步显露出来,例如统计报表、查询下载、地图渲染等功能模块,当这些功能涉及到几十张表甚至上百张表时,不难想象一次性获取所有数据的时候系统将会变得异常缓慢。

1、首先从需求的设计和代码层次出发

  1. 优化我们写的代码,减少没必要的资源浪费。例如频繁地使用new对象的方式以及if else和多个for循环的嵌套使用,对于大量的if和else及switch case的优化大家可以参考多个if else如何优化多个switch case如何优化,喜欢阅读的朋友可以看下《重构——改善既有代码的设计》这本书,另外对于代码上的优化也方便于后期的维护使得代码上的可读性更高,除了逻辑控制代码,也需要注意其字符串的处理以及List的数据的处理。字符串的话,使用StringBuffer或StringBuilder,对于工具类可以通过静态方法来访问。对于List上去重或者排序之类的处理,大家可参考java8系列文章;
  2. 优化代码中的SQL语句,这也是重中之重,当查询的数据牵扯到的数据库表比较多时。频繁地使用左连接或者内连接极大地会降低数据库查询的效率,对于SQL的优化大家可使用Explain命令进行对SQL语句的检查效率,尤其要注意主表和次表的连接关系,根据Expalin的结果可对于部分字段及数据库表增加相关的索引;

2、数据库优化

对于数据库的优化,在此不再做详细探讨。有时间我会再针对数据库的优化整理出一篇文章,大致的方案有如下几点

  1. 数据库读写分离。
  2. 数据库集群和库表散列即分区分表。
  3. 数据库表结构优化。
  4. 批量读取和延迟修改
  5. SQL语句优化。
  6. 索引优化。
  7. 使用存储过程代替直接操作。

3、使用缓存

  1. 框架自带的缓存:如果你了解hibernate和mybatis的缓存机制那就好办了,大家可参考mybatis一级缓存和二级缓存
  2. 缓存的方式还可以通过程序代码将数据直接保存到内存中,例如通过使用Map或者ConcurrentHashMap;
  3. 另外还有,就是使用缓存框架:Redis、Ehcache、Memcache等。 使用缓存框架的时候,我们需要关心的就是什么时候创建缓存和缓存失效策略(注意:使用缓存的时候还要考虑到缓存服务器发生故障时候如何进行容错处理,是使用N多台服务器缓存相同的数据,通过分布式部署的方式对缓存数据进行控制,当一台发生故障的时候自动切换到其他的机器上去;还是通过Hash一致性的方式,等待缓存服务器恢复正常使用的时候重新指定到该缓存服务器。Hash一致性的另一个作用就是在分布式缓存服务器下对数据进行定位,将数据分布在不用缓存服务器上);

二、多线程高并发如何优化?

4、HTML静态化

  1. 我们可以将页面静态化提供访问来缓解服务器压力,能够缓解服务器压力加大以及降低数据库数据的频繁交换。适合于某些访问量过大,但是内容不经常改变的页面,如首页、公告页等;
  2. 前后端分离,即前端与后台应用分开部署,提高用户访问静态代码的速度,降低对后台应用访问。前端界面的显示是通过后台服务器的接口返回的json数据进行渲染后返回给前端浏览器进行解析执行;

5、图片服务器分离

  1. 对于web服务器来说,图片是最消耗资源的,于是我们有必要把图片与页面进行分离,我们把图片放到独立的图片服务器。这样的架构可以降低提供页面访问请求的服务器系统压力,并且可以保证系统不会因为图片的问题而崩溃。在图片服务器上,我们可以对不同的配置进行优化。
  2. 静态资源部署至CDN上,即直接将静态资源全部存放在CDN服务器上。因为之前项目中的JavaScript,CSS以及img文件都是存放在CDN服务器上,将HTML文件一起存放到CDN上之后,可以将静态资源统一放置在一种服务器上,便于前端进行维护;而且用户在访问静态资源时,可以很好利用CDN的优点——CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。

6、负载均衡

1.软/硬件负载均衡

软件负载均衡解决方案是指在一台或多台服务器相应的操作系统上安装一个或多个附加软件来实现负载均衡,如DNS Load Balance,CheckPoint Firewall-1 ConnectControl等,它的优点是基于特定环境,配置简单,使用灵活,成本低廉,可以满足一般的负载均衡需求。

软件解决方案缺点也较多,因为每台服务器上安装额外的软件运行会消耗系统不定量的资源,越是功能强大的模块,消耗得越多,所以当连接请求特别大的时候,软件本身会成为服务器工作成败的一个关键;软件可扩展性并不是很好,受到操作系统的限制;由于操作系统本身的Bug,往往会引起安全问题。

硬件负载均衡解决方案是直接在服务器和外部网络间安装负载均衡设备,这种设备通常称之为负载均衡器,由于专门的设备完成专门的任务,独立于操作系统,整体性能得到大量提高,加上多样化的负载均衡策略,智能化的流量管理,可达到最佳的负载均衡需求。

负载均衡器有多种多样的形式,除了作为独立意义上的负载均衡器外,有些负载均衡器集成在交换设备中,置于服务器与Internet链接之间,有些则以两块网络适配器将这一功能集成到PC中,一块连接到Internet上,一块连接到后端服务器群的内部网络上。

一般而言,硬件负载均衡在功能、性能上优于软件方式,不过成本昂贵。

2.本地/全局负载均衡

负载均衡从其应用的地理结构上分为本地负载均衡(Local Load Balance)和全局负载均衡(Global Load Balance,也叫地域负载均衡),本地负载均衡是指对本地的服务器群做负载均衡,全局负载均衡是指对分别放置在不同的地理位置、有不同网络结构的服务器群间作负载均衡。

本地负载均衡能有效地解决数据流量过大、网络负荷过重的问题,并且不需花费昂贵开支购置性能卓越的服务器,充分利用现有设备,避免服务器单点故障造成数据流量的损失。其有灵活多样的均衡策略把数据流量合理地分配给服务器群内的服务器共同负担。即使是再给现有服务器扩充升级,也只是简单地增加一个新的服务器到服务群中,而不需改变现有网络结构、停止现有的服务。

全局负载均衡主要用于在一个多区域拥有自己服务器的站点,为了使全球用户只以一个IP地址或域名就能访问到离自己最近的服务器,从而获得最快的访问速度,也可用于子公司分散站点分布广的大公司通过Intranet(企业内部互联网)来达到资源统一合理分配的目的。

全局负载均衡有以下的特点:

实现地理位置无关性,能够远距离为用户提供完全的透明服务。

除了能避免服务器、数据中心等的单点失效,也能避免由于ISP专线故障引起的单点失效。

解决网络拥塞问题,提高服务器响应速度,服务就近提供,达到更好的访问质量。

6、使用nosql和Hadoop技术

7、集群与分布式架构

8、反向代理

客户端直接访问的服务器并不是直接提供服务的服务器,它从别的服务器获取资源,然后将结果返回给用户。

代理服务器和反向代理服务器:

代理服务器是代我们访获取资源,然后将结果返回。例如,访问外网的代理服务器。反向代理服务器是我们正常访问一台服务器的时候,服务器自己调用了别的服务器。

反向代理就是说,用户的请求请求到负载均衡的设备上,负载均衡设备再讲请求分发到空闲的应用服务器上处理,处理完成之后再通过负载均衡设备返回给用户,这样对于用户来说,后来的分发是不可见的。

反向代理的实现

  1. 需要有一个负载均衡设备来分发用户请求,将用户请求分发到空闲的服务器上
  2. 服务器返回自己的服务到负载均衡设备
  3. 负载均衡将服务器的服务返回用户

代理服务器我们主动使用,是为我们服务的,不需要有自己的域名;反向代理是服务器自己使用的,我们并不知道,有自己的域名。

微信扫描下方二维码(新开通的个人微信公众号)  更多优质资源及优质文章及时获取 请大家多多支持哦

猜你喜欢

转载自blog.csdn.net/lihua5419/article/details/87706112