需求梳理

137 阅读3分钟

[--- theme: juejin

image.png

匹配规则

方案一 redis zset存储

1、用两个zset分别存储会员池和普通池

2、会员池的排序值用两个自增和自减来控制,买同城卡就自减,尊享卡就自增

3、普通池的排序值可直接用当前匹配时间来作为排序值

4、当用户开始匹配时,先将自身插入到普通池最后一位,然后发送事件去异步执行匹配,分别和会员池和普通池匹配.(或者可以丢到mq去消费)

5、内存匹配流程:先匹配会员池的用户,再匹配普通池的用户

并发问题:

1、多个人同时匹配情况

// 线程A  先插入A 再查询
// 线程B  先插入B 再查询

因为方案是先插入后捞取数据,所以多个线程过来执行的时候,捞取的时候一定是包含自身的.

2、匹配时,有部分用户从普通池升级到会员池

因为两个池里面的用户都是等待被匹配用户的,因为购买同城卡其实缩小匹配范围.假设,如果用户A在开始匹配,用户B在普通池,在A的匹配中,B购买同城卡升级到会员池第一位.在A在普通池和B匹配成功时,要再次校验下当前B的匹配条件的有效性.

3、匹配时,当前用户购买同城卡或尊享卡

方案二

image.png

es的字段

用户id用户性别用户城市意向性别意向城市排序过期时间
userIdsexcityIdmatchSex(不限,男,女)matchCityId(不限,城市)sort

1、sort 排序值可以预留,前100万预留给同城卡,中间100万留给尊享卡,后面就留给普通用户,可以使用redis的自增自减来控制

2、当用户开始匹配时,先将自身插入到普通池最后一位,然后发送事件去异步执行匹配,分别和会员池和普通池匹配.(或者可以丢到mq去消费)

3、匹配流程:

等待池 image.png

  • 假设用户A是男生,泉州定位,然后选择意向匹配女

用 sql语句展示

select * from match_game  where matchCityId in('不限','泉州') and matchSex in('不限','男')
and sex='女' order by sort limit 1;

image.png

  • 假设用户A是女生,厦门定位,然后选择不限性别

用 sql语句展示

select * from match_game where matchCityId in('不限','厦门') and matchSex in('不限','女')
order by sort limit 1;

image.png

超时检测方案

  • mq延迟消息
  • redis过期监听

业务流程

根据环境先预先生成平台直播群

假设 用户占有锁 key=social_match_%userId

1、发起匹配

  • 选择小哥哥/小姐姐咖啡冻结,生成记录.
  • 生成匹配中记录,同步到ES.
  • 调用异步匹配事件

1.1 异步匹配事件

  • 发起者Es查询接口
  • 获取相互匹配数据
  • 循环校验当前两用户是否可以持久锁
  • 修改匹配成功状态
  • 释放锁

2、超时匹配

  • 校验当前用户的匹配状态
  • 校验用户占有锁,持有锁
  • 修改用户匹配状态,移除用户等待池
  • 释放锁

3、中断匹配

  • 校验当前用户的匹配状态
  • 校验用户占有锁,持有锁
  • 修改用户匹配状态,移除用户等待池
  • 释放锁

4、 购买尊享卡/同城卡

  • 校验当前用户的匹配状态
  • 校验用户占有锁,持有锁
  • 冻结积分,修改用户匹配排序值(ES)
  • 释放锁
  • 调用异步匹配事件

趣味玩法分佣

com.nijia.play.rpc.order.provider.PlayKfOrderRpcImpl#createSocialKfOrderHuifu

com.nijia.play.rpc.order.provider.PlayKfOrderRpcImpl#createMorePersonKfOrder

com.nijia.play.rpc.commission.feign.OrderCommissionRecordRpc#socialAdd

无创作者分佣

汇付账号-余额支付 com.nijia.pay.huifu.service.impl.HuifuBalancePayServiceImpl#payCommission 涉及到的表 order_settle_commission,