1、需求背景:随着抽奖项目的增多,提取抽奖功能核心部分服务化变得越来越重要,使各个项目都能统一使用,并且在容易出问题的点,比如安全性,并发等问题上进行统一管理,提供通用的抽奖接口,数据统计接口,并且实现不同的抽奖算法。
2、数据表设计
CREATE TABLE user
(
id
int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘主键’,
set_id
int(11) NOT NULL DEFAULT ‘0’ COMMENT ‘抽奖活动ID’,
simuid
bigint(19) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘微信唯一标识’,
nickname
varchar(128) NOT NULL DEFAULT ” COMMENT ‘昵称’,
avatar
varchar(256) NOT NULL DEFAULT ” COMMENT ‘头像’,
is_whitelist
tinyint(2) NOT NULL DEFAULT ‘0’ COMMENT ‘是否白名单:0不是,1是’,
scene_id
varchar(255) NOT NULL DEFAULT ‘0’ COMMENT ‘scene_id’,
created
datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘创建时间’,
modified
datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT ‘更新时间’,
PRIMARY KEY (id
),
UNIQUE KEY uniq_simuid
(simuid
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=’用户信息表’;
CREATE TABLE prize_log
(
id
int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘主键ID’,
member_id
varchar(64) NOT NULL DEFAULT ” COMMENT ‘用户编号’,
set_id
int(11) NOT NULL DEFAULT ‘0’ COMMENT ‘抽奖活动ID’,
prize_id
int(11) NOT NULL DEFAULT ‘0’ COMMENT ‘奖品ID’,
created
datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘创建时间’,
modified
datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT ‘更新时间’,
PRIMARY KEY (id
),
UNIQUE KEY uniq_member_set_prize
(member_id
,set_id
,prize_id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=’日志表’;
统计表…..
3、接口设计:
核心接口:抽奖接口,抽奖结果接口(实现多种抽奖算法)
用户相关接口:用户创建、用户修改、用户信息列表
抽奖相关接口:用户抽奖次数、用户抽奖列表
统计相关接口:
4、权限管理:每个活动项目只能使用当前项目的信息,不能跨项目调用,每个项目分配唯一的签名,签名信息存入数据库,并且判断当前签名是否属于当前项目。
5、统一解决并发问题:1、使用kafka队列,不同项目的抽奖信息,写入不同的消息通道,定时脚本消耗队列通道,前端轮询获取抽奖信息,队列超过预期数量,直接返回不中奖;2、乐观锁代替悲观锁 3、读写分离(暂定) 4、并发过大采用限流和降级方案 5、业务系统缓存抽奖页面这种改动不频繁的页面,与抽奖逻辑无关的处理异步另起线程处理