背景
B端注册客户160万、7.8亿C端用户,1000万人最高同时在线。商家可以购买服务建立自己的线上店铺,进行商品的销售、推广,录制课程,直播。
慕课付费资源网站 https://www.92ydl.com/1152.html
抽奖
系统调用图
参与抽奖主要流程:
- ⽤户参与抽奖活动
- 业务测在达到抽奖条件之后进⾏抽奖
- 业务测把需要抽奖的序号和需要抽取的⼈发送给抽奖服务测
- 抽奖服务抽出奖品,通知业务测
- 业务测发放奖品
时序图
1、⼿动开奖
从redis集合中获取活动的参与者数据
从数据库去查询活动的奖品数据
随机匹配参与者和奖品,并将结果存⼊数据库中
将开奖结果返回给业务侧
2、⾃动开奖:(定时脚本:每秒执⾏⼀次)
获取这个时间点需要开奖的抽奖活动数据
从redis集合中获取活动的参与者数据
从数据库去查询活动的奖品数据
随机匹配参与者和奖品,并将结果存⼊数据库中
分享有礼
时序图
讲师端发起分享有礼活动
生成带有活动ID的分享链接逻辑
分享有礼写入关系核心逻辑
分表
一、背景
数据分析c端实例 数据库 db_ex_crowd 的数据表 t_crowd_user(人群用户表)月底数据达六十多亿,数据太多,单表内存占用近3T。拆表主要推动力为:腾讯云推荐实例存储为不超过3T, 运维现在是放宽了,历史最高到了6T, 如果数据量继续增长下去,容易出现不可控风险。其它:影响了正常业务查询的速度等。
此表其他情况:这个表是由大数据写入的,用来统计人群。人群每次更新,全量写入,更新多次写入多次信息,里面就会出现很多过时的无效的记录。现在大数据的做法是每个月底跑脚本从此表中统计出最近的每一个人群的信息进新表,然后重命名此表为其它名称,新表命名为 t_crowd_user, 待旧表没用后删除,这样此表每月初数据量是不多的。
2011-11-30 20:59 此表情况如下:
二、项目目标
将数据分析c端实例db_ex_crowd.t_crowd_user(人群分组成员表)表拆分并迁往新的实例,提供接口对该表的操作供外界其他项目使用(收归),解决掉该表过大引起的问题。
三、拆表方案
将t_crowd_user 按人群自动更新和手动更新拆为两类,人群分组成员表-手动, 人群分组成员表-例行。人群例行更新的再按天分表(例行更新每天都会产生数据)。然后按app_id将其按crc32算法分成0-99共100个表(eg: fmod(sprintf(“%u”, crc32($app_id)), 100);)。这样手动更新就是100张表,自动更新每天100张表。自动更新的按业务需要可以保留最近7天的,其他的定时删除(删除前备份)。这样就解决了数据量大的问题,而且直接删表不会引起单表大量删数据带来的问题,比如主动同步。拆表后需要查找指定人群的用户信息,故需要在现有的 t_crowd 表加两个字段,trigger_compute_type,compute_day,一个是记录此人群更新时的触发方式(手动or例行),另一个是记录更新时的时间。这样,如果需要查找对应人群的成员信息,先去t_crowd表查到 trigger_compute_type, 和 compute_day, 然后就可以锁定对应的人群成员表了。
trigger_compute_type(字段名待定):此人群更新时的触发方式(手动or例行)。
compute_day(字段名待定):更新时的时间。
现有手动更新人群和例行更新人群人员数量的统计如下:
每天需要例行更新的人员有 2亿多。
四、实现步骤
1.运维提供新的数据库实例,按需要创建手动更新表100张,例行更新表使用脚本定时创建,每天100张,脚本每次跑将未来三天的表都创建好。
2.大数据做双写,保留旧的t_crowd_user的写入,并将更新人群成员信息写进新的分表。
3.补写数据。 因为例行更新是每天都更新的,所以例行更新新表不用补数据,但是手动更新是由用户触发的,故需要写脚本将手动更新人群最近一次更新的结果写进去。
4.观察一段时间双写的情况,脚本检测例行更新数目是否正常。
\5. 双写正常且数据完整后 crowd项目首先接入,对t_crowd_user表的操作走新的实例的库表,并观察业务运行是否正常,运行一段时间,观察。
6.待步骤5正常后开始对其他项目 t_crowd_user表操作的收归,将其他组需要的信息以接口形式提供出去供调用,不要让其他业务侧直接读此表。待此表操作查询权限收归后,修改掉旧表表名,以此来检测是否还有漏掉的直接操作此表的项目,没有后大数据修改停掉双写,只写新表。
7.至此t_crowd_user表迁移完成。
各业务侧项目对此表的使用调研
五、被否定的思路
1.大数据月底跑的脚本提高频率,一周或半个月生成一次
否定原因:数据转移风险太大,频率越高风险越高,且需要耗费资源
2.写脚本定时执行将之前没用的记录删除
否定原因:此表每天写入的量太大,两三个亿,如果再加上删除的量就更大了,机器cpu,锁表,主从同步等都是问题。