使用Java开发高性能网站需要关注的那些事儿

news/2024/5/9 7:12:41/文章来源:https://blog.csdn.net/weixin_30244889/article/details/98155594

近期各家IT媒体举办的业内技术大会让很多网站都在披露自己的技术内幕与同行们分享,大到facebook,百度,小到刚起步的网站。facebook,百度之类的大型网站采用的技术和超凡的处理能力的确给人耳目一新的感觉,但并不是每个网站都是像facebook,百度 有上亿的用户访问流量,有海量的数据需要存储,需要使用到mapreduce/并行计算,HBase/列存储这些技术不可。技术手段始终是运营的支撑,对于当前的运营环境适用就好,没有必要非要赶个时髦,一定要和某项流行的技术产生点关系才善罢甘休。

在最近的技术大会中我们更多的目光都聚焦在这些大型网站,其实中小型门户网站的技术体系也是值得去探讨和关注。全天下的攻城师们并不是都在为这些大型门户网站服务,更多的攻城师们正在默默无闻的为一些刚刚起步的中小型网站服务,而且占据了攻城师队伍中的60%以上的人群。在关注大型门户网站的时候,中小型门户网站的技术发展和实战经验更值得去分享。

无论大型门户网站还是中小型垂直类型网站都会对稳定性、性能和可伸缩性有所追求。大型网站的技术经验分享值得我们去学习和借用,但落实到更具体的实践上并不是对所有网站可以适用,其他语言开发的网站我还不敢多说,但Java开发的系统,我还是能您给插上几句话:

JVM
JEE容器中运行的JVM参数配置参数的正确使用直接关系到整个系统的性能和处理能力,JVM的调优主要是对内存管理方面的调优,优化的方向分为以下4点:
1.HeapSize             堆的大小,也可以说Java虚拟机使用内存的策略,这点是非常关键的。
2.GarbageCollector  通过配置相关的参数进行Java中的垃圾收集器的4个算法(策略)进行使用。
3.StackSize             栈是JVM的内存指令区,每个线程都有他自己的Stack,Stack的大小限制着线程的数量。
4.DeBug/Log           在JVM中还可以设置对JVM运行时的日志和JVM挂掉后的日志输出,这点非常的关键,根据各类JVM的日志输出才能配置合适的参数。
网上随处可见JVM的配置技巧,但是我还是推荐阅读Sun官方的2篇文章,可以对配置参数的其所依然有一个了解
1.Java HotSpot VM Options
http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html
2.Troubleshooting Guide for Java SE 6 with HotSpot VMhttp://www.oracle.com/technetwork/java/javase/index-137495.html
另外,我相信不是每个人攻城师都是天天对着这些JVM参数的,如果你忘记了那些关键的参数你可以输入Java -X(大写X)进行提示。

JDBC
针对MySQL的JDBC的参数在之前的文章中也有介绍过,在单台机器或者集群的环境下合理的使用JDBC中的配置参数对操作数据库也有很大的影响。
一些所谓高性能的 Java ORM开源框架也就是打开了很多JDBC中的默认参数:
1.例如:autoReconnect、prepStmtCacheSize、cachePrepStmts、useNewIO、blobSendChunkSize 等,
2.例如集群环境下:roundRobinLoadBalance、failOverReadOnly、autoReconnectForPools、secondsBeforeRetryMaster。
具体内容可以参阅MySQL的JDBC官方使用手册:
http://dev.mysql.com/doc/refman/5.1/zh/connectors.html#cj-jdbc-reference

