java高并发的解决方案

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

java 高并发的解决方案

对于我们开发的网站,如果网站的访问量非常大的话,

那么我们就需要考虑相关的并发访问问题了。而并发问题 是绝大部分的

程序员头疼的问题 ! 下面是小编分享的,欢迎

大家阅读 !

常用的,可能最初是一个 mysql 主机,当数据增加到 100

万以上,那么,MySQ 啲效能急剧下降。常用的优化措施是

M-S (主-从)方式进行同步复制,将查询和操作和分别在不

同的服务器上进行操作。我推荐的是 M-M-Slaves 方式, 2

个主 Mysql ,多个 Slaves ,需要注意的是,虽然有 Master ,但是同时只有 1 个是 Active ,我们可以在一定时 候切

换。之所以用2个M 是保证M 不会又成为系统的

SPOF 。

Slaves 可以进一步负载均衡,可以结合

LVS,从而将 以上架构可以抗衡到一定量的负载,但是随着用户进

步增加,你的用户表数据超过 1千万,这时那个 M 变成 了 SPOF 你不能任意扩充 Slaves ,否则复制同步的开销将

直线上升,怎么办 ?我的方法是表分区,从业务层面上进行

分区。最简单的,以用户数据为例。根据一定的切分方式, 比如 id ,

切分到不同的数据库集群去。

java 高并发的解决方案】

般来说MySQl 是最

2个

select 操作适当的平衡到不同的

slaves 上。

全局数据库用于 meta 数据的查询。缺点是每次查询,

会增加一次,比如你要查一个用户 nightsailer, 你首先要

后再到指定的 cluster 找到 nightsailer 的实际数据

个 cluster 可以用 m-m 方式,或者 m-m-slaves 方式。 个可以扩展的结构,随着负载的增加,你可以简单的增 加新的 mysql

cluster 进去。

网站HTML 静态化解决方案 当一个Servlet 资源请求到达WE 餌艮务

器之后我们会

填充指定的JSP 页面来响应请求:

HTTP 请求---Web 服务器---Servlet-- 业务逻辑处理--

访问数据 -- 填充 JSP-- 响应请求

HTML 静态化之后:

HTTP 请求---Web 服务器---Servlet--HTML--

响应请求

缓存、负载均衡、存储、队列

存集群,一般来说部署 10 台左右就差不多 (10g 内存池 ) 。 需要注意一点,千万不能用使用

swaP,最好关闭 linux 的swap 。

2. 负载均衡 / 加速。可能上面说缓存的时候,有人第

想的是页面静态化,所谓的静态 html ,我认为这是常识, 不属于要点

了。页面的静态化随之带来的是静态服务的负 载均衡和加速。我认为

Lighttped+Squid 是最好的方式了。

到全局数据库群找到 nightsailer

对应的 cluster id ,然

这是

1. 缓存是另一个大问题,我一般用 memcachec 来 做缓

LVS lighttped====>squid(s) ====lighttpd

上面是我经常用的。注意,我没有用apache,除非特

定的需求,否则我不部署apache,因为我一般用php- fastcgi 配合lighttpd,性能比apache+mod_php要强很多。

squid 的使用可以解决文件的同步等等问题,但是需要

注意,你要很好的监控缓存的命中率,尽可能的提高的90%

squid 和lighttped 也有很多的话题要讨论,这里不赘

述。

3.存储。也是一个大问题,一种是小文件的存储,比

如图片这类。另一种是大文件的存储,比如搜索引擎的索引,一般单文件都超过2g 以上。

小文件的存储最简单的方法是结合lighttpd 来进行分

布。或者干脆使用Redhat的GFS优点是应用透明,缺点

是费用较高。我是指

你购买盘阵的问题。我的项目中,存储量是2-10Tb ,

我采用了分布式存储。这里要解决文件的复制和冗余。

这样每个文件有不同的冗余,这方面可以参考google

的gfs 的论文。

大文件的存储,可以参考nutch 的方案,现在已经独

立为hadoop 子项目。(你可以google it)

4.队列。将并发线程转换为单线程,如果用java 的concurrentCollection 类去做,原理就是启动一个线程,

跑一个Queue,并发的时候,任务压入Queue,线程轮训读

取这个Queue,然后一个个顺序执行。

旦并发转成单线程,那么其中一个线程一旦出现性

能问题,必然整个处理都会放慢。所以在单线程中的任何操作绝对不能涉及到IO 处理。那数据库操作怎么办

增加缓存。这个思路很简单,直接从内存读取,必然

会快。至于写、更新操作,采用类似的思路,把操作提交

给一个Queue,然后单独跑一个Thread去一个个获取插库。

这样保证了“大循环”中不涉及到IO 操作。

大家知道,对于Web

Apache、IIS 还是其他容器,图片是最消耗资源的,于是我们有必要将图片与页面进行分离,这是基本上大型网站都会采用的策略,他们都有独立的图片服务器,甚至很多台图片服务器。这样的架构可以降低提供页面访问请求的服务器系统压力,并且可以保证系统不会因为图片问题而崩溃,在应用服务器和图片服务器上,可以进行不同的配置优化,比如apache 在配置ContentType 的时候可以尽量少支持,尽可能少的LoadModule, 保证更高的系统消耗和执

相关文档
最新文档