朋友圈动态性能优化
2016-04-06 11:00
183 查看
一、项目背景
用户动态存储在mongodb中。动态按用户可见性分为三种类型
公开动态:所有好友可见
私有动态:仅自己可见
半公开动态:指定好友可见
用户刷新朋友圈需查询出以上三种类型的动态,以及自己发布的动态,按自增ID(和发布时间正相关)倒序排列,并分页显示。
后端有一台mongodb服务器提供查询服务,访问量较大时,服务器负载很高,查询速度很慢,出现较多慢查询,甚至查询超时。
二、性能优化
2.1 优化目标
减轻mongodb服务器压力提高查询速度
2.2 优化方案
维护用户可见的动态队列化复杂查询为简单查询(利用主键索引)
2.3 技术细节
用户动态队列存储在redis有序集合中,集合中存储动态ID,队列最大长度做了限制查询时先从用户动态队列取动态ID,如果数据量足够,直接做一个in查询,否则做一次复杂查询以补全数据
2.4 队列的初始化
从mongodb查出用户可见的动态ID,放入用户动态队列2.5 队列的更新
用户做以下操作时,需更新动态队列用户登录:初始化用户队列,每个用户只做一次初始化(异步)
发布动态 | 删除动态:更新自己的队列(同步);更新好友的队列(异步)
添加好友 | 删除好友:更新自己的队列(异步);更新好友的队列(异步)
打开朋友圈 | 关闭朋友圈:更新好友的队列(异步)
实现细节
用户做以上操作时记录用户操作事件(观察者模式)。事件存储在mysql中。
服务器启动定时任务处理用户事件。根据不同事件类型、业务需要、事件处理复杂度等因素灵活调整定时任务的运行频率以及每个定时任务处理的事件数量。
多进程并发场景:事件开始处理前将状态置为“正在处理”,防止有多个进程重复处理同一个用户事件。
事件处理失败后重试,并设置最大重试次数,对处理失败且超过最大重试次数的事件做预警。
三、优化效果
redis缓存380000用户动态队列,占用内存1.2Gmongodb服务器8核CPU,访问量高峰期的CPU负载从799%降至303%,服务器负载(load值)峰值维持在3~5之间。
相关文章推荐
- 1.1 弹出窗口控制
- 1.1 弹出窗口控制
- MyEclipse2014 优化设置
- 源码分析之HashMap
- 实现一个所有任务都是按各自自定义的时间间隔周期性执行的线程池
- Android的消息机制
- 【行测?】数理思维
- 坑爹的小学数学题
- 计算机视觉
- 2016年7月微软MVP申请开始了!
- 常用linux指令
- 结对编程总结
- php--学习封装类 (一)(操作mysql数据库的数据访问)
- html5拖拉
- eclipse 下调整jdk和tomcat的jvm参数
- 【iOS开发-22】navigationBar导航条和navigationItem设置:基本搞定导航条上的文字和按钮以及各种跳转
- h5 -1
- Spring的bean中注入内部类
- 隐藏手机下方的底部导航条NavigationBar
- 引用类包报错处理问题(import javax.media.*;为例)