锁定老帖子 主题:也谈大型电子商务网站的架构
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2012-05-13
最后修改:2012-05-13
http://www.iteye.com/topic/1119514
看了onecan的 大型Java多用户商城系统设计开发的心得和困难:体会或说同感较多,由于那个帖子太长了,所以我把自己的一些心得另开一个来谈。 帖子上大家对是否使用Hibernate有很多的讨论,下面谈谈我的看法: 我自己的大型B2B和B2C网站原来也是用Hibernate,但是后来不得不换成mybatis, 第一是用Hibernate 由于它封装得太高了,很多东西是隐式进行的,经常引起问题,很难定位。毕竟凡事有利必有弊; 第二大型网站肯定不是一个数据库,这点Hibernate是很麻烦的,用Jdbc或Mybatis 可以轻松应付之,我自己写的shard分库框架目前就是支持mybatis和Jdbc Template。 另,觉得割舍不了Hibernate的iteyer,其实也是建议直接再用Hibernate,待遇到痛苦时,再换,这样体会会更深些 我的技术选型和onecan的类似,区别在于: 1.缓存:我采用ehcache+memcached结合的方式,ehcache做JVM本地缓存,memcached做进程外全局缓存,即由本地缓存和全局缓存构成系统的二级缓存; 2.数据库上,你用单数据库肯定是不行的。我的平台是划分为100多个库,早期我采用淘宝的amoeba(陈师儒兄写的)分库技术(其实是一个分库中间件,通过一台代理amoeba实现对后端mysql集群的透明化代理。后来发现问题多多,另一个是中间件方案虽然使用简单,但不够灵活,不能做多数据库事务,所以弃之。不得以自己写了一个基于Java的分库框架,即Shard,在应用层直接通过Shard操作数据库集群; 3.全文索引,我们采用Solr,不过目前想把它换成ElasticSearch,因为Solr的全文索引同步比较慢,延时是一个很大的问题,ES做得好些。 4.任务调度你这里没有讲,其实这块对于大型网站是很重要的,我是基于Quautz自己写了一个全局任务调度框架,相当于任务调度云的方式。如每天晚上汇总数据,定期迁移数据等就可以很好地使用任务调度来完成。 5.编码生成:凡是商城或应用系统,肯定是要有一个编码生成的框架,如单据号,商品编号等,要求是全局唯一,规则可自定义。这个我是基于Spring Expression写了一个全局的编码框架。称为codeman,后面我也拟把它开源出来; 6.开放平台:如果你的商城要允许多终端接入,如iphone,android,PC客户端,或者第三方,则一定要有一条服务总线,如淘宝的TOP。这个原来是用Spring MVC直接写的,后来发现新增功能添加太麻烦,开发效率太低了,扩展性差,因此我就基于Spring MVC框架的设计思路和TOP的应用模型写了一个Rop框架,这个已经开源的,参见我这个帖子:http://www.iteye.com/topic/1121252 7.NoSQL和mySQL结合,mySQL毕竟是关系型的,对于高并发的数据,我们是放到mogonDB中的,这个数据库的压力会小很多。 8.日志的记录:大型网站的日志记录是非常重要的,是审计,问题定位的依据。原来早期,我直接把日志记录到MySQL中,日志很大,数据库压力大,后来把它直接异步到Elastic Search中,不但可以全文检索,并发性大时也没有问题; 此外,对日志编写了一些分析引擎,可以从日志中发现关键的问题,即时报警。 9.会话管理的问题:由于应用服务节点很多,因此弃用Web应用服务器本身的Session功能,直接自己编写了一个全局会话管理功能,以实现全局统一的会话管理。 10.图片服务器独立,每张图片只保存一张物理的,其实不同规格的图片动态生成并放到内存中; 11.项目采用敏捷开发,TDD,Maven等。 问题: 1.敏捷开发还没有通透,Maven刚换过来,现在还没有达到自动集成,自动部署,这块是接下来的目标; 2.数据库和全文索引的同步还是一个小延时,这个小延时会造成用户的误解:在后台编辑了记录,可以列表刷新时却看不到更新,不知道大家有什么好的办法。 3.模板这块的设计还没有什么好的方案,扩展性上不足,都是预先做好让用户选择的。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-05-13
2.数据库和全文索引的同步还是一个小延时,这个小延时会造成用户的误解:在后台编辑了记录,可以列表刷新时却看不到更新,不知道大家有什么好的办法。
这个可不可以这样: 1、后台编辑/新增 自动添加到一个池中,比如叫做 更新池,为池中每一个对象设置一个有效期 (开一个deamon线程定期清理) 2、对于更新的记录 列表/全文检索时,首先查询分页数据,然后到池中对比,更新 (有点小延迟也无所谓吧); 3、对于新增的记录: 列表时,根据分类去池中查最新的记录并添加到分页中,但是对于规规矩矩的小缩略图列表方式不适用,不好布局 如果是搜索,匹配就麻烦了! 4、或者提供给编辑人员一个参数 通过这个参数清理/同步 |
|
返回顶楼 | |
发表时间:2012-05-13
jinnianshilongnian 写道 2.数据库和全文索引的同步还是一个小延时,这个小延时会造成用户的误解:在后台编辑了记录,可以列表刷新时却看不到更新,不知道大家有什么好的办法。
这个可不可以这样: 1、后台编辑/新增 自动添加到一个池中,比如叫做 更新池,为池中每一个对象设置一个有效期 (开一个deamon线程定期清理) 2、对于更新的记录 列表/全文检索时,首先查询分页数据,然后到池中对比,更新 (有点小延迟也无所谓吧); 3、对于新增的记录: 列表时,根据分类去池中查最新的记录并添加到分页中,但是对于规规矩矩的小缩略图列表方式不适用,不好布局 如果是搜索,匹配就麻烦了! 4、或者提供给编辑人员一个参数 通过这个参数清理/同步 嗯 思路不错。有个问题,就是分页非常麻烦,必须在数据库查询的基础上结合这个缓存来调整,算法上不太容易实现。 |
|
返回顶楼 | |
发表时间:2012-05-13
REST WEBSERVICE那个框架支持事务的不?
|
|
返回顶楼 | |
发表时间:2012-05-13
最后修改:2012-05-13
stamen 写道 jinnianshilongnian 写道 2.数据库和全文索引的同步还是一个小延时,这个小延时会造成用户的误解:在后台编辑了记录,可以列表刷新时却看不到更新,不知道大家有什么好的办法。
这个可不可以这样: 1、后台编辑/新增 自动添加到一个池中,比如叫做 更新池,为池中每一个对象设置一个有效期 (开一个deamon线程定期清理) 2、对于更新的记录 列表/全文检索时,首先查询分页数据,然后到池中对比,更新 (有点小延迟也无所谓吧); 3、对于新增的记录: 列表时,根据分类去池中查最新的记录并添加到分页中,但是对于规规矩矩的小缩略图列表方式不适用,不好布局 如果是搜索,匹配就麻烦了! 4、或者提供给编辑人员一个参数 通过这个参数清理/同步 嗯 思路不错。有个问题,就是分页非常麻烦,必须在数据库查询的基础上结合这个缓存来调整,算法上不太容易实现。 1、新增的话 直接添加到第一页,第一页数据可能多点,小缩略图列表不好做 2、更新的话 就无所谓了,分页还是照旧,只是分页数据需要去对比池 取最新的数据 3、或者提供给编辑人员 debug页面 我觉得提供debug界面就可以了,,只要在url带某个参数 就是debug,这也是很常见很简单的策略。 |
|
返回顶楼 | |
发表时间:2012-05-14
做一个网站不容易啊 需要这么多技术。
不知道淘宝他们是不是也用这些? |
|
返回顶楼 | |
发表时间:2012-05-14
ruledefined 写道 做一个网站不容易啊 需要这么多技术。
不知道淘宝他们是不是也用这些? 其实淘宝也采用了很多开源的技术,你可以参考这个文章: http://club.topsage.com/thread-413160-1-1.html |
|
返回顶楼 | |
发表时间:2012-05-14
最后修改:2012-05-14
很受益,先支持一个
顺便请教下楼主没提到得点 1)关于热部署方面,楼主的团队是采用什么框架还是自定义的ClassLoader 2)监控方面,除了监控警报,有没有去写一些故障检测分析工具(非JDK自带和其它收费的图形工具) |
|
返回顶楼 | |
发表时间:2012-05-14
程序新手 写道 很受益,先支持一个
顺便请教下楼主没提到得点 1)关于热部署方面,楼主的团队是采用什么框架还是自定义的ClassLoader 2)监控方面,除了监控警报,有没有去写一些故障检测分析工具(非JDK自带和其它收费的图形工具) 目前还没有做到热部署,这个比较难吧,比较部署时还涉及到数据库结构的调整等,不单单只是类的变化。所以我们都是晚上停机部署的。 监控方面主要是通过系统异常日志及javamelody。 |
|
返回顶楼 | |
发表时间:2012-05-14
这个只讲了一点皮毛,楼上有没有更深入的帖子介绍一下。
|
|
返回顶楼 | |