Airbnb/Booking 系统设计(high level architecture)

原文地址 CodeKarle: Airbnb System Design | Booking.com System Design

B站搜 “Airbnb System Design” 有视频版本

需求:

功能性需求

系统用户包括商家和客人。

Hotel - 商家(拥有hotel的人)

        onboarding - 商家可以入住系统。

        update - 商家可以修改hotel相关内容,如增加 room,修改 pricing,增加新的 images等。

        booking -  查看预定,收入等。

User - 客人(预定hotel的人)

        search -  搜索指定地点,符合搜索条件的 hotel (价格区间、星级等级、 海景房等)。

        book - 进行预定

        check booking  -  查看预定。

Analytics -  一些系统分析。

非功能性需求

Low latency

High Availability

High Consistency - (一旦用户预定了hotel,应立刻看到结果)

Scale (Google 搜索得知 )

        500k Hotels (全世界大概有 50万 家 hotel)

        10M Rooms (大概共有 1000万房间)

        1000 Rooms / Hotel (Max: 7500)   (所以假设每个hotel 大概有 1000个 room,有些有 7500个room, 估的高点,是为了更好的处理一些 edge cases)

 总体设计和数据流向

Hotel Service提供给商家入驻和修改等功能,上传的图片保存在 CDN服务器,数据库保存图片链接。MySQL采用一个Master,多个Slave集群。流量高峰时动态增加Slave缓解读取压力。Hotel Service亦可动态水平扩展。

商家新增一个 room,数据将会写入 kafka,然后 search consumer将会拉取这些数据,存储到search数据库。

Search这里使用的是 Elasticsearch,同类型的可以使用 Solr,这里使用 ES,主要是想支持模糊查询(fuzzy search)。假设用户搜索马尔代夫(Maldives)的hotel,用户可能输入错误的名字。这种情况最好也会有搜索结果。

ES 集群 之上是 Search Service,提供给用户 搜索功能。

若此时系统流量激增,我们可以进行水平扩展,增加Kafka集群的node数量、增加 search consumers数量、增加 ES 集群的node数量。

Booking Service 坐落于 一个MySQL集群之上,当预定发生时,预定数据保存在此MySQL集群中。同时调用 Payment Service,成功之后,预定状态为“已确认”。

此时,当预定发生时,应当通知Search Service这个房间已被预定,不应再次出现在搜索结果中。所以此预定数据流入Kafka集群,被Search Consumers读取,修改相关数据。

对于live data (也就是处于中间状态的预定记录)存放于MySQL数据库,一旦预定到达最终状态(如 已完成,或取消)则进入 Archival Service,然后到达 Cassandra 集群。

这里使用 Cassandra 是因为 Cassandra能够轻松处理大量读写操作。

Notification Service 从 Kafka 读取需要通知的事件,比如 预定成功通知商家,预定被取消要通知用户,通知用户费用清单等。

Booking Mgmt Service 负责商家查看预定,用户查看预定历史等。连接两个数据源,从MySQL获取所有 active bookings,从 Cassandra获取已经发生了的预定信息。

这里在MySQL前面加了个 Redis,用来缓存查询的用户拥有的Bookings的结果。这里缓存策略是 write-through,即当有新的booking进入时,先写Redis,然后同步更新MySQL。

对于系统数据分析部分,往往一开始并不能预知所有需要分析的需求。所以这里使用 Hadoop 集群,针对系统所有的事件(比如商家所有hotel的基本信息,商家所有的预定,所有的交易信息等)都写入 Kafka。所以需要Spark Streaming Consumer来从Kafka读取这些事件,放入到Hadoop集群,然后通过Hive queries或任何其他类型的queries来构建一些reporting。

Hotel Service

部分APIs

部分 DB deisgn,红色部分是 主键或外健。

hotel 表中的 original_images 指的是商户上传的图片链接, display_images是压缩过后的图片链接。

rooms 表中 price_min, price_max, 这里通过Hadoop集群,运行machine learning model做一些供需分析得出一个 optimal price。也就是说供应少,需求多,那么价格就上涨。所以这里的 price_min, price_max就是 hotel提供的价格区间, 价格根据需求再次范围浮动。

facilities 是 hotel和room所配备的设备。

hotel_facilities 和 room_facilities 是两张 mapping 表。多对多的关系。

此处我们并没有使用Redis进行缓存,因为 hotel service并不会有流量激增的情况,而是在 search service。

Booking Service

部分DB design, 红色为主键或外健。

available_rooms 中 room_id, date, initial_quantity 字段来自于 hotel_service。 available_quantity意思是特定room_id, 特定的date,剩余的房间数量。表上有约束(constraint)限制不能为负值。

booking 表中 status字段有四个值可选(reserved, booked, cancelled, completed)。

