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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

如果硬要用缓存方案,几百 G 算啥呀,内存型服务器,内存都是说多少 T 。哪怕是用普通通用型服务器,redis 也是集群呀,数据量大你又不是单机
esee
2023-03-10 11:06:00 +08:00
50 万的量还要怎么设计啊,我 1C2G 的 mysql 存了几千万的数据量查询性能都没下降。50 万的量不是闭着眼睛写都行么。。
learningman
2023-03-10 12:48:41 +08:00
有个 Azure 的运维拿 CPU 核心图玩俄罗斯方块的视频,那个视频里演示用的机器有 2T 内存

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/922755

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX