高性能并发系统架构应该如何设计?关键是什么?12306
范凯 写道
高性能并发系统其实分很多种类,是并发读,并发写,并发长连接,还是并发事务?不同类型的架构设计是不同的。具体到12306就是并发事务,在这个领域,我个人没有什么经验。
陈雄华 写道
1) 优化前端网页
2) 群集分发和调度
据说12306是采用集中式构架的,集中式构架很难应对高并发,也很难水平扩容,分布式不是仅仅将调度服务器,应用服务器,缓存服务器,数据库服务器分开就行,应该进行更细的服务级划分,对业务进行服务细分,做成一个个松散耦合的服务,然后把这些服务独立分布式部署。
3) 采用分布式会话
为了可以进行灵活的请求调度,不应采用weblogic、websphere这些应用服务器自身的session管理用户会话,而应该自己管理会 话,如将会话保存在独立的集群memcached服务器中,这样每个应用服务就都无状态了,会话的请求可以随意分发给不同的服务器。这也是我的ROP开源 项目没有使用HttpSession,而专门抽象出一个SessionManager接口的原因,开发者应该自己去实现这个接口实现分布式会话管理。
4) 关于数据库设计优化
数据库往往是系统瓶颈所在,首先应该对数据库进行分库设计,可采用两级水平切割,如首先切割成几个物理库,然后在物理库内部再采用表分割,一般是通过某个业务ID进行取模切割,降低单库及单表的并发性,提高TPS。
合理采用读写分离技术,做到读写分离,可以一写多读,有效降低数据库的负载,数据的同步可以视情况采取应用层同步写,读取数据库日志更新或直接使用mysql读写分离技术等。
此外,业务服务化、服务解耦化是关键。
- 充分利用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读写分离技术等。
此外,业务服务化、服务解耦化是关键。
runfriends(来自论坛回复) 写道
个人认为针对不同的系统要有不同的设计方案。
虽然12306可以归类为电商领域,但是跟通常意义上的B2C还是有巨大的差异。所以单纯从12306上面讨论高性能并发系统架构并没有通用意义。
不过,有一个思想应该贯彻。那就是所有访问力求分散到不同的服务器处理,不同类型的资源要坚持使用不同的集群服务。动静分离、读写分离,减少一次 页面访问的请求数和数据库访问次数,保持小事务粒度,注意线程安全,避免大数据量的查询,建立索引(多表联合、union、非参数化sql、笛卡儿积计 算、返回大数据集等数据库操作应该避免)。
对于变化较小的查询操作可将查询工作交给专门的索引服务器完成。不过个人感觉像12306这样的业务,引入索引的意义不大也没有必要。
12306的业务需求乍一看似乎都是同一类型的资源,但是我们可能根据车次、卧、软、硬、站、时段、线路等信息将车票这个12306要处理的惟一类型的资源分成若干子类,不同的子类请求由不同的集群处理。
虽然12306可以归类为电商领域,但是跟通常意义上的B2C还是有巨大的差异。所以单纯从12306上面讨论高性能并发系统架构并没有通用意义。
不过,有一个思想应该贯彻。那就是所有访问力求分散到不同的服务器处理,不同类型的资源要坚持使用不同的集群服务。动静分离、读写分离,减少一次 页面访问的请求数和数据库访问次数,保持小事务粒度,注意线程安全,避免大数据量的查询,建立索引(多表联合、union、非参数化sql、笛卡儿积计 算、返回大数据集等数据库操作应该避免)。
对于变化较小的查询操作可将查询工作交给专门的索引服务器完成。不过个人感觉像12306这样的业务,引入索引的意义不大也没有必要。
12306的业务需求乍一看似乎都是同一类型的资源,但是我们可能根据车次、卧、软、硬、站、时段、线路等信息将车票这个12306要处理的惟一类型的资源分成若干子类,不同的子类请求由不同的集群处理。