部分API设计:

一个预定API 以post的形式,包括5个参数,其中并不包括price参数,后面从数据库中获取。

这里不从 booking API中获取 price是因为 request 可能被篡改,而且从request获取price并不是一个很好的设计。

当一个 booking 请求到达时,先检查available_rooms表中的 available_quantity 是否有足够的room,进一步则进行锁定,进行支付。

这里插入booking表和 修改 available_room表中的 available_quantity是在同一个transaction中完成的。如果available_quantity 只有一个,且同时有多人争抢,则通过数据库的约束 available_quantity 不能为负值来保证只有一条记录能修改数量成功,也就是只有一条记录插入booking,也就是只有一个人会跳转到支付流程。

这里进行锁定5分钟,我们借助于 Redis的TTL(Time To Live)功能,key过期会有个callback。

当支付成功,标记status为 Booked,Payment Service返回的 invoice_id 保存到 booking表中。相对应的 events 写入kafka,以便其它消费者使用。

当支付失败,标记 status为 Cancelled, 恢复 available_quantity。

当Redis中key过期,收到通知 callback,同时 用户也被跳转至 payment 流程,且支付成功。这里分两种情况:

1,如果先收到payment success,那么 booking 状态被改成 Booked,此时再收到key 过期,修改booking status时需要判断是不是 reserved 状态,只有 reserved 才能被 cancel。

2,如果先收到 key 过期通知,那么booking 状态被改成了 cancelled,然后再收到 payment success 。要么 revert payment;要么判断是否 还有 available_quantity,修改 booking 状态成 booked。

这里还有个问题是 Redis这种key 过期的方式,并非能保证你能在精准的时间点收到 callback,多少都会有延迟,具体情况就要看对实时性的需求了。也可以每隔一秒去主动查询 Redis,不过CPU等的消耗也是一个问题。

其实无论payment 成功与否,在收到payment 结果时,就直接可以从redis中删除这个肯定会过期的key。

技术栈的替换

mysql -> 可以用其它任何支持ACID的数据库,如 Postgres。

Redis -> Memcache 等。

Cassandra->    这里打算继续使用 Cassandra,技术上可以用 HBase代替,但更费操作。

Kafka -> ActiveMQ, Rabbit MQ, Amazon queue等。但Kafka更易于扩展。

系统监控使用 Grafana

跨地域传播

数据中心的相互备份等。。。.... 看不下去了,接触到再说吧。

也太high level了 😂

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/945455.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

windows系统安装完Anaconda之后怎么激活自己的虚拟环境并打开jupyter

1.在win主菜单中找到Anaconda安装文件夹并打开终端 文件夹内有所有安装后的Anaconda的应用软件和终端窗口启动窗口 点击Anaconda Prompt(Anaconda)就会打开类似cmd的命令终端窗口,默认打开的路径是用户名下的路径 2.激活虚拟环境 使用命令…

C++进阶(三)--多态

目录 一、多态的基本概念 1.什么是多态 二、多态的定义及实现 1.虚函数 2.虚函数的重写 3.虚函数重写的⼀些其他问题 协变(了解) 析构函数的重写 C11 override和final 4.重载、覆盖(重写)、隐藏(重定义)的对比 三、抽象类 1.纯虚函数 2.接口继承和实现继承 四、多…

2025经典的软件测试面试题(答案+文档)

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 以下是软件测试相关的面试题及答案,希望对各位能有帮助! 1、测试分为哪几个阶段? 一般来说分为5个阶段:单元测试、集成测试…

海南省首套数据资产化系列团体标准正式发布

近日,首套数据资产化系列团体标准正式发布。本次系列涵盖《数据资产 数据治理规范》、《数据资产数据质量评价规范》、《数据资产 数据评估定价办法》和《数据资产 入表流程规范化标准》四项团体标准,通过海南省人工智能学会面向行业发布,自2…

突发!GitLab(国际版)将停止对中国区用户提供 GitLab.com 账号服务

消息称: 目前,为了更加严格的遵循中国网络数据安全管理的相关要求,GitLab SaaS(国际版)已逐步停止向国内用户提供服务与支持,国内用户亦无法注册或使用 GitLab SaaS(国际版)。自您的…

LLaVA模型讲解与总结

系列文章目录 第一章:LoRA微调系列笔记 第二章:Llama系列关键知识总结 第三章:LLaVA模型讲解与总结 文章目录 系列文章目录LLaVA(Large Language and Vision Assistant)Q: 这篇论文试图解决什么问题?Q: 论…

【linux内核分析-存储】EXT4源码分析之“创建文件”原理

