抽奖平台架构设计

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、业务系统缓存抽奖页面这种改动不频繁的页面,与抽奖逻辑无关的处理异步另起线程处理

你可能感兴趣的:(随便写写)