数据库连接池(DataSource)
应用程序与数据库连接频繁的交互会给系统带来瓶颈和大量的开销会影响到系统的性能,JDBC连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而再不是重新建立一个连接,因此应用程序不需要频繁的与数据库开关连接,并且可以释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
在此我认为有一点需要说明:
连接池的使用也是需要关闭,因为在数据库连接池启动的时候就预先和数据库获得了相应的连接,之后不再需要应用程序直接的和数据库打交道,因为应用程序使用数据库连接池是一个“借”的概念,应用程序从数据库连接池中获得资源是“借出”,还需要还回去,就好比有20个水桶放在这里,需要拿水的人都可以使用这些木桶从水池里面拿水,如果20个人都拿完水,不将水桶还回原地,那么后面来的人再需要拿水,只能在旁边等待有人将木桶还回去,之前的人用完后需要放回去,不然后面的人就会一直等待,造成资源堵塞,同理,应用程序获取数据库连接的时候Connection连接对象的时候是从“池”中分配一个数据库连接出去,在使用完毕后,归还这个数据库连接,这样才能保持数据库的连接“有借有还”准则。
参考资料:
http://dev.mysql.com/doc/refman/5.1/zh/connectors.html#cj-connection-pooling

数据存取
数据库服务器的优化和数据的存取,什么类型的数据放在什么地方更好是值得去思考的问题,将来的存储很可能是混用的,Cache,NOSQL,DFS,DataBase 在一个系统中都会有,生活的餐具和平日里穿衣服需要摆放在家里,但是不会用同一种类型的家具存放,貌似没有那个人家把餐具和衣服放在同一个柜子里面的。这就像是系统中不同类型的数据一样,对不同类型的数据需要使用合适的存储环境。文件和图片的存储,首先按照访问的热度分类,或者按照文件的大小。强关系类型并且需要事务支持的采用传统的数据库,弱关系型不需要事务支持的可以考虑NOSQL,海量文件存储可以考虑一下支持网络存储的DFS,至于缓存要看你单个数据存储的大小和读写的比例。
还有一点值得注意就是数据读写分离,无论在DataBase还是NOSQL的环境中大部分都是读大于写,因此在设计时还需考虑 不仅仅需要让数据的读分散在多台机器上,还需要考虑多台机器之间的数据一致性,MySQL的一主多从,在加上MySQL-Proxy或者借用JDBC中的一些参数(roundRobinLoadBalance、failOverReadOnly、autoReconnectForPools、secondsBeforeRetryMaster)对后续应用程序开发,可以将读和写分离,将大量读的压力分散在多台机器上,并且还保证了数据的一致性。

缓存
在宏观上看缓存一般分为2种:本地缓存和分布式缓存
1.本地缓存,对于Java的本地缓存而言就是讲数据放入静态(static)的数据结合中,然后需要用的时候就从静态数据结合中拿出来,对于高并发的环境建议使用 ConcurrentHashMap或者CopyOnWriteArrayList作为本地缓存。缓存的使用更具体点说就是对系统内存的使用,使用多少内存的资源需要有一个适当比例,如果超过适当的使用存储访问,将会适得其反,导致整个系统的运行效率低下。
2. 分布式缓存,一般用于分布式的环境,将每台机器上的缓存进行集中化的存储,并且不仅仅用于缓存的使用范畴,还可以作为分布式系统数据同步/传输的一种手段,一般被使用最多的就是Memcached和Redis。
数据存储在不同的介质上读/写得到的效率是不同的,在系统中如何善用缓存,让你的数据更靠近cpu,下面有一张图你需要永远牢记在心里,来自Google的技术大牛Jeff Dean(Ref)的杰作,如图所示:
cache-speed
并发/多线程
在高并发环境下建议开发者使用JDK中自带的并发包(java.util.concurrent),在JDK1.5以后使用java.util.concurrent下的工具类可以简化多线程开发,在java.util.concurrent的工具中主要分为以下几个主要部分:
1.线程池,线程池的接口(Executor、ExecutorService)与实现类(ThreadPoolExecutor、 ScheduledThreadPoolExecutor),利用jdk自带的线程池框架可以管理任务的排队和安排,并允许受控制的关闭。因为运行一个线程需要消耗系统CPU资源,而创建、结束一个线程也对系统CPU资源有开销,使用线程池不仅仅可以有效的管理多线程的使用,还是可以提高线程的运行效率。
2.本地队列,提供了高效的、可伸缩的、线程安全的非阻塞 FIFO 队列。java.util.concurrent 中的五个实现都支持扩展的 BlockingQueue 接口,该接口定义了 put 和 take 的阻塞版本:LinkedBlockingQueue、ArrayBlockingQueue、SynchronousQueue、PriorityBlockingQueue 和 DelayQueue。这些不同的类覆盖了生产者-使用者、消息传递、并行任务执行和相关并发设计的大多数常见使用的上下文。
3.同步器,四个类可协助实现常见的专用同步语句。Semaphore 是一个经典的并发工具。CountDownLatch 是一个极其简单但又极其常用的实用工具,用于在保持给定数目的信号、事件或条件前阻塞执行。CyclicBarrier 是一个可重置的多路同步点,在某些并行编程风格中很有用。Exchanger 允许两个线程在 collection 点交换对象,它在多流水线设计中是有用的。
4.并发包 Collection,此包还提供了设计用于多线程上下文中的 Collection 实现:ConcurrentHashMap、ConcurrentSkipListMap、ConcurrentSkipListSet、CopyOnWriteArrayList 和 CopyOnWriteArraySet。当期望许多线程访问一个给定 collection 时,ConcurrentHashMap 通常优于同步的 HashMap,ConcurrentSkipListMap 通常优于同步的 TreeMap。当期望的读数和遍历远远大于列表的更新数时,CopyOnWriteArrayList 优于同步的 ArrayList。

