通用裂变-邀请设计

设计需要考虑的要点

1.主态和客态

主态和客态属于在邀请相关的场景下通用的业务名称,主态表示发起邀请的人,客态表示被邀请的人。

2.存储数据

  1. 一般的邀请的时候,需要将主态和客态的userId都插入一条数据,这样方便根据主态和客态来查询用户,因为这个邀请的量大的时候,都会需要分表,但是我们的分片数据只能根据一个维度来,所以通过冗余记录的这种方式来保存双向关系。
  2. 需要记录主态-客态的类型,方便查询自己的邀请列表、或者被邀请列表的时候,知道自己是邀请人还是被邀请人。

CREATE TABLE `activity_invite`
(
    `id`              bigint       NOT NULL AUTO_INCREMENT,
    `activity_code`   varchar(64)  NOT NULL DEFAULT '' COMMENT '活动编码',
    `tag_code`        varchar(64)  NOT NULL DEFAULT '' COMMENT 'activity_code下的分类:如组队编码',
    `member_id`       varchar(64)  NOT NULL DEFAULT '' COMMENT '用户memberId',
    `refer_member_id` varchar(64)  NOT NULL DEFAULT '' COMMENT '关联用户memberId',
    `refer_type`      int          NOT NULL DEFAULT '1' COMMENT '双向表类别 1:memberId为主态 2:memberId为客态 用于解决分表查询',
    `op_type`         int          NOT NULL COMMENT '邀请类型 1:分享链接 2:扫码',
    `channel`         varchar(64)  NOT NULL DEFAULT '' COMMENT '外投渠道',
    `second_channel`  varchar(64)  NOT NULL DEFAULT '' COMMENT '站内渠道',
    `extra_info`      varchar(512) NOT NULL DEFAULT '' COMMENT '扩展字段',
    `create_date`     timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `update_date`     timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    `delete_flag`     tinyint      NOT NULL DEFAULT '0' COMMENT '是否删除',
    PRIMARY KEY (`id`),
    KEY               `idx_create_time` (`create_date`),
    KEY               `idx_user_act` (`member_id`,`activity_code`) USING BTREE
) ENGINE=InnoDB  COMMENT='裂变类活动通用邀请或组队表';

3.拓展

为了方便记录组队成功,后续发放奖励的时候,不需要扫描邀请关系表,可以考虑记录一张组队成功表,方便处理,这里可以根据实际的情况不需要分表。

CREATE TABLE `activity_invite_team`
(
    `id`           bigint      NOT NULL AUTO_INCREMENT COMMENT '主键',
    `member_id`    varchar(64) NOT NULL COMMENT '中奖用户id',
    `lottery_code` varchar(64) NOT NULL COMMENT '抽奖活动编码',
    `team_code`    varchar(64) NOT NULL COMMENT '组队编码',
    `delete_flag`  tinyint     NOT NULL DEFAULT '0' COMMENT '是否删除(0:未删除 1:已删除)',
    `create_date`  timestamp   NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `update_date`  timestamp   NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    PRIMARY KEY (`id`),
    KEY            `idx_user_id` (`member_id`),
    KEY            `idx_lottery_code` (`lottery_code`)
) ENGINE=InnoDB  COMMENT='活动成功组队表';

4.细节

1.加锁

所有涉及到状态变更的都需要加分布式锁

2.创建队伍 + 加锁

创建队伍时,可以生成一个邀请码(uuid即可),然后和这个用户绑定,分享出去的时候也需要带上这个邀请码

3.加入队伍 + 加锁

1.需要对队伍的编码加分布式锁,防止同一时间超过指定的队伍人数
2.细致的校验,限流等

  1. 校验人数,达标则记录一条组队完成,然后做后续处理

3.校验

1.校验编码
2.校验是否已经加入过队伍
3.组队是否已经完成
4.发起队伍的数量是否太多
等等,在这种活动中都需要仔细的考虑这些安全、防刷、边界等问题,才能减少资损等恶性的生产事件

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容