红包的设计实现
红包的设计实现
红包功能的设计实现是⼀个很有趣的话题,主要的功能是P个⼈抢总⾦额M的N个红包,满⾜先抢的N个⼈能抢到红包。如果这是⼀个leetcode的算法题⽬难度应该是easy,只要保证Ni抢到的⾦额区间在[0.01,2倍剩余⾦额平均值)就能ac。
将算法带⼊到真实的⼯程实现,问题就要复杂得多,如果达到的量级,明显要考虑的有以下⼏点。
1. 拆红包
2. ⾼并发读
3. 并发写
4. ⽹络流量峰值
5. 对账
6. 降级
7. 故障恢复
拆红包
拆红包有预拆包和实时拆包2种策略
预拆包策略
江西中考2022时间预拆包的策略在发红包时将⾦额M的红包拆分成N份,将分配好的结果放⼊内存队列或者cache,通过incr操作在⽤户抢红包时分配预算好的红包slot,预算的策略可以避免对共享资源的操作,减少了锁竞争,服务本⾝是⽆状态的,设计和实现相对简单,伸缩性较好。劣势是需要额外的存储空间,如果存在⼤量活跃红包或者红包份数很多时会增加成本。
实时拆包
实时拆包的策略在⽤户抢红包时实时拆包计算⾦额,这样只需要保存剩余红包数量和⾦额,不需要额外保存每个预拆包的红包⾦额。使⽤预拆包的策略会⾯临并发写的问题,如果多个拆红包的请求同时执⾏会导致数据不⼀致引起超发的问题,可以使⽤CAS操作实现乐观锁保证并发拆包不会出现问题。
⾼并发读二年级上册数学教学计划
应对⾼并发读的通常思路是业务层拦截过滤⽆效请求,使⽤有效的缓存。可以使⽤Cache层decr功能
记录请求红包的⽤户数,当decr到0后就拦截后⾯的请求直接返回,对DAO层也要增加相应的缓存减少数据库的压⼒。
并发写
应对并发写的通常思路是串⾏化和乐观锁。在⽤户抢红包时实时拆包计算⾦额,每抢到⼀个红包,就cas更新剩余⾦额和红包个数,同时在DB中记录凭证,考虑到DB的写⼊压⼒,需要做分库分表,冷热分离。
⽹络流量峰值
⼤量⽤户同时抢红包是否会造成⽹络拥塞,发红包和抢红包最好在同⼀个IDC。
对账
考虑到拆红包凭证和⼊账是异步的2套系统,以及出现故障的可能,需要定时对账保证数据的⼀致性。
好听的女生英文名字降级
在cache故障时有限流的使⽤DB进⾏服务,在资源紧张的时候关闭掉⾮核⼼流程,在实时⼊账请求量过⼤时,延迟批量⼊账。
背景:有某个朋友在朋友圈咨询红包的架构,于是乎有了下⾯的⽂字(有误请提出,谢谢)
概况:2014年红包使⽤数据库硬抗整个流量,2015年使⽤cache抗流量。
1. 的⾦额什么时候算?
答:⾦额是拆的时候实时算出来,不是预先分配的,采⽤的是纯内存计算,不需要预算空间存储。。
采取实时计算⾦额的考虑:预算需要占存储,实时效率很⾼,预算才效率低。
2. 实时性:为什么明明抢到红包,点开后发现没有?
答:2014年的红包⼀点开就知道⾦额,分两次操作,先抢到⾦额,然后再转账。
2015年的红包的拆和抢是分离的,需要点两次,因此会出现抢到红包了,但点开后告知红包已经被领完的状况。进⼊到第⼀个页⾯不代表抢到,只表⽰当时红包还有。
3. 分配:红包⾥的⾦额怎么算?为什么出现各个红包⾦额相差很⼤?
答:随机,额度在0.01和剩余平均值*2之间。
例如:发100块钱,总共10个红包,那么平均值是10块钱⼀个,那么发出来的红包的额度在0.01元~20元之间波动。
当前⾯3个红包总共被领了40块钱时,剩下60块钱,总共7个红包,那么这7个红包的额度在:0.01~(60/7*2)=17.14之间。
注意:这⾥的算法是每被抢⼀个后,剩下的会再次执⾏上⾯的这样的算法(Tim⽼师也觉得上述算法太复杂,不知基于什么样的考虑)。
这样算下去,会超过最开始的全部⾦额,因此到了最后⾯如果不够这么算,那么会采取如下算法:保证剩余⽤户能拿到最低1分钱即可。
如果前⾯的⼈⼿⽓不好,那么后⾯的余额越多,红包额度也就越多,因此实际概率⼀样的。
4. 红包的设计
年轻人提前还房贷是亏还是赚答:从财付通拉取⾦额数据郭莱,⽣成个数/红包类型/⾦额放到redis集⾥,app端将红包ID的请求放⼊请求队列中,如果发现超过红包的个数,直接返回。根据红包的裸祭处理成功得到令牌请求,则由财付通进⾏⼀致性调⽤,通过像⽐特币⼀样,两边保存交易记录,交易后交给第三⽅服务审计,如果交易过程中出现不⼀致就强制回归。
5. 发性处理:红包如何计算被抢完?
答:cache会抵抗⽆效请求,将⽆效的请求过滤掉,实际进⼊到后台的量不⼤。cache记录红包个数,原⼦操作进⾏个数递减,到0表⽰被抢光。财付通按照20万笔每秒⼊账准备,但实际还不到8万每秒。
6. 通如何保持8w每秒的写⼊?
答:多主sharding,⽔平扩展机器。
7. 据容量多少?
答:⼀个红包只占⼀条记录,有效期只有⼏天,因此不需要太多空间。
8. 询红包分配,压⼒⼤不?
答:抢到红包的⼈数和红包都在⼀条cache记录上,没有太⼤的查询压⼒。
9. ⼀个红包⼀个队列?
答:没有队列,⼀个红包⼀条数据,数据上有⼀个计数器字段。
厨房家电品牌
0. 有没有从数据上证明每个红包的概率是不是均等?
答:不是绝对均等,就是⼀个简单的拍脑袋算法。
1. 拍脑袋算法,会不会出现两个最佳?
答:会出现⾦额⼀样的,但是⼿⽓最佳只有⼀个,先抢到的那个最佳。
2. 每领⼀个红包就更新数据么?
答:每抢到⼀个红包,就cas更新剩余⾦额和红包个数。
3. 红包如何⼊库⼊账?
数据库会累加已经领取的个数与⾦额,插⼊⼀条领取记录。⼊账则是后台异步操作。朋友祝福
4. ⼊帐出错怎么办?⽐如红包个数没了,但余额还有?
答:最后会有⼀个take all操作。另外还有⼀个对账来保障。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。