QCon全球企业开发大会(QCon Enterprise Software Development Conference)是由InfoQ网站主办的全球顶级技术盛会,每年在伦敦、北京、东京、圣保罗、旧金山等城市召开,今年是第一次在中国杭州举办。自2007年3月份在伦敦召开首次举办以来,已经有包括金融、电信、互联网、航空航天等领域的近万名架构师、项目经理、团队领导者和高级开发人员参加过QCon大会。
地址:http://qconhangzhou.com/
以下内容是公司同事的见闻和总结,感觉不错,跟大家分享下
新浪微博Redis应用实践
Redis(http://redis.io/)是一个key-value存储系统、类似于Memcached、但相比前者有一定的优势(如支持更多的Value、性能更好等)
新浪大量使用Redis、其中一个重要使用场景是计数器、微博有大量需要实时计数的场景、如:微博数,粉丝数和关注数等等、
在新浪微博如此海量的数据和高并发场景(如一条微博在短时间内会被迅速转发N次)去count和Update DB显然不靠谱。
Offer这边也有很多使用数字的场景:如重发的400限制条数、普及版会员的优先展示Offer数等、
当前是采用MC(memcached)+Mysql的方式、但MC的穿透问题、高并发导致和DB数据不一致的问题、以往也引起过不少投诉。
而使用Redis可以很好的解决这些问题。当然新浪的经验也告诉我们Redis不是说用了肯定就合适、需要看具体的业务和使用场景。
eBay技术平台
同为B2B站点、发现Ebay的技术架构和我们有不少的共同点、技术上面临的挑战也跟我们有很大的相似
eBay的一些数据
1、数据总存储量达到9P
2、10000台应用服务器
3、4400万行代码
4、20亿张图片
5、可用性99.94%
架构特点:
1、数据库、应用层、搜索引擎等都进行了拆分、保证可扩展性
2、应用间的Session无状态化(类似于Session服务化)、应用服务器的无状态化
3、在容错和监控方面:有Logging中心、Mark downs(自动发现哪些应用不可用、一旦发现就不再请求到该应用)
4、服务化大规模使用(但主要采用Webservice的方式、和amazon类似)
面临的挑战和一些解决方案:
1、代码业务逻辑太复杂(4400万行代码、4000多个Jar包)、应用间依赖太多、耦合很高、开发效率很低
OSGi模块化、封装内部逻辑、约定好模块之间的边界和耦合方式
2、服务的数据格式很多、服务(Webservice)大量使用带来的延迟问题
将各种数据格式统一转换成JAXB、采用二进制格式(Google的protocol buf)替代XML和JSON等
3、服务调用中的N+1问题、服务返回数据利用率问题(有时只是获取服务返回对象的某一个字段、其他都浪费掉了)、服务串行调用延迟太高(如何能够实现并行调用)
自主开发了ql.io(即将开源)、能够像写SQL那样调用服务、可以有类似于SQL那样的Where、Filter、Join、Order By等条件、只取出想要的数据、也可以并行调用服务。
大众点评网的技术变迁之路
总体讲的都是通用的技术、Memcached的使用经验方面讲的比较细致:
1、缓存对象粒度的控制、便于缓存的更新删除
有时需要缓存一个列表、通用的方式是把整个列表对象全部放到缓存里面、但是这样List里的对象只要有一个发生变更整个列表就需要更新或者删除
改进的方式是:比如原来是缓存List<Shop>、现在首先缓存一个List<ShopIndexId>、里面的Key只是一个Shop的Id、然后分别缓存每个Shop对象、这样的
好处是每个Shop对象本身可以直接通过缓存读取、当单个Shop对象变更时不需要清除整个List、List里只有Id、而这一般都不会改变、通过Memcached的
Mget()可以一次性获取整个列表
2、大批量缓存的清除
如果缓存的数据格式变化较大时、为了防止缓存的脏数据问题;一般可以采用新建Region让原来的缓存自动过期而不是手动清除(Lazy Delete)
如果缓存的数据大体跟原来相同、只是某个字段变化的话可以采用给Key加版本号的方式来控制、大众点评网写了一个通用的Cache Provider组件来
自动管理Key的版本号、避免了开发自己去维护版本号
3、缓存序列化和反序列化对CPU和网络的开销
可以采用一些相对高效的数据交换格式如Google Protocol Buffer(空间利用率和序列化性能比XML、Json、Java对象序列等好很多)
4、多Memcached服务器下的分布式算法
采用业界通用的一致性哈希算法(我们还用模取余的方式、说是为了兼容老代码)
5、在数据访问层DAO实现自动缓存
通过AOP来实现、确实很多时候只是缓存DAO层返回的对象、实现方式一般都差不多的、通过AOP来自动处理可以减少很多重复代码
6、缓存雪崩问题
指的是缓存大量失效导致DB负载瞬间上升的问题(这个我们以前也碰到过)、大众点评网原来是采用双缓存的策略、但是这样维护起来比较麻烦、且容易造成缓存错乱的情况
后面准备采用Redis来替代Memcached也解决这个问题(其他方面:复制分发、对象的部分读取、高并发下的性能更好)。