EXT4源码分析之“文件创建”原理,详细的介绍文件创建的核心流程,并对EXT4中关于文件创建的关键函数进行了分析。 文章目录 0.前言1.创建文件概览1.1关键流程1.2 关键步骤说明 2.源码分析2.1 入口函数ext4_create2.2 分配inode关键函数 ext4_new_inode_st…

自学记录鸿蒙 API 13:骨骼点检测应用Core Vision Skeleton Detection

骨骼点检测技术是一项强大的AI能力,能够从图片中识别出人体的关键骨骼点位置,如头部、肩部、手肘等。这些信息在人体姿态分析、动作捕捉、健身指导等场景中有着广泛应用。我决定深入学习HarmonyOS Next最新版本API 13中的Skeleton Detection API&#xf…

使用ArcGIS Pro自带的Notebook计算多个遥感指数

在之前的分享中,我们介绍了如何使用ArcPy将GEE下载的遥感影像转为单波段文件。基于前面创建的单波段文件,我们可以一次性计算多种遥感指数,例如NDVI、EVI、NDSI等。我这里直接在ArcGIS Pro中自带的Notebook进行的运行。如下图所示&#xff0c…

XGPT用户帮助手册

文章目录 2024 更新日志2024.12.272024.12.29 摘要 本文详细介绍了XGPT软件的功能及发展历程。XGPT是一款融合了当前最先进人工智能技术的多模态智能软件,专为国内用户优化设计。除了强大的智能问答功能外,XGPT还结合日常办公和科学研究的需求&#xff0…

面试提问:Redis为什么快?

Redis为什么快? 引言 Redis是一个高性能的开源内存数据库,以其快速的读写速度和丰富的数据结构支持而闻名。本文将探讨Redis快速处理数据的原因,帮助大家更好地理解Redis的内部机制和性能优化技术。 目录 完全基于内存高效的内存数据结构…

强化学习——贝尔曼公式

文章目录 前言一、Return的重要性二、State Value三、贝尔曼公式总结 前言 一、Return的重要性 在不同策略下,最终得到的return都会有所不同。因此,return可以用来评估策略。 return的计算公式在基础概念中已经给出,通过包含 γ {\gamma} γ与…

使用MFC编写一个paddleclas预测软件

目录 写作目的 环境准备 下载编译环境 解压预编译库 准备训练文件 模型文件 图像文件 路径整理 准备预测代码 创建预测应用 新建mfc应用 拷贝文档 配置环境 界面布局 添加回cpp文件 修改函数 报错1解决 报错2未解决 修改infer代码 修改MFCPaddleClasDlg.cp…

CSS特效032:2025庆新春,孔明灯向上旋转飘移效果

CSS常用示例100专栏目录 本专栏记录的是经常使用的CSS示例与技巧,主要包含CSS布局,CSS特效,CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点,CSS特效主要是一些动画示例,CSS花边是描述了一些CSS…

3D云展厅对文物保护有什么意义?

在文化遗产保护领域,3D云展厅技术的应用正成为一股新兴力量,它不仅改变了文物展示的方式,也为文物保护工作带来了深远的影响。 下面,由【圆桌3D云展厅平台】为大家介绍一下3D云展厅对文物保护意义的详细探讨。 1. 减少物理接触&a…

spring入门程序

安装eclipse https://blog.csdn.net/qq_36437991/article/details/131644570 新建maven项目 安装依赖包 pom.xml <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&quo…

vue 修改vant样式NoticeBar中的图标,不用插槽可以直接用图片

使用文档中是可以直接使用图片链接的 :left-icon"require(../../assets/newImages/noticeImg.png)" <html> .... <NoticeBarmode""color"#C6C6C6"background""v-if"global_info.site_bulletin":left-icon"r…

MySQL数据导出导出的三种办法(1316)

数据导入导出 基本概述 目前常用的有3中数据导入与导出方法&#xff1a; 使用mysqldump工具&#xff1a; 优点&#xff1a; 简单易用&#xff0c;只需一条命令即可完成数据导出。可以导出表结构和数据&#xff0c;方便完整备份。支持过滤条件&#xff0c;可以选择导出部分数据…

【亲测有效】k8s分布式集群安装部署

1.实验环境准备 准备三台centos7虚拟机&#xff0c;用来部署k8s集群&#xff1a; master&#xff08;hadoop1&#xff0c;192.168.229.111&#xff09;配置&#xff1a; 操作系统&#xff1a;centos7.3以及更高版本都可以配置&#xff1a;4核cpu&#xff0c;4G内存&#xff…

点进CSS选择器

CSS 1.直接在标签的style属性进行设置(行内式) //写在数据单元格td标签内的stytle&#xff0c;设置color颜色和font-size字体大小&#xff1b; <td rowspan"3" style"color: red;font-size: 12px;">Web技术与应用</td> 2.写在head标签中的…