[--- theme: juejin
匹配规则
方案一 redis zset存储
1、用两个zset分别存储会员池和普通池
2、会员池的排序值用两个自增和自减来控制,买同城卡就自减,尊享卡就自增
3、普通池的排序值可直接用当前匹配时间来作为排序值
4、当用户开始匹配时,先将自身插入到普通池最后一位,然后发送事件去异步执行匹配,分别和会员池和普通池匹配.(或者可以丢到mq去消费)
5、内存匹配流程:先匹配会员池的用户,再匹配普通池的用户
并发问题:
1、多个人同时匹配情况
// 线程A 先插入A 再查询
// 线程B 先插入B 再查询
因为方案是先插入后捞取数据,所以多个线程过来执行的时候,捞取的时候一定是包含自身的.
2、匹配时,有部分用户从普通池升级到会员池
因为两个池里面的用户都是等待被匹配用户的,因为购买同城卡其实缩小匹配范围.假设,如果用户A在开始匹配,用户B在普通池,在A的匹配中,B购买同城卡升级到会员池第一位.在A在普通池和B匹配成功时,要再次校验下当前B的匹配条件的有效性.
3、匹配时,当前用户购买同城卡或尊享卡
方案二
es的字段
| 用户id | 用户性别 | 用户城市 | 意向性别 | 意向城市 | 排序 | 过期时间 |
|---|---|---|---|---|---|---|
| userId | sex | cityId | matchSex(不限,男,女) | matchCityId(不限,城市) | sort |
1、sort 排序值可以预留,前100万预留给同城卡,中间100万留给尊享卡,后面就留给普通用户,可以使用redis的自增自减来控制
2、当用户开始匹配时,先将自身插入到普通池最后一位,然后发送事件去异步执行匹配,分别和会员池和普通池匹配.(或者可以丢到mq去消费)
3、匹配流程:
等待池
- 假设用户A是男生,泉州定位,然后选择意向匹配女
用 sql语句展示
select * from match_game where matchCityId in('不限','泉州') and matchSex in('不限','男')
and sex='女' order by sort limit 1;
- 假设用户A是女生,厦门定位,然后选择不限性别
用 sql语句展示
select * from match_game where matchCityId in('不限','厦门') and matchSex in('不限','女')
order by sort limit 1;
超时检测方案
- 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,