社区专家谈 12306

预算很大一部分都要来买weblogic、oracle的授权了,好钢用在了刀背上。完全可以用jboss代替weblogic,用mysql代替oracle,把这些省下的钱请技术专家,远比买这些东西好用。

另外,这种高并发的互联网的应用不建议使用Hibernate,建议直接使用Spring JDBC,毕竟Hibernater操作数据库往往不够细粒度。另外还建议使用Spring MVC替代Struts,Spring MVC比Struts更高效性,页面尽量使用客户端的技术而不要使用服务端的技术实现,如使用客户端的requirejs+underscore客户端模块就比使用服务端的JSP或Freemarker要好,毕竟这样就让客户机来负责页面渲染了,且可以有效地使用CDN。


1)  优化前端网页


充分利用CDN,使JS、图片等静态资源的请求能够就近访问(顺便说一下,如果12306订票插件能从google提供的http://cdnjs.com中引用JS,而不去直接引用github的JS,就不会把github搞瘫了)。
将JS、CSS合并,最小化请求数。将JS和CSS压缩,最小化数据传输
启用gzip压缩网页。

2)  群集分发和调度

据说12306是采用集中式构架的,集中式构架很难应对高并发,也很难水平扩容,分布式不是仅仅将调度服务器,应用服务器,缓存服务器,数据库服务器分开就行,应该进行更细的服务级划分,对业务进行服务细分,做成一个个松散耦合的服务,然后把这些服务独立分布式部署。

3)  采用分布式会话

为了可以进行灵活的请求调度,不应采用weblogic、websphere这些应用服务器自身的session管理用户会话,而应该自己管理会话,如将会话保存在独立的集群memcached服务器中,这样每个应用服务就都无状态了,会话的请求可以随意分发给不同的服务器。这也是我的ROP开源项目没有使用HttpSession,而专门抽象出一个SessionManager接口的原因,开发者应该自己去实现这个接口实现分布式会话管理。

4)  关于数据库设计优化

数据库往往是系统瓶颈所在,首先应该对数据库进行分库设计,可采用两级水平切割,如首先切割成几个物理库,然后在物理库内部再采用表分割,一般是通过某个业务ID进行取模切割,降低单库及单表的并发性,提高TPS。

合理采用读写分离技术,做到读写分离,可以一写多读,有效降低数据库的负载,数据的同步可以视情况采取应用层同步写,读取数据库日志更新或直接使用mysql读写分离技术等。

此外,业务服务化、服务解耦化是关键。


web前端要大笔优化,采用requirejs+jquery+backbone+underscore框架,web应用要进行部署优化js合并,js压缩;
所有业务SOA化,以便可以将业务分布式部署;
数据库分库,二级切分,实现读写分离,从业务流程调整上降低对数据一致性的要求;
充分使用nosql技术,通过流程优化和调整,使nosql承担大量的数据访问请求,使nosql成为保卫后端mysql的一道坚强的保障。

你可能感兴趣的:(社区专家谈 12306)