V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
szopen
V2EX  ›  职场话题

今天去某公司面试的状态,大家怎么看?

  •  
  •   szopen · 2015-07-08 16:46:31 +08:00 · 6313 次点击
    这是一个创建于 3458 天前的主题,其中的信息可能已经有所发展或是发生改变。
    技术面试的人问了其中几个问题:
    1. 设计一款订单推送系统,然后要保证推送是实时的,因为我说先缓存一下订单来应对访问量,再推送,我说推送有点延迟没问题吧,出题的说我们的订单推送没延迟,下完单后,客户端立马收到推送,那我就说你就直接写库呗(虽然我不知道为什么这样做了就没延迟了)

    2.设计抓100亿页面然后分析,我给出了方案,出题的又问需要多长时间,我说没做过,然后出题的又说你不知道就不说时间了吗?然后我胡扯了一个时间.......

    3.有个问题涉及到缓存数据问题,这次我说先memcache缓存,然后面试官立马说memcache会丢数据,我就说,你用的redis也是延迟的,此时对方没说话了,我只好说那就直接写库,集群,效率嘛服务器上固态硬盘(虽然我知道直接写库也是有延迟的,只时频率不一样的,我在想99.99%与99.999%这两个概率有啥区别)
    30 条回复    2015-07-22 11:28:16 +08:00
    Ison
        1
    Ison  
       2015-07-08 17:18:19 +08:00
    其实有时候俺也怀疑
    到底面试的想要什么人
    是要问什么都能达得上的呢
    还是要问什么都能提供思路的呢
    显然应该是后者
    但为毛有时候面试官会给人是着重前者的感觉呢
    就像lz遇到的情况。。。
    jones
        2
    jones  
       2015-07-08 17:23:13 +08:00 via Android
    第一个问题一般做法订单提交然后把订单ID写队列,然后推送处理程序从队列中拿出来处理,队列用Redis的发布订阅功能实现延迟应该在接收的时间范围内,

    我猜测面试官想让你这么回答,,
    mhycy
        3
    mhycy  
       2015-07-08 17:55:14 +08:00
    怎么从这个答案上看提问者有点傻逼的感觉。。。

    第一题
    对于用户的信息推送,客户端必定会存在一个延迟,这个延迟不是内部产生的,而是由于网络产生必定会存在的一个延迟。因为不可能现在与客户端有一个即时可用的长连接用于推送。所以无延迟是不可能的。

    第二题
    100亿的页面分析,具体需求如果有说清楚的话时间还是可以估算的,但是这个与机器的配置,数目,网络带宽有极大的关系,随便问一个时间是不可能准确回复的,当然你可以说说时间是怎么算的。。

    第三题
    缓存,延迟,丢数据。。。
    越看越觉得面试者是个傻逼,因为缓存总会有容量限制,那么缓存必定会有一个失效期。
    如果要处理延迟尽可能的低,可以另开一个缓存进程,由应用通知进程进行数据缓存操作。
    那么每次读取去取就行了,但这并不能保证数据的一致性。
    (后台更新了,缓存依旧没更新,但只读缓存,这样其实和数据库从库的表现是一致的)
    glasslion
        4
    glasslion  
       2015-07-08 18:57:59 +08:00
    以前面试时遇到过推送的问题,为了用户体验, 创业公司一般会选第三方推送的SDK, 所以既不能让推送的延迟过大, 又要让尽可能多的信息一起推送
    FrankFang128
        5
    FrankFang128  
       2015-07-08 19:01:56 +08:00 via Android
    就题论题有啥意思,面试官抓不住重点。
    lincanbin
        6
    lincanbin  
       2015-07-08 19:49:49 +08:00   ❤️ 1
    1. 要保证无延时,开socket或者Long Poll,订单处理完成后回调推送程序。
    只有异步回调可以做到无延时,但是并不常见。

    2.这跟网络、CPU、硬盘I/O性能关系都很大的,没给足条件自然没有答案。

    3.memcached的数据持久化也是可以自己轻易实现的。
    wy315700
        7
    wy315700  
       2015-07-08 19:52:56 +08:00
    @szopen
    99.99%与99.999%这两个概率有啥区别
    用1减一下就会发现这两个概率差了10倍
    wy315700
        8
    wy315700  
       2015-07-08 19:53:45 +08:00   ❤️ 1
    @Ison
    其实,面试和老师给学生打分是不一样的,
    面试的目的是,面试官在挑同事,
    gamexg
        9
    gamexg  
       2015-07-08 21:07:39 +08:00
    第一个推送很好搞啊,收到订单后把订单数据存数据库,然后推到推送队列里面去。推送服务取出来通过推送系统推到客户端即可。
    推送系统现在有很多了,可以使用第三方的,也可以自己建,做好长连接心跳不拼单机带客户量的话很容易搭建。实测一般2秒内可收到推送。
    sivacohan
        10
    sivacohan  
       2015-07-08 23:17:42 +08:00 via Android
    抛开问题。其实就是你和面试官不在一个频道上。
    对你来说,这样的公司还是不要去的好。
    因为如果不能流畅沟通,那以后一起工作会非常的麻烦。
    sophie2805
        11
    sophie2805  
       2015-07-08 23:20:18 +08:00
    哪个公司的??
    以后绕道~
    szopen
        12
    szopen  
    OP
       2015-07-08 23:36:15 +08:00
    @wy315700 我理解的在故障问题这里,概率10倍与100是没有多大区别的,因为故障只有一次,就如同10个数字中只有一个数字是你要选择的数字一样,他和其他数字被命中的机会是一样的,就像魔兽世界刷凤凰坐骑,有的刷了三年不出,有的一次就出是一个道理

    @gamexg @jones 我当时的思路其实就大批量订单先缓存,然后在处理,我说可能会有一点延迟,面试的指出不能有延迟,所以队列肯定不行,
    szopen
        13
    szopen  
    OP
       2015-07-08 23:41:42 +08:00
    @sivacohan 想想的确不在一个频道

    这次面试让我想起另一次去大公司面试,故事是这样:我说我用PHP做了一个web服务器,然后面试的一脸蔑视地说你做这些有什么用!我当时就愣住了
    wy315700
        14
    wy315700  
       2015-07-08 23:50:00 +08:00
    @szopen

    则个属于概率论里一个悖论,就是概率再低,也会发生,概率再高,也有不会发生的。

    因为如果样本足够大,即使概率再低都会发生。

    所以这个时候要考虑的是后验概率,已知平均故障率的情况下,发生一次故障的概率,发生两次故障的概率,今天发生故障的概率,这周发生故障的概率。
    10和100倍的差距就在这里体现了。
    Cloudee
        15
    Cloudee  
       2015-07-09 00:28:01 +08:00
    @szopen 这个时候应该一脸鄙视地回答“Because I can”
    akira
        16
    akira  
       2015-07-09 01:11:34 +08:00
    1. 实时的意思应该是在数秒之内。客户端和服务器端保持长连应该可以做到。另外应该会用到消息队列。
    2. 这种题目自己做条件假设。假设服务器系统内存带宽等必要参数,然后根据这些参数计算个结果出来。
    3. 写缓存确实有这个问题。读缓存的话,丢了重新读就是了呗。
    helloworld00
        17
    helloworld00  
       2015-07-09 07:22:37 +08:00
    我在想99.99%与99.999%这两个概率有啥区别

    举个简单的例子,如果1-99.99%=0.0001是一台服务器A一个礼拜至少crash一次的概率;
    1-99.999%=1.0e-5是一台服务器B一个礼拜crash至少一次的概率。

    一个50,000台服务器A的clusters,平均每个礼拜就有5台服务器至少会crash一次,每个月就有20台机子至少会crash一次,每年就会有240台服务器至少会crash一次。

    另外一个50,000台服务器B的clusters,稍微好点,平均每个礼拜会有0.5台服务器至少会crash一次,每个月2台,每年24台至少会crash一次。
    helloworld00
        18
    helloworld00  
       2015-07-09 07:31:31 +08:00
    UPDATE 楼上

    不是一个50,000台服务器的clusters,是包含50,000 台服务器的clusters

    一般一个大cluster可能10,000左右的服务器.
    (参考 google borg)
    http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/43438.pdf
    morethansean
        19
    morethansean  
       2015-07-09 09:17:09 +08:00
    一个网站,你们的 API 设定全年可用性为 99.99%:
    365*24*60*(1-.9999) = 52.556 就是说一年之中只能挂最多53分钟

    可用性 99.999%:
    365*24*60*(1-.99999) = 5.25599999997608 一年中只能挂5分钟

    这10倍的差距,后者你可能连问题都来不及修复吧。
    morethansean
        20
    morethansean  
       2015-07-09 09:18:07 +08:00
    楼上精神恍惚打成 A 了……
    wesley
        21
    wesley  
       2015-07-09 09:37:25 +08:00   ❤️ 4
    一般面试时动辄百万uv, 多少T数据要处理的都是唬人的,
    又一次面试一小公司, 对方问我, 2个服务器之间网络很差, 有几百G数据要同步,怎么样最快
    我回答:"发顺丰"
    szopen
        22
    szopen  
    OP
       2015-07-09 10:03:32 +08:00
    @helloworld00 我倒是没考虑多台机器的情况, 只考虑单台机器的故障率
    ijse
        23
    ijse  
       2015-07-09 10:04:10 +08:00
    @wesley LOL~~太机智了
    mhycy
        24
    mhycy  
       2015-07-09 10:10:54 +08:00
    @wesley
    赞!这答案比任何软件方案都要靠谱!
    wikimore
        25
    wikimore  
       2015-07-09 10:58:33 +08:00   ❤️ 1
    第一题:
    订单肯定要直接写库,至于性能,只能靠分库分表,提升硬件来解决(常说的scale out和scale up),写库之后,发送订单消息给消息中间件,如RabbitMQ,ActiveMQ,Kafka等,后面再挂很多的推送服务器,接收订单消息,推送给用户,整个系统应该都可以做到无单点。
    第二题:
    就是设计一个爬虫系统,可以参考apache的nutch,存储系统可以考虑hdfs做离线分析,或者直接用spark做实事分析(这取决分析的业务),问时间,我觉得没有准确的答案,因为和集群大小,硬件,网络有关,你只需要给出一个计算的思路就可以了
    第三题:
    楼主没有描述清楚,不过我觉得楼主可能没有理解面试官的意思,缓存会失效,不丢只有落盘,redis倒是有一个store模式,不过当内存不够用时,性能就会急剧下降。

    楼主第一题和第三题写数据的时候都考虑缓存,这个应该不太合理,缓存只在读时才有,写时应该是缓冲区,一般应用层面不需要考虑,目的是减少系统调用。

    有些分析可能不够到位,不对的地方希望大家指出
    loveuqian
        26
    loveuqian  
       2015-07-09 11:02:49 +08:00 via iPhone
    @wesley 笑23333
    justfor
        27
    justfor  
       2015-07-09 12:32:55 +08:00
    @wesley 谷歌就是这么干的。
    axb
        28
    axb  
       2015-07-09 13:22:17 +08:00
    楼主应该没做过负载比较高、规模比较大系统,或者是从传统企业转型、缓存用的比较少,导致你和面试官不在一个层面上思考问题。

    第一个问题问的是消息如何快速推送,不知道为什么会被理解成数据库延迟,这里也表现出楼主缓存用的不深,不清楚“缓存的延迟”到底是多少。

    第二个问题属于架构设计,一个新系统上线之前需要对系统做数据计算和评估,评估集群的规模和可能的风险点。楼主随便拍了个数说明之前应该没有主导过量级达到一定程度的系统设计,毕竟集群里多一台机器就意味着每年几万的支出。

    第三个问题是缓存的使用,缓存会不会丢数据和有没有延迟是两件事,如果是memcached这种缓存,数据重启就没了,需要有一个可以落地的存储来保证数据不丢,而如果用redis这种自带落地功能的缓存,对于非核心数据来说是基本可以保证数据不丢的。

    最后那句我也没看懂楼主想表达什么。
    lucky2touch
        29
    lucky2touch  
       2015-07-09 15:35:00 +08:00
    说说我的理解吧
    1.我认为就是考察多线程和一些基本常识。
    2.不清楚题目核心是在抓取还是在分析,都有一些多线程,并行计算,数据汇总之类的。
    3.题目不清楚,不好回答,一般缓存相关的问题有命中率,活跃数据的存留机制,数据持久化以及与缓存相关的雪崩问题。
    最后4个9,5个9的问题
    @morethansean 说得比较清楚,假如是淘宝这样的系统,一年5分钟的宕机损失和50分钟的宕机损失可不一定是线性的。
    tina90
        30
    tina90  
       2015-07-22 11:28:16 +08:00
    楼主,最近看机会吗?我这边有美图秀秀。滴滴打车。美团。互联网金融等等公司的PHP机会,不知道你考不考虑,我的邮箱是[email protected]
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1011 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 20:24 · PVG 04:24 · LAX 12:24 · JFK 15:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.