队列
关于队列可以分为:本地的队列 和 分布式队列 2类
本地队列:一般常见的用于非及时性的数据批量写入,可以将获取的数据缓存在一个数组中等达到一定数量的时候在进行批量的一次写入,可以使用BlockingQueue或者List/Map来实现。
相关资料:Sun Java API.
分布式队列:一般作为消息中间件,构建分布式环境下子系统与子系统之间通信的桥梁,JEE环境中使用最多的就是Apache的AvtiveMQ和Sun公司的OpenMQ。
轻量级的MQ中间件之前也向大家介绍过一些例如:Kestrel和Redis(Ref http://www.javabloger.com/article/mq-kestrel-redis-for-java.html),最近又听说LinkedIn的搜索技术团队推出了一个MQ产品-kaukaf(Ref http://sna-projects.com/kafka ),对此保持关注。
相关资料:
1.ActiveMQ http://activemq.apache.org/getting-started.html
2.OpenMQ  http://mq.java.net/about.html
3.Kafka       http://sna-projects.com/kafka      
4.JMS文章  http://www.javabloger.com/article/category/jms

NIO
NIO是在JDK1.4后的版本中出现的,在Java 1.4之前,Jdk提供的都是面向流的I/O系统,例如读/写文件则是一次一个字节地处理数据,一个输入流产生一个字节的数据,一个输出流消费一个字节的数据, 面向流的I/O速度非常慢,并且一个数据包要么整个数据报已经收到,要么还没有。Java NIO非堵塞技术实际是采取Reactor模式,有内容进来会自动通知,不必死等、死循环,大大的提升了系统性能。在现实场景中NIO技术多数运用两个方面,1是文件的读写操作,2是网络上数据流的操作。在NIO中有几个核心对象需要掌握:1选择器(Selector)、2通道(Channel)、3缓冲区(Buffer)。
我的废话:
1.在Java NIO的技术范畴中内存映射文件是一种高效的做法,可以用于缓存中存储的冷/热数据分离,将缓存中的一部分冷数据进行这样的处理,这种做法上比常规的基于流或者基于通道的I/O快的多,通过使文件中的数据出现为内存数组的内容来完成的,将文件中实际读取或者写入的部分才会映射到内存中,并不是将整个文件读到内存中。
2.在Mysql的jdbc驱动中也可以使用NIO技术对数据库进行操作来提升系统的性能。

长连接/Servlet3.0
这里说的长连接就是长轮询,以前浏览器(客户端)需要关注服务器端发生的数据变化需要不断的访问服务器,这样客户端的数量一多必然会给服务器端造成很大的压力,例如:论坛中的站内消息。现在Servlet3.0规范中提供了一个新的特性:异步IO通信;该特性会保持一个长连接。利用Servlet3异步请求的这项技术可以大大的缓解服务器端的压力。
Servlet3.0的原理就是将request的请求开启一个线程挂起,中间设置等待超时的时间,如果后台事件触发request请求,得到的结果返回给客户端的request请求,如果在设置等待超时的时间内没有任何事件发生也将请求返回给客户端,客户端将再次发起request请求,客户端与服务器端的交互可以与此往复。
就好比,你先过来跟我说如果有人找你,我就立马通知你你来见他,原先你需要不断的问我有没有要找你,而不管有没有人找你,你都需要不断的问我有没有人找你,这样的话不论问的人还是被问的人都会累死。

日志
Log4J是通常被人们使用的工具,系统在刚刚上线的时候日志一般都设置在INFO的级,真正上线后一般设置在ERROR级,但无论在任何时候,日志的输入内容都是需要关注的,开发人员一般可以依靠输出的日志查找出现的问题或者依靠输出的日志对系统的性能进行优化,日志也是系统运行状态的报告和排错的依据。
简单来说日志按照定义的不同策略和等级输出到不同的环境,那样便于我们分析和管理。相反你没有策略的输出,那么机器一多,时间一长,会有一大推乱糟糟的日志,会让你排错的时候无从下手,所以日志的输出策略是使用日志的关键点。
参考资料:http://logging.apache.org/log4j/1.2/manual.html

打包/部署
在代码设计的时候最好能将不同类型的功能模块在IDE环境中粗粒度的分为不同的工程,便于打成不同jar包部署在不同的环境中。有这样的一个应用场景:需要每天定时远程从SP那边获得当天100条新闻和部分城市的天气预报,虽然每天的数据量不多,但是前端访问的并发量很大,显然需要在系统架构上做到读写分离。
如果把web工程和定时抓取的功能模块完全集中在一个工程里打包,将导致需要扩展的时候每台机器上既有web应用也有定时器,因为功能模块没有分开,每台机器上都有定时器工作将会造成数据库里面的数据重复。
如果开发的时候就将web和定时器分为2个工程,打包的时候就可以分开部署,10台web对应一台定期器,分解了前端请求的压力,数据的写入也不会重复。
这样做的另一个好处就是可以共用,在上述的场景中web和定时器都需要对数据库进行读取,那么web和定时器的工程里都有操作数据库的代码,在代码的逻辑上还是感觉乱乱的。如果再抽出一个DAL层的jar,web和定时器的应用模块开发者只需要引用DAL层的jar,开发相关的业务逻辑,面向接口编程,无需考虑具体的数据库操作,具体的对数据库操作由其他开发者完成,可以在开发任务分工上很明确,并且互不干涉。

框架
所谓流行的SSH(Struts/Spring/Hiberanet)轻量级框架,对于很多中小型项目而言一点都不轻量级,开发者不仅需要维护代码,还需要维护繁琐的xml配置文件,而且说不定某个配置文件写的不对就让整个都工程无法运行。无配置文件可以取代SSH(struts/Spring/Hiberanet)框架的产品真的太多了,我之前就向大家介绍过一些个产品(Ref)。
这个我并不是一味的反对使用SSH(Struts/Spring/Hiberanet)框架,在我眼里SSH框架真的作用是做到了规范开发,而并不使用了SSH(Struts/Spring/Hiberanet)框架能提高多少性能。
SSH框架只是对于非常大的项目人数上百人的团队,还需要、继续增加团队规模的公司而言,是需要选择一些市面上大家都认可,并且熟悉的技术,SSH(Struts/Spring/Hiberanet)框架比较成熟所以是首先产品。
但是对于一些小团队中间有个把技术高人的团队而言完全可以选择更加简洁的框架,真正的做到提速你的开发效率,早日抛弃SSH框架选择更简洁的技术在小团队开发中是一种比较明知的选择。

转载于:https://www.cnblogs.com/chengJAVA/p/5630966.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_733708.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

教务系统自动评教_「四川大学教务处本科登陆系统」四川大学本科教务系统 - 一键评教 - seo实验室...

四川大学教务处本科登陆系统为什么80%的码农都做不了架构师?>>>引用库:http-parser、boost、libcurl、STL其中boost使用了thread、container、regex三个模块。由于boost二进制文件太大,这里就不放工程了。不过编译完只有400多KB&…

html网站点击特效,HTML5 svg和CSS3炫酷鼠标点击按钮特效

这是一组效果非常炫酷的HTML5 svg和CSS3鼠标点击按钮特效。这组鼠标点击特效共有22种效果,大多数是在伪元素上使用CSS3 animations来制作动画效果。非常适合于移动手机APP上的按钮触摸特效。请注意这些效果需要在支持这些CSS属性的现代浏览器中才有效果,…

百度seo排名点击器app_SEO优化关键词上百度——高权重网站上百度排名

SEO优化关键词上百度——高权重网站上百度排名——百度搜索引擎:标语“百度一下,你就知道”,百度又被广大用户名为“度娘”,现目前覆盖了PC端和移动端,不管是PC端还是移动端,在搜索引擎市场上,一…

网站前端性能优化终极指南

性能黄金法则:80- 90%的终端用户响应时间花在下载前端,即页面上的所有组件:img、stylesheets、scripts等 1.缩小HTML、CSS和JavaScript 减少资源意味着从HTML、JavaScript和CSS中删除不必要的、不需要加载的字符,如空白字符、换行字符、注释和块分隔符…

神泣服务器维护公告,《神泣》官方网站—创天互娱

亲爱的玩家:大家好!为了提升服务器质量,给大家一个稳定顺畅的游戏环境,《神泣》3区将于2020年4月9日开始进行服务器维护&版本更新,整个过程持续约4小时,预计于14:00时结束。更新后为1.0.0.78版本。根据具体情况维护…

hdfs网站服务器,服务器连hdfs配置

服务器连hdfs配置 内容精选换一换该任务指导用户使用Loader将数据从HDFS/OBS导出到SFTP服务器。创建或获取该任务中创建Loader作业的业务用户和密码。确保用户已授权访问作业执行时操作的HDFS/OBS目录和数据。获取SFTP服务器使用的用户和密码,且该用户具备SFTP服务器…

代发核心期刊骗局_假网站,假邮箱,假编辑部……期刊骗子们还要蹦跶多久?...

科技日报记者 张盖伦王丽最近一直处在自己的论文会被盗用的恐慌中。一切源于两个月前的一次投稿。她通过百度搜索期刊官网,按照官网给出的邮箱投出论文,收到编辑部录用通知……过程明明都很顺利。只是,把版面费打给编辑部后,对方就…

win7下如何运行php网站,教你如何在Win7下搭建PHP环境运行帝国ECMS6.0

首先确认你已经把一下程序下载完毕mysql-5.0.41-win32phpMyAdmin-2.11.3ZendOptimizer-3.3.0aphp-5.2.5-Win32本人网盘有提供集合包下载:http://u.115.com/file/f2c234b001我的集合包说明:php.ini文档已经配置好了,直接按下面的教程复制到相应…

thinkcmf5 模板版变量的加载过程 和 新增网站配置项怎么全局使用

1、模板全局配置是怎么加载的 在 HomeBaseController.php 的 fech方法 $more $this->getThemeFileMore($template); 用 echo ThemeModel::getLastSql(); 输出sql语句 :SELECT more FROM cmf_theme_file WHERE theme w0s AND ( is_public 1 OR file por…

esc服务器网站程序安装,esc服务器安装ssl

esc服务器安装ssl 内容精选换一换SSL证书签发后,即可下载并安装在Tomcat、Nginx、Apache、IIS等服务器上。具体操作请参见:在Tomcat上安装SSL证书:详细指导操作请参见在Tomcat服务器上安装SSL证书。在Nginx上安装SSL证书:详细指导…

Web网站的测试流程和方法(一)

近期,Alltesting的众测平台  有不少web网站的功能测试项目,像:  农事GERP种植系统 云测试平台 头号专家网项目第三轮功能测试 于是,有些新加入众测平台的小伙伴们就很捉急:  “web网站怎么测试?”  …

《大型网站性能优化指南——从前端、网络、CDN到后端、大促的全链路性能优化详解》读后感和一点思考

前言:这几天拜读了阿里的这本书,这本书全栈式地讲了一个成熟稳定的大型高并发高容量系统的优化过程,读下来很有收获,也有一些自己的思考。CDN-DNS、网络部分讲的挺精彩的,值得一读的一本书。由于我是后端方向&#xff…

网站用户行为分析项目之会话切割(一)

文章目录0x00 教程内容0x01 项目分析1. 项目背景2. 学习收获3. 数据源介绍4. 项目总体流程5. 最终数据结构0x02 编程实现1. 构建Maven项目2. 编码前准备工作3. 实现源数据的获取4. 解析日志源数据5. 日志清洗操作0x03 思路回顾0xFF 总结0x00 教程内容 项目分析编程实现 基础知…

网站正在建设中_兰州网站建设中常见的布局种类有什么

网站是由网页构成,这点许多从事网站建设或者是接触过网站开发的应该都比较清楚,目前虽然许多的企业都想要建设网站,但是对于网站的布局了解并不清楚,下面随小编一起来了解一下兰州网站建设中几种常见的布局吧。1、区块型为了网站优…

做服务端用Java还是PHP_建站用php还是java

建站用php还是java?建站用php,因为php是常用的网站编程语言,有全球超过81.7%的公共网站在服务器端采用PHP。而Java是一门面向对象编程语言,更适于系统程序的开发。phpPHP即“超文本预处理器”,是一种通用开源脚本语言。…

百度爬虫爬到虚拟链接 网站被黑_什么是爬虫?如何提高爬虫爬取网页速度?...

什么是爬虫?网络爬虫也叫网络机器人和网络蜘蛛,它可以代替人工按照一定的规则自动地的在互联网中进行数据采集与整理。各大搜索引擎也都有各自的名字,如百度蜘蛛:BaiduSpider,谷歌蜘蛛:Googlebot&#xff0…

jmeter怎么监控网站服务器,Jmeter监控服务器资源

1. 前言之前用Jmeter做性能测试时总是通过其他工具来监控服务器资源,通过查找资料,发现Jmeter自带的监控工具能监控tomcat,这种情况只能监控Tomcat支持的资源使用部分,完全是不够用的,于是发现有第三方插件支持Jmeter监…

91pay.php,电商网站使用支付宝转账付款功能代替支付宝支付接口

现在支付宝商户对于商家接入支付宝即时到账接口管理比较严格,一般都是需要支付宝企业账户才能申请开通即时到账接口的。这对于大部分个人商家来说,无疑不利于快速回笼资金。本接口通过一个变通的方式,利用支付宝系统中的转账付款功能&#xf…

建站难?史上最全指南 — 教你使用WordPress搭建出属于自己的站点!

文章目录引言购买服务器购买域名解析域名部署WordPress安装nginx服务器安装PHP运行环境新建个人站点下载并安装WordPress安装主题网站备案SSL证书(HTTPS)页面伪静态网站类型选择结语引言 很多朋友都想拥有自己的个人网站,但事实如果自己从头搭…

网站中文乱码?三招解决

发布网站后&#xff0c;不少小伙伴都会碰到中文乱码问题。 碰到这种问题不用慌&#xff0c;三招就可以解决&#xff1a; 第一招&#xff1a;设置好页面的编码&#xff0c;建议用utf-8编码格式&#xff0c;一招鲜&#xff0c;吃天下。 <meta http-equiv"Content-Type&qu…