阿里技术专家?10年+工作经验?架构能力不错但是….
资源地址来自b站极海https://www.bilibili.com/video/BV1j44y1678D?p=1
我们要设计一个电商的活动,有10个亿想分发出去,活动可能有那种红包雨什么的,
用户点到红包,给他拿到多少钱,架构怎么设计啊?
金额10个亿的红包,多长时间里发出去,一天并发量就很低,10分钟发完,并发量就很大,涉及到系统怎么样去做的问题(比如说,十几秒吧),有没有什么限制,我一个红包不能超过多少?我要拆成多少个红包(每个人最多抢10块钱),至少有一个亿个红包嘛,一个红包我可以在后台起多个线程去,10个线程去发一个亿的红包,肯定控制一个亿不能超的呀,这肯定都是通过内存去计算,(这几个线程都在一台机器上吗?扛不住吧)
至少10台机器去发,有可能某一台机器,某个线程挂掉了(这个红包存在哪里呢),两种存储,一个是db肯定要存,另外就是缓存,疯狂发红包的时候计算肯定是通过缓存,(这个缓存是缓存在什么地方是应用机器的地方吗)它应该把一个亿对应每个线程多少红包,把红包拆掉,如果红包量比较大,那么这个内存就挂了,还是要用集群,比如说redis,(redis分片也会挂掉啊)它可以选举啊,从当主啊,(万一从节点的数据还没同步过去怎么办)我觉得可以做一个主备的,不做从了,另外一台机器只是一个备份,主从的话会有一个延迟,(主备没有延迟吗)主备有延迟呀,这个不是主要的嘛,主要是防止出现异常,要是你少同步过去的数据,那么我就是以最小的量去算,比如说有10块钱没同步过去,至少保证不会超啊,缓存肯定要用的,然后还有异步,用户抢到红包之后,要进行拆红包,要进行一个拆红包的记录,最好不要在当前应用里面去做,我可以发一个消息在一个拆红包的应用,去做拆红的动作,专门用一个记录红包的一个集群去做一个系统,这样把流量全部都分散掉(用户点点点,点多次拆红包,你觉得能不能提前给客户端,让客户端提前做这个效果),你是说他点一下我把红包发到客户端,再点就不会到服务端了吧,假如说他多次请求的,你怎么防止他把请求不发到服务端呢? 可以的,我把这个红包发到客户端,点了之后客户端就有一个标记,这个标记不止客户端有,服务端也有
面试官的方案:
qps可能千万级别,红包雨的效果,请求可以分散掉的,可能百万级别,百万级别单机的话,10万的qps,几十台机器就够了,机器肯定集群去抗了,单机肯定不可能了,红包的扣减,数据库肯定扛不住,红包分片去缓存到内存里,redis不考虑了,分布式系统复杂有超时和数据同步网络通信时间的存在,100台机器,每台机器平均一定 的金额,每台机器一百万的金额,金额在本地去扣减性能最高的,你怎么知道每个用户分了多少钱,需要持久化到数据库,在内存里生成一个队列,在一个短暂的时间窗口,去把这些流水去批量的写入到数据库
(扣了库存没同步到数据库,机器挂了怎么办)开启一个事务,批量写流水,不要提交事务,在内存里面去扣减,扣成功了在去提交整个事务。保证扣减和批量写入数据库是一致的,数据库只有写入没有修改,性能可以很高,扣红包金额不能用批量的方式,批量扣数据库,底层有行锁的竞争的,不太好去扩容
怎么理解面向对象的一些设计原则的?
封闭原则
接口隔离
里氏替换原则
(java重写破坏了什么原则)
接口和抽象类的区别
接口定义标准,抽象类定义标准的同时实现公共的方法
领域驱动设计是怎么理解啊?
把原来流式在技术层面按照领域边界划分号,每个领域,内部自己去做一个实现或者说解耦,最终给一个聚合根到外面去访问,去访问到领域内部的数据,原来的是贫血模型,原来只有一个bean对象没有一个功能,把对象独有的一些功能全部抽到对象里面来了,拿到对象就知道功能,不需要再service实现方法。(什么场景符合领域驱动啊)场景复杂,有一定规模,把大的拆成更细的范畴,(作为leader怎么去协调大家落地),首先由框架,分层分包,规范定好,人员进行填空,
jvm的压力测试怎么实现的
模拟线上的一个大的高并发演练,找这个整个的一个交易流程,随机准备好一些数据,在下班的时候,把这些数据通过多线程,并发然后提交到服务端,这个数据是走正常线上的一个链路,所以这个数据是不能落到正式环境的数据库,里面造成脏数据,要有一个标记,是压力测试的标记,数据会落到影子库,这个流量是走正式的环境的是落地落得不一样(他这个标记是怎么去传递得呀)它就是通过上下文比如说threadlocal,(启异步线程了怎么办?)启异步线程都可以threadlocal,有一个inheritedThreadlocal是对子线程可见得呀,(如果你们对线上得数据做回放得话,怎么保证不会对线上得数据有影响得)我们主要是对查询类得做回放,修改类得回放不了
会有接口rt高得分析吗?
要么机器性能差,要么依赖别的服务,通过啊尔萨斯(底层怎么去实现这个监控得呀),就像aop一样
死锁问题遇到过吗,cpu是0还是100%?
只是在等待,并没有去执行,是0,(死锁一般怎么去排查呢)jstack去分析线程得生产栈日志
[这个设计到锁升级不同得锁情况cpu利用率也不同]
mysql得底层,高并发得写入去更新有什么优化得机制啊?
缓存批量去处理,具体不知道
aop代理替换bean怎么去做得?
cglib和jdk动态代理
cglib是通过子类
jdk动态代理是实现接口
(spring是在什么时候替换得呀)答得不确定
(这两种得差一点在哪里)