服务化的意义
一个页面的输出=how,what ,when
how :如何输出
what:输出什么内容
when:什么时候更新(大部分是实时更新)
为什么采用java来实施
1. 代码复用问题
2. django ORM的问题
left jion和拆分成N条SQL(通过pk查询)
JOIN | 拆分成2条SQ | |
---|---|---|
优点 | 1. 代码简单 2. 理论上响应时间更短 | 1.对数据库压力小。 2.由于是组合关系,非常利于优化,比如message的photo可以走cache。 3.支持后续数据库分表。 4.通过并行加载可以缩短响应时间。 |
缺点 | 1. 对数据库压力更大 2. 数据耦合在一起,不利于优化 3. 不支持后续数据库分表 | 代码比较复杂 |
一些亮点
- 网络请求减少20倍。由于之前实现没有采用批量请求,导致一次瀑布流加载需要访问200次memcached,此次通过 BlogQueryService提供的批量查询一次性返回24条blog只需要一次网络请求,现在全站每秒的memcached请求量从之前的 18000降低到6000左右。
- python和java统一Blog模型。 未来需求开发上不用再纠结buyable,favorite_count和原发之间的关系,让工程师专注于商业本身,提高需求的开发效率。
- 高性能。基于dboss通过socket长连接方式性能优于通过http的调用。对比comment的实现,comment在mandala本 身的实现是非常快的,但通过http的方式会导致在python经常出现超过100ms的情况。dboss实现了连接池和自动重试,保证了 connnection的稳定。
- 高度优化的BlogQueryService。由于BlogQueryService业务职责单一,所以我可以对其进行高度优化,包括只返回最 小字段,采用小sql代替join等复杂sql,批量查询,并行加载,保证了接口的性能,经测试单条blog查询耗时在5ms左右(需8条SQL),批量 24条查询耗时在30ms左右,同时当mysql压力过大时候能无缝替换成mongoDB实现。
- 瀑布流和detail的数据保持一致性。虽然这点不是我们的目的,但如果可以低成本的做到瀑布流和detail的数据保持一致,对于用户体验还是有提升的。