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

被问到“有一个接口需要返回 10w 条数据,应该怎么做?”该如何回答?

  •  1
     
  •   avk458 · 2019-05-27 21:35:32 +08:00 · 10016 次点击
    这是一个创建于 2032 天前的主题,其中的信息可能已经有所发展或是发生改变。

    面试岗位是 Java,按照分页的逻辑按需返回,被告知不对。

    第 1 条附言  ·  2019-05-28 16:59:51 +08:00
    谢谢大家的回复,被告知回答不对之后我这样说的:“请问是什么业务场景下需要做这样的返回?”
    面试官曰:“你别管什么场景,你就告诉我应该怎么做就是了。”

    我真的懵 B 了啊。。。

    最后我请教面试官那么应该如何做?答曰应该以一个流的形式返回出去。
    50 条回复    2019-06-01 13:22:42 +08:00
    Tony1957
        1
    Tony1957  
       2019-05-27 21:38:59 +08:00
    有没有考虑过不限于 http 或 https 的接口协议?
    acehow
        2
    acehow  
       2019-05-27 21:41:33 +08:00 via Android   ❤️ 2
    就返回十万条数据喽,扔 buffer 里以 stream 的形式返回呗。
    lululau
        3
    lululau  
       2019-05-27 21:43:49 +08:00 via iPhone   ❤️ 2
    如果他说的是同步响应的 http 接口的话我想知道答案;如果不是,那接口有很多种啊,做成异步丢到 ftp、云存储啊
    billrice
        4
    billrice  
       2019-05-27 21:43:55 +08:00
    写一个 csv 文件返回去,lol
    winglight2016
        5
    winglight2016  
       2019-05-27 21:44:32 +08:00
    websocket ?
    avk458
        6
    avk458  
    OP
       2019-05-27 21:44:34 +08:00
    @acehow 能详细说一下么?
    dingyaguang117
        7
    dingyaguang117  
       2019-05-27 21:46:15 +08:00   ❤️ 1
    假设需求合理,考虑可以优化的方面:压缩 、Chunked 等等,我感觉面试官想考你这些
    MoHen9
        8
    MoHen9  
       2019-05-27 21:49:13 +08:00 via Android   ❤️ 3
    不应该问问是什么数据库吗?你存时序数据库,返回十万条数据很多吗?
    不应该问问时效性如何?数据量大不大?需不需要一次性返回?

    得搞清楚应用场景吧!否则怎么尽可能挑选最优方案。
    xiangyuecn
        9
    xiangyuecn  
       2019-05-27 21:51:36 +08:00   ❤️ 2
    就帖子标题来看:

    这是一道阅读理解题目而已,哪有唯一、标准答案?

    说不定特定场景下,调用了一下接口,然后人工 拿 U 盘拷数据 是最佳解决方案也不一定呢?

    你已经回答了,但“被告知不对” ,此时你应该怼回去😊
    murmur
        10
    murmur  
       2019-05-27 21:53:13 +08:00   ❤️ 1
    10w 条数据你有需要就返回呗,只要数据库不崩就行,当年 12306 下载几十 mb 的列车运行图也没崩啊
    shawndev
        11
    shawndev  
       2019-05-27 22:29:17 +08:00
    分表,分库,CDN,缓存,chunk,由文本格式改为二进制格式,分页返回,由 http 改为 socket 连接。可以展开的点很多,不知道面试官想问什么。
    gamexg
        12
    gamexg  
       2019-05-27 22:30:44 +08:00 via Android
    既然分页不对,
    也许考的是流式返回?

    不过 10w 数据量也不是太大,
    我这一个 go 服务,返回在线列表( go 内的数据,不经过数据库),达到了 10w 级别,直接 json 返回,除了注意下 http 的 gzip 压缩下尺寸,没做其他处理,跑的很挺好。

    不过我这是内部调用,几分钟才一次,压力很小。
    看题目的意思可能是考的流式处理?
    全程流式,读一部分就处理一部分发给客户一部分,不要全部都放到内存?
    gamexg
        13
    gamexg  
       2019-05-27 22:33:18 +08:00 via Android
    @gamexg
    额,不对,
    单服务器跑得是多个实例,单个实例应该没到 10w 级别,
    但是也是 w 级别的。
    kevinlm
        14
    kevinlm  
       2019-05-27 22:58:02 +08:00 via iPhone
    接口?什么协议的?
    十万的文本,直接文件形式返回吧。
    之所以用文件,是可以多线程做…还能断点续传

    我瞎蒙的,手动滑稽
    ffeii
        15
    ffeii  
       2019-05-27 22:59:13 +08:00 via iPhone
    估计问 reactor
    qwerthhusn
        16
    qwerthhusn  
       2019-05-27 23:03:13 +08:00
    导出
    6260628
        17
    6260628  
       2019-05-27 23:09:31 +08:00 via iPhone
    怼回去是正确答案
    AlisaDestiny
        18
    AlisaDestiny  
       2019-05-27 23:21:31 +08:00   ❤️ 1
    你当时怎么不在答错之后请教一下他期望的正确方式呢?
    billlee
        19
    billlee  
       2019-05-28 00:34:13 +08:00   ❤️ 1
    这种问题应该是考察分析问题的能力,应该一步一步问清楚是什么性质的数据,比如

    一条数据多大?
    是固定的还是每次变化的?
    如果是变化的那是怎么生成的?
    客户端是可以迭代式处理,还是要收到所有数据后才能处理?
    autogen
        20
    autogen  
       2019-05-28 00:36:30 +08:00
    分页。。。
    ericls
        21
    ericls  
       2019-05-28 00:53:06 +08:00 via iPhone
    增大 timeout
    dangyuluo
        22
    dangyuluo  
       2019-05-28 01:05:47 +08:00   ❤️ 9
    他的问题不准确,应该问:有一个接口需要返回 10w 条数据,你猜我们是怎么做的?
    Zzdex
        23
    Zzdex  
       2019-05-28 01:08:35 +08:00 via iPhone   ❤️ 1
    等个答案
    Bramblex2
        24
    Bramblex2  
       2019-05-28 01:44:49 +08:00   ❤️ 8
    没面过人的是不能理解这道题的精髓的。这道题的不在于怎么回答,而在于在怎么向面试官提问,来补充具体的细节。你能问的越细,说明你对这个领域的问题越熟悉。

    比如:
    1. 十万条什么数据?每条数据多大?
    2. 要求一次性返回还是可以分段返回?
    3. 数据来源是什么?数据库? redis ?文件?即时运算?
    4. 需要同时处理多少并发量?

    上面每一个细节不同都会直接影响你服务的设计。
    widewing
        25
    widewing  
       2019-05-28 01:46:35 +08:00 via Android
    假设一条数据 1000 字节也才 100M,压缩后 5-10M,直接返回呗。话说这种需求不是 elasticsearch 的日常吗?建立个物化视图之类的东东然后分页返回
    webshe11
        26
    webshe11  
       2019-05-28 05:28:56 +08:00   ❤️ 6
    问题都没问清楚
    我觉得可以返回一个 json,里面是百度云 URL 和分享密码
    opengps
        27
    opengps  
       2019-05-28 07:27:11 +08:00 via Android
    我还真遇到过这么一个场景,地图上同时显示十万以上设备经纬度。这个没找到太合适的解决办法,最终做了这么几个操作:
    1,降低精度,最早的经纬度精确到小数点之后 10 位之多,在 10 万的级别下,只返回小数点之后 3 位
    2,分批次,类似于分页,在锁住地图可视范围下每次只加载 1 万条
    3,缩减 json 字符,用索引号表示 key,再加一组 key 的对照说明
    luozic
        28
    luozic  
       2019-05-28 07:50:27 +08:00
    1.必須降低,否則是垃圾需求,系統都挂了、響應要幾小時的有 JB 用。
    2.能異步就異步
    3.能傳加密+保證數據安全性的方式就上上啥方式
    4. 最好的實際是異步定時任務 搞個本地數據 excel/定義格式給他玩 jb。
    wormcy
        29
    wormcy  
       2019-05-28 08:20:41 +08:00
    这么开放的题目哪有对错
    wormcy
        30
    wormcy  
       2019-05-28 08:21:55 +08:00
    返回数据库的用户名和密码,自己来取。。。
    crazypig14
        31
    crazypig14  
       2019-05-28 08:22:23 +08:00
    没人提到订阅?
    donyee
        32
    donyee  
       2019-05-28 08:49:32 +08:00
    csv 文件,压缩一下;
    支付宝对账文件好像就是这么处理的;
    yulitian888
        33
    yulitian888  
       2019-05-28 08:52:54 +08:00   ❤️ 2
    有 [一个接口] 需要返回 10w 条数据,应该怎么做?
    答:应该把设计这个接口的人拖出去打!

    现实业务场景里需要一次性使用大量数据的场合就那么几种。
    想做数据分析了,上 BI ;想做数据分享了,走订阅;要做数据同步,做异步。真的有二杆子需求说想要看到“一切”,顶多就是提供下载,然后做个压缩丢个 csv 出去好了。

    这种事情我遇到过一次,直接整库导出为 Access 文件,加个密码丢过去,万事大吉。
    tuding
        34
    tuding  
       2019-05-28 09:17:22 +08:00
    奇葩

    直接怼回去, 分页怎么就不对了?!
    SimonOne
        35
    SimonOne  
       2019-05-28 09:31:06 +08:00
    另一家外包公司给了 json 串
    wizardoz
        36
    wizardoz  
       2019-05-28 09:35:27 +08:00
    python 的话我觉得是 yield 吧,Java 可能面试官也是需要类似的答案?
    JASONWOOD
        37
    JASONWOOD  
       2019-05-28 09:36:44 +08:00
    @wormcy 这么骚的操作
    pmispig
        38
    pmispig  
       2019-05-28 09:50:28 +08:00   ❤️ 2
    很多傻逼就是自己预设了一个答案,根本不考虑你的思考过程,只要跟他预设的不一样你否定你,不用烦恼,这样的傻逼很多
    tabris17
        39
    tabris17  
       2019-05-28 09:55:26 +08:00
    怼回去啊:“没有具体场景谈解决方案就是耍流氓”
    FionWay
        40
    FionWay  
       2019-05-28 10:03:38 +08:00
    哈哈哈哈 我做为毕业就没“复制”过代码的产品,第一反应也是分页
    sammeishi
        41
    sammeishi  
       2019-05-28 10:09:25 +08:00 via Android   ❤️ 1
    跪舔型:
    老师这个题目一看您就是老江湖了,佩服佩服,我个人觉得输出端肯定要做内存 cache 防止阻塞 IO,然后在分块后使用流并发推送防止。。。。最后在使用。。。。。 您老法眼看看可以吗?
    真-程序员型:
    老师,您脑子里的水没排干吗? 什么业务需求一次输出 10w ? 应用端一次请求 10w 设计者是大学生吗?把接口当下载机吗? 是迅雷玩上瘾了吗? 考虑过好好看病吗?
    encro
        42
    encro  
       2019-05-28 10:12:41 +08:00
    想要的答案应该是:1,返回一个 TaskID,2,Task 完成通知;3,根据 Task_id 自己过来取.4,取的时候分 chuck 返回不要一次读取.
    moonsola
        43
    moonsola  
       2019-05-28 10:16:39 +08:00
    不管面试官的初衷是什么,这种问题更考验的是需求沟通能力。
    很多面试官也就是随口提一个问题,他心中有一个完善的使用场景,但是你不知道啊,你得问出来。

    客户或者产品经理上来问一句“我要对接一个接口,需要返回 10w 条数据,能做吗?”
    你就回答个“能”,然后开始调分页的轮子?不需要确认下其他的信息?
    10Buns
        44
    10Buns  
       2019-05-28 10:30:31 +08:00
    面试官是期望你需求分析吧?
    lihongjie0209
        45
    lihongjie0209  
       2019-05-28 10:48:45 +08:00
    所有的技术问题都会回到需求分析上.
    FelixLiu
        46
    FelixLiu  
       2019-05-28 11:02:17 +08:00
    我觉得我听过这个问题会很迷茫。这 10w 条数据是什么数据?数、字符串 or 对象?数据类型不同,可能就会产生不同的处理方法,我觉得你应该搞清具体需求是什么。
    icaca
        47
    icaca  
       2019-05-28 11:19:35 +08:00
    可能是面试官所遇到的问题,可以入职之后帮他解决此问题。
    wclssdn
        48
    wclssdn  
       2019-05-28 11:19:59 +08:00
    不说业务场景,单接口返回 10w 条数据是傻 x 么。。。
    如果真要返回:
    那 10w 条是怎么产生的?如果要回答这个问题,那就要看业务场景,数据时效性如何。是否适合缓存,能否用 cdn。
    如果一定要用 http 接口,则需要自行设计内容格式,每行独立编码,可流式解码。如果用 linux,一定要用系统态发文件。应用层要支持 range、gzip。
    性能角度,单次接口耗时多久?单服务器 qps 能到多少,业务 qps 峰值多少?如果多台服务器提供服务,是否对不同用户需要提供不同的 10w 行记录(不同时间方案的 10w 行数据是有差异的)。这又可以做共享缓存方面的优化。

    任何抛开业务场景谈架构的都是傻 x。。。 如果面我这个问题,我可以答,但我听不到实际的应用场景,我不会去这家公司(为了面试出傻 x 问题的人是傻 x )
    realpg
        49
    realpg  
       2019-05-28 11:39:20 +08:00
    以我现在手头的项目而论 如果一次返回 10W 条数据,最好的办法就是拿着硬盘去机房拷回来

    如果对方不愿意给更多限定 那你就列出一系列不同场景的解决方案 以示自己的阅历并让只在脑袋里出一种他们经历过情况的出题的人一脸懵逼
    Vendettar
        50
    Vendettar  
       2019-06-01 13:22:42 +08:00
    写到文件里面传输吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3248 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 00:18 · PVG 08:18 · LAX 16:18 · JFK 19:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.