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

面试题: 有一个系统,提供某项数据的维护(增、删、改、查),同时为第三方提供该数据大并发、高效的的查询服务,并且主要是提供查询服务

  •  
  •   JimmyChan1506 · 2023-03-10 07:27:22 +08:00 · 2947 次点击
    这是一个创建于 633 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有一个系统,提供某项数据的维护(增、删、改、查),同时为第三方提供该数据大并发、高效的的查询服务,并且主要是提供查询服务
    1)该项数据存在着唯一的业务 ID ,全部大概 50w 条记录,每条记录的大小不超过 1KB
    2)为第三方提供查询服务时,存在按照唯的业务 ID 批量查询的场景(尽量保证每次(包括第一次)查询的速度基本一致)
    请设计出合理的方案,可以使用流程图、逻辑图、时序图、文字等来描述设计方案。

    各位大佬有什么看法不?
    第 1 条附言  ·  2023-03-10 09:35:54 +08:00
    不好意思. 从网上看到的题. 不过我算错数了, 算了要几百 G 才能全部缓存 ........

    那么问题来了, 如果需要几百 G 才能全部缓存的场景呢? 也就是无法做到全部放内存里的情况下..
    27 条回复    2023-03-10 16:57:32 +08:00
    mingl0280
        1
    mingl0280  
       2023-03-10 08:10:28 +08:00 via Android
    我个人认为这个需求的难度在系统提供者能提供多少上行带宽这个问题上……50 万 1k 的记录满打满算一个 G 都没有……
    moult
        2
    moult  
       2023-03-10 08:26:29 +08:00 via iPhone
    这数据量,又是用唯一 id 查询的,持久化直接 mysql ,查询层加个内存级的缓存都足够了。都不需要啥高档家伙。
    moult
        3
    moult  
       2023-03-10 08:27:56 +08:00 via iPhone
    不对。你面的是项目管理之类的岗位,不是开发吧。他主要考察写方案报告吧。
    mingl0280
        4
    mingl0280  
       2023-03-10 08:35:46 +08:00 via Android
    @moult 他这个描述很奇怪,要什么逻辑图流程图……项目管理也不写这些吧?
    ragnaroks
        5
    ragnaroks  
       2023-03-10 08:44:11 +08:00
    只说这个需求的话,大学生都能做吧,准确的说 1t4g 的单容器实例 mysqld 都无压力,调下参数就行了,不用做任何额外优化
    seashell2000
        6
    seashell2000  
       2023-03-10 09:07:15 +08:00
    估计这公司的业务有这个需求了
    chendy
        7
    chendy  
       2023-03-10 09:21:33 +08:00
    除非机器内存非常紧张,500m 数据直接放应用里就行
    再来个队列或者定时任务更新数据就完活了
    liprais
        8
    liprais  
       2023-03-10 09:25:31 +08:00 via iPhone
    读写分离完事
    securityCoding
        9
    securityCoding  
       2023-03-10 09:31:15 +08:00 via Android
    这么个玩意还能怎么设计,做个 local cache 打崩了算我输
    JimmyChan1506
        10
    JimmyChan1506  
    OP
       2023-03-10 09:34:49 +08:00
    @seashell2000 从网上看到的题. 不过我算错数了, 算了要几百 G 才能全部缓存 ........
    dayeye2006199
        11
    dayeye2006199  
       2023-03-10 09:38:01 +08:00 via Android
    缓存,什么缓存,感觉一个数据库够了
    AlexHsu
        12
    AlexHsu  
       2023-03-10 09:47:39 +08:00
    我觉得 chatgpt 说挺好
    为了满足系统对数据的维护和第三方对数据的高效查询服务,可以采用以下方案:

    数据库设计
    为了实现高效的查询,可以将数据存储在关系型数据库中,使用索引来加速查询速度。每个记录的大小不超过 1KB ,因此可以选择使用 MySQL 或 PostgreSQL 等数据库来存储数据。

    在数据库中,可以将业务 ID 设为主键,以便快速根据业务 ID 进行查询。同时,还可以添加一些辅助索引,以支持更复杂的查询操作。

    数据库缓存
    为了提高查询速度,可以使用缓存技术。可以使用 Redis 或 Memcached 等缓存服务器来缓存最常用的查询结果。

    可以将每个查询结果缓存在缓存服务器中,并设置过期时间,以便缓存服务器自动删除过期的数据。当有查询请求时,先从缓存服务器中查找数据,如果缓存中没有数据,再从数据库中查询并将结果存储到缓存中。

    查询服务设计
    为了满足第三方对数据的高效查询,可以设计一个查询服务。查询服务的主要作用是处理第三方的查询请求,并返回查询结果。

    可以使用负载均衡技术,将查询请求分配到多个查询服务器上,以实现高并发查询。每个查询服务器都可以连接到同一个数据库,并从缓存服务器中获取数据。

    为了提高查询速度,可以使用异步查询技术。当查询请求进入查询服务时,查询服务可以将请求放入一个消息队列中,并返回一个查询 ID 。查询服务再从消息队列中读取查询请求,异步地查询数据库,并将查询结果存储到缓存服务器中。当查询结果准备好后,查询服务将结果推送给第三方。

    批量查询
    对于批量查询场景,可以采用以下方案:

    首先,将查询请求按照业务 ID 进行分组,每组查询的业务 ID 数量不超过缓存服务器的最大连接数。然后,将每组查询请求发送到不同的查询服务器上,由每个查询服务器异步地查询数据库和缓存服务器,并将查询结果返回给查询服务。

    查询服务将每组查询结果进行合并,并将合并后的结果返回给第三方。由于每组查询请求的业务 ID 数量是相同的,因此可以保证每次查询的速度基本一致。
    brader
        13
    brader  
       2023-03-10 09:48:41 +08:00
    区区 50W ,直接用 mysql ,如果担心有频繁的删改影响查询的话,最多做个读写分离
    JimmyChan1506
        14
    JimmyChan1506  
    OP
       2023-03-10 09:56:14 +08:00
    @AlexHsu chatgpt 威武
    Desdemor
        15
    Desdemor  
       2023-03-10 09:58:20 +08:00
    用 clickhouse + kafka 咋样, 一个读一个批量写
    dongtingyue
        16
    dongtingyue  
       2023-03-10 09:59:29 +08:00
    mysql 百万数据量走索引, 排行榜数据秒出。
    pengtdyd
        17
    pengtdyd  
       2023-03-10 10:05:45 +08:00
    我觉的这个问题问的应该是如何解决在增、删、改的情况下,解决复杂查询速度很慢的问题。复杂查询多表 join 的这种情况查询速度很慢,导致查询服务基本处于难以使用的状态。

    这种 i 情况基本上难以解决了,一般老旧的系统,架构师水平很差,多批人经手的系统,最容易出现这种情况,基本无解,除非重构它,前期业务逻辑没有理清,数据库表随便加,字段随便改,最后查一个简单的用户信息都要 join N 多张表,这种情况还提供什么高效的查询服务,算了毁灭吧。
    sadfQED2
        18
    sadfQED2  
       2023-03-10 11:04:37 +08:00 via Android
    @Desdemor ck 并发读性能很差啊

    @JimmyChan1506 MySQL 读写分离,读库前面再套 HA ,读 QPS 几万肯定没啥问题

    如果硬要用缓存方案,几百 G 算啥呀,内存型服务器,内存都是说多少 T 。哪怕是用普通通用型服务器,redis 也是集群呀,数据量大你又不是单机
    esee
        19
    esee  
       2023-03-10 11:06:00 +08:00
    50 万的量还要怎么设计啊,我 1C2G 的 mysql 存了几千万的数据量查询性能都没下降。50 万的量不是闭着眼睛写都行么。。
    learningman
        20
    learningman  
       2023-03-10 12:48:41 +08:00
    有个 Azure 的运维拿 CPU 核心图玩俄罗斯方块的视频,那个视频里演示用的机器有 2T 内存
    thtznet
        21
    thtznet  
       2023-03-10 13:04:15 +08:00
    没有预算前提的设计方案都是扯淡,实际上所有的技术方案最终出台都和技术没关系,钱才是核心问题
    aqqwiyth
        22
    aqqwiyth  
       2023-03-10 14:03:47 +08:00
    500M 数据还考虑啥, 直接加载到内存
    PythonYXY
        23
    PythonYXY  
       2023-03-10 14:20:30 +08:00
    提供信息太少了,说下查询和写入 QPS 、查询方式主要是什么(点查,范围查)、成本等信息。还有 OP 说几百 G 的数据具体是什么,大约有多少?
    sunmacarenas
        24
    sunmacarenas  
       2023-03-10 14:40:26 +08:00 via Android
    上个 1T 的 SAP HANA 就可以了
    crazycarry
        25
    crazycarry  
       2023-03-10 16:27:09 +08:00
    50w 洒洒水都没有
    morty0
        26
    morty0  
       2023-03-10 16:43:36 +08:00
    提供给第三方用, 要考虑一下鉴权, 加密, 限流等
    cassyfar
        27
    cassyfar  
       2023-03-10 16:57:32 +08:00
    redis master-slave
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2770 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 15:19 · PVG 23:19 · LAX 07:19 · JFK 10:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.