2015年的红包的拆和抢是分离的,需要点两次,因此会出现抢到红包了,但点开后告知红包已经被领完的状况。进入到第一个页面不代表抢到,只表示当时红包还有。详见本文Jinkey在第五部分的说明。
⑩红包的设计
答:微信从财付通拉取金额数据过来,生成个数/红包类型/金额放到redis集群里,app端将红包ID的请求放入请求队列中,如果发现超过红包的个数,直接返回。根据红包的逻辑处理成功得到令牌请求,则由财付通进行一致性调用,通过像比特币一样,两边保存交易记录,交易后交给第三方服务审计,如果交易过程中出现不一致就强制回归。
?并发性处理:红包如何计算被抢完?
答:cache会抵抗无效请求,将无效的请求过滤掉,实际进入到后台的量不大。cache记录红包个数,原子操作进行个数递减,到0表示被抢光。财付通按照20万笔每秒入账准备,但实际还不到8万每秒。
?如何保持8w每秒的写入?
答:多主sharding,水平扩展机器。
?查询红包分配,压力大不?
答:抢到红包的人数和红包都在一条cache记录上,没有太大的查询压力。
?一个红包一个队列?
答:没有队列,一个红包一条数据,数据上有一个计数器字段。
?每领一个红包就更新数据么?
答:每抢到一个红包,就cas更新剩余金额和红包个数。
?红包如何入库入账?
数据库会累加已经领取的个数与金额,插入一条领取记录。入账则是后台异步操作。
?入帐出错怎么办?比如红包个数没了,但余额还有?
答:最后会有一个take all操作。另外还有一个对账来保障。
5交互
5.1前后端交互时序
(1)绑定银行卡
(2)收发群手气红包
① 发起红包操作
② 银行扣款逻辑,不成功则返回,成功则进行下一步
③ 请求将红包写入数据库某个set,并获取红包ID返回客户端
④ 长连接通知客户端成功
⑤ 其他用户接收到红包消息,点开,拆。由于用户操作的速度远远低于计算机处理速度,所以这打开和拆开的分离,相当于设置了一道缓冲。另外,点开之后,不直接获取金额,而是先读取红包是否领完的缓存,如果没领完则显示【拆】的按钮。点击【拆】之后再次访问缓存看红包是否领完,如果没领完,则请求服务器内存计算随机金额并返回客户端,然后异步写入数据库。
湘ICP备2022002427号-10 湘公网安备:43070202000427号
© 2013~2024 haote.com 好特网