项目需求:1.基金状态监测
新建组合条件管理通过微信api匹配用户是否属于这个人群并得到用户是否购买过,是否持有和是否定投过等等
(因为微信就提供了一个用户一个用户判断用户的类型api所以就会遇到大数据的问题)
千万级别的用户量所遇到的问题
1.:当请求api用同步请求的时候,循环千万次去判断用户类型造成时间太久 ,10个多小时都没跑完数据
2.:改良微信api请求成异步,循环千万次,最后一半的时候内存溢出,原因:可能是回调请求太多 ,很多都没请求完请求数一直在增加。
3:改良每次发200个请求之后等几秒钟,避免并发请求太多造成内存溢出。
4.改成异步请求之后千万数据还是在几个小时以上 原因:在查询千万数据的时候数据量太大mysql查询太慢了而且容易请求超时。
5.改良,查询mysql分页查询 查询出总条数,循环每次查询20000条数据 查完之后加入redis 用人群分组 每个人群的用户用hash存json字符串存起来,用户就用队列存起来,在用redis的数据For循环去请求微信api验证。
分页查询出所有数据后速度还是在几个小时以上不过快了大半。
7.改良用node定时器去跑,因为查询出来的用户存的是redis,所以用两个定时器,第一个存用户,第二个马上去队列取用户去请求api. 速度又快了大半,但还是很久。
8.改良用多个进程去跑第一个,第二个定时器加载多个进程,发现还是不够 到这里应该崩溃了吧 哈哈哈哈
9.继续改良:请求api逻辑全换成redis比如说查询出持有基金的用户插入到持有用户表时先插入到Redis,最后在加一个定时器跑这个redis队列取新增数据
到这就会发现千万级数据1-2个小时就跑完筛选出每个用户的基金持有类型,并插入到数据库中。