• 阿里技术专家?10年+工作经验?架构能力不错但是….


    阿里技术专家?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是在什么时候替换得呀)答得不确定
    (这两种得差一点在哪里)
    
  • 相关阅读:
    STL源码剖析之_allocate函数
    PAT 1018. Public Bike Management
    PAT 1016. Phone Bills
    PAT 1012. The Best Rank
    PAT 1014. Waiting in Line
    PAT 1026. Table Tennis
    PAT 1017. Queueing at Bank
    STL源码剖析之list的sort函数实现
    吃到鸡蛋好吃,看看是哪只母鸡下的蛋:好用的Sqlite3
    cJSON
  • 原文地址:https://www.cnblogs.com/q1359720840/p/16311236.html
Copyright © 2020-2023  润新知