1,使用异步通信
异步通信显然可以更快的返回响应。从实际经验看,对高吞吐服务器更大的好处是,系统中的某一服务出现问题后往往出现雪崩似的服务宕机。这很多都是由于采用同步通信,需要等待其他服务同步通信结束后,其占用资源才能得到释放。而这些资源往往是socket连接、线程、数据库连接等比较重的资源。因此请慎重使用同步通信。如果你真的需要他,可以用个mock同步。正如Tim Yang所说:很多远程服务调用是在关键路径中,它可以容忍失败,但是不能容忍堵塞。
2,使用NIO
NIO几乎是Java cluster的基石。大量分布式开源项目都基于此项技术。其好处是用较低的系统开销处理大量消息。在Intel(R) Pentium(R) 4 CPU 3.00GHz/1G内存的普通PC上跑基于NIO/TCP的RTSP测试,每秒处理1K个RTSP消息是没有问题的。关于NIO的架构可以参考开源项目MINA,但要注意的是,不要直接用处理NIO消息的线程处理逻辑。
3,尽量不使用锁
如果你在高性能服务器逻辑中看到同步锁,就要小心了。我们希望服务器可以同时并发的尽量多的处理请求,而同步锁恰恰摁住了业务的咽喉。同时如果线程设计有问题而导致大量线程争夺同一把锁,最坏的情况(超过1K+线程)我曾见过JVM要用几个小时来调度一个线程占锁(为什么?请牛人解释)。解决的办法就是:1,尽量不用。可能么?在一定程度上是可能的,比如我曾使用一致性哈希算法解决资源sticky的问题。用算法替代同步,是一个思路;2,尽量减少锁的范围,事同步锁影响的逻辑越少越好。效果也很明显;3,使用数据库更新替代同步也是一个思路,虽然我自己不是很喜欢,但是从实际效果看使用数据库,特别是用存储过程。在压力不大的情况也是个简单有效的方法。
4,减少GC
Full GC对Java服务器性能的影响是致命的,特别是当JVM管理着较大内存时。即使是在小型应用,例如Old区只分配512M内存,一次Full GC都可能耗时2~3秒,这意味着你所有的服务都会中断。尽量减少Full GC的次数绝对是我们的目标。
首先,合理的配置GC参数,采用ParallelGC和 ConcMarkSweepGC,即并发和增量GC。CMS,全称Concurrent Low Pause Collector,CMS用两次短暂停来替代串行标记整理算法的长暂停。
第二,打出GC log,在性能测试阶段,检查你的GC是否OK。系统在线测试时也可以提供宝贵的track。
-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
给出一个实际服务器GC参数为例,
1
JAVA_OPTS=" -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+DisableExplicitGC
2
JAVA_OPTS=" -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:ParallelGCThreads=8
3
JAVA_OPTS="-Xms256m -Xmx640m -XX:NewSize=128m -XX:MaxNewSize=256m -Xss128k
4
JAVA_OPTS=" -XX:PermSize=64m -XX:MaxPermSize=128m
5
JAVA_OPTS=" -XX:SurvivorRatio=14 -XX:TargetSurvivorRatio=90 -XX:MaxTenuringThreshold=16
5,数据库前Cache
用queue缓存数据,一次写入多个数据。可以用多个线程同时写入数据库。在实际系统中,用多个线程同时读取cache并写入Mysql是效率很高的。
6,增加数据库索引
看起来很弱对吧?可是我真的遇到过靠加个简单的索引解决过一个很严重的性能问题。系统瓶颈的多数问题都存在于数据库和线程的使用不当上,所以还是要强调一下。
7,Master-Slave Mysql
Mysql有一篇很有名的文章来解释在Master-Slave结构下提高读效率的文章。大致就是说Mysql基准测试下max_read=1200次/s。在读写比例为9:1的情况下,通常写的时间比读的时间多一倍。假设有N个slave,如果只用slave来读,公式如下:
Max reads = 1200 – 2 * writes
Max Reads = 9 * writes / (N + 1) (读为9倍的写,平均到N+1个Mysql上)
9 * writes / (N + 1) + 2 *writes = 1200
Writes = 1200/ (2 + 9/(N+1))
结论是N=1,每秒增加到184次写
N = 8,增加到400次写
其中需要考虑的是复制多份binlog所占的网络带宽和对Master Mysql的影响。但我们在实际应用中认为mysql master-slave binlog增量同步是非常迅速且没有察觉到对性能的负面影响。但一般来说,既然memcached可以很好解决read问题,很少有team做这么大规模的mysql cluster。但小于等于4个还是可以考虑的。
总结,合理的使用异步通信,线程调度,优化GC和解决数据库瓶颈往往可以是构建高性能高并发Java消息处理服务器的利器。但这仅限于逻辑业务相对简单的即时通信系统,如果是设计大量cache调度,比如网页调度。或者是设计海量数据处理服务器,则需要考虑更多的问题。
本文纯属原创,基于实际系统经验,欢迎转载,请注明原网址;
我的新浪博客:http://blog.sina.com.cn/u/1793692835
分享到:
相关推荐
在构建高性能的大型分布式Java应用时,我们面临的是复杂的技术挑战和优化目标。要实现这样的系统,我们...以上知识点构成了构建高性能大型分布式Java应用的基础,开发者需要不断学习和实践,以应对日益复杂的系统挑战。
本资源集合包含了关于“JAVA高性能高并发服务器架构”的PDF文档和视频,旨在帮助开发者深入理解如何利用Java技术设计和实现稳定、高效的服务器系统。 首先,"JAVA高性能"是指Java平台在处理大量请求和运算时,能够...
通过上述讨论我们可以看出,在构建一个高性能高并发的秒杀系统过程中,合理选择技术栈和架构设计至关重要。同时还需要关注细节上的优化以及应对突发情况的能力。只有这样才能够保证在海量用户访问时仍能保持良好的...
在Java开发领域,构建高性能、高并发的Web应用是一项核心任务。这涉及到多个技术层面的综合运用,包括但不限于系统架构设计、线程管理、数据访问优化、缓存策略、负载均衡以及性能监控等。以下是一些关键的知识点,...
总结来说,"java抽奖系统后台 springboot+mybatis redis队列处理高并发"的方案利用了SpringBoot的便捷性、MyBatis的灵活性和Redis的高性能,为构建能够承受高并发的抽奖系统提供了一个可靠的架构基础。通过合理的...
在Java世界中,开发高性能、高并发的Web应用程序是一项关键任务,这关乎到系统的稳定性、扩展性和用户体验。本文将深入探讨如何借助Java技术栈来实现这一目标。 首先,选择合适的框架至关重要。Spring Boot是一个...
在Java面试中,高并发、高可用和分布式是考察开发者技术深度和广度的...通过深入理解并掌握以上知识点,开发者能够更好地应对Java面试中关于高并发、高可用和分布式的问题,也能在实际项目中构建出高效、稳定的系统。
在本项目中,"java抽奖系统后台 springboot+mybatis redis队列处理高并发.zip",我们可以探索几个关键的IT技术及其在构建高效抽奖系统中的应用。以下是对这些技术的详细说明: 1. **SpringBoot**: SpringBoot是...
Java作为一种多平台、高性能的编程语言,是实现高并发程序的理想选择。 书中的内容可能涵盖了以下几个核心知识点: 1. **线程基础**:线程是操作系统分配CPU时间的基本单位,是实现并发的基础。书中可能会详细介绍...
在Java领域,高并发系统设计是一项至关重要的技能,它涉及到如何构建能够同时处理大量请求的高效应用程序。在本文中,我们将深入探讨Java高并发系统设计的相关知识点,包括基础概念、核心技术以及最佳实践。 1. **...
在Java开发中,实现高性能的文件上传和下载是至关重要的技术环节,特别是在处理大量用户交互或者大数据量传输的场景下。本资料集主要探讨如何利用Java技术和相关工具库来优化这一过程,确保系统的稳定性和效率。 ...
以上是构建高性能、高并发Java Web应用的核心知识点。通过合理运用这些技术和工具,可以有效地提升系统的吞吐量和响应速度,同时保证系统的稳定性和可扩展性。在实际开发中,应根据项目需求灵活选择并整合这些技术,...
在构建Java高并发秒杀系统时,我们通常会利用一系列技术和设计原则来确保系统的稳定性和高效性。这个系统采用的技术栈包括SpringMVC、Maven、MySQL以及Spring和MyBatis,这些都是Java开发中的核心组件。 **...
而在构建高性能Java Memcached时,链表(如`LinkedList`)和并发队列(如`LinkedBlockingQueue`)可以作为优化缓存管理和淘汰策略的工具,以适应高并发和大容量数据的挑战。结合合适的数据结构和算法,我们可以构建...
总的来说,开发高性能、高并发的Java Web应用需要从多个层面考虑,包括代码编写、内存管理、并发控制、系统配置等多个方面,通过综合运用各种优化手段,可以构建出响应迅速、资源利用率高的应用程序。
高并发系统设计是Java后端开发中的重要领域,它涉及到如何在面临大量用户请求时,确保系统的稳定性和高效性。在本文中,我们将探讨三种主要的高并发系统设计方法,以及如何利用缓存来提升系统的性能。 首先,我们...
这个"java高并发秒杀api源码"很可能是一个实现这类功能的示例项目,它结合了Spring和MyBatis两大主流框架,以提升系统性能和可维护性。下面,我们将深入探讨这些关键知识点。 首先,`Spring`是一个全面的企业级应用...