系统设计面试:Yelp、TripAdvisor 或附近的 Places
系统设计面试:Yelp、TripAdvisor 或附近的 Places
在本文中,我们将讨论关于 近距离服务。 邻近服务用于发现附近的地方,例如酒店、博物馆或餐馆。它是支持在 Yelp 上查找附近最好的餐馆或在 Google 地图上查找 k 附近加油站等功能的核心组件。
第 1 步:- 需求收集
功能要求:-
- 根据用户的位置返回所有业务。业务用户可以添加、删除或更新业务,但信息不需要实时反映。
- 客户可以查看有关业务的详细信息。
- 用户可以从 UI 更改半径。
非功能性要求:-
- 低延迟:- 用户应该能够快速获取业务。
- 高可用性: - 系统应该能够在高峰时段处理流量
- 高可扩展性:- 系统可以跨多个区域和可用区进行扩展。
粗略估计:-
假设我们有 1000 万日活跃用户和 2000 万家企业。我们可以将一天中的秒数四舍五入到 10⁵。假设用户每天进行 5 次搜索查询。
搜索 QPS = (1000 万 * 5)/10⁵ = 500 QPS。
第 2 步:- 高级设计:-
API设计:-
- 搜索附近的商家:- 此端点根据搜索条件返回企业。
**请求参数:-
一个。纬度
湾。经度
C。半径** **结果:-
{“总数”:10,
“企业:[{企业对象}]}**
2.业务API:- 与业务对象相关的 API CRUD 操作。
**API 详细信息
----- ---------** **GET:- /businesses/:id 返回有关业务的详细信息
POST:- /businesses 添加新业务
PUT:- /businesses/:id 更新有关业务的详细信息
删除:- /businesses/:id 删除企业**
数据模型:-
读/写比率:- 由于以下两个原因,读取量很高。
- 搜索附近的商家
- 有关个别业务的详细信息。
另一方面,与读取比率相比,写入比率非常低,因为更新业务信息、删除业务和添加新业务的频率很低。
对于现成的重型系统,关系数据库系统(如 MySQL)可能是一个很好的选择,并且它在行业中是久经考验的技术。
高级设计图:-
该系统分为两个主要部分:-
- 基于位置的服务。
- 业务相关服务。
High Level Diagram
API网关:- API 网关充当我们系统中的入口点,并将请求路由到相应的组件/微服务。
基于位置的服务:- LBS 是系统的核心部分,用于查找给定半径和位置的附近企业。无写请求的重读服务,密集区域高峰时段QPS高。此外,该服务是无状态的,因此很容易水平扩展。
商业服务:- 业务服务主要处理两种类型的请求。
- 客户希望查看有关业务的详细信息。 QPS 在高峰时段很高。
- 创建、更新和删除业务。那些请求主要是写操作,QPS不高。
数据库集群:- 可以在主从设置中设置数据库集群。主数据库处理所有写操作。数据保存在主数据库中,然后使用数据库复制技术,创建数据库的复制。由于复制延迟,主数据库和复制数据库之间可能存在差异,但这种不一致不是问题,因为我们不必实时反映更改。
可扩展性:-
LBS 和业务服务都是无状态服务,因此很容易在高峰时段自动添加更多服务器,在非高峰时段自动移除服务器。如果系统在云上运行,我们可以设置不同的区域和可用区,以进一步提高可用性。
在下一篇文章中,我们将讨论使用各种算法、缓存、缩放数据库和最终设计图来搜索附近地点的不同方法。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明