设计高性能的酒店客房预订系统

时间:2018-03-21 00:39:30

标签: database-design architecture nosql scalability database-performance

我正面临设计酒店网站预订系统的情况,该系统可能处理成千上万的酒店房间及其可用性。像Expedia网站那样的东西。

此可用性需要存储在本地,我需要查询这些酒店房间的可用性。

到目前为止,我已经达到了以下结构:

  • room_type的一个分区,它可以是其特征的组合,例如,如果它有视图,或者房间中的最大人数,例如:with view / 3 people将是一个类型,其他类型将是:视图/ 4人,无视图2人,有视图/ 4人等等。
  • 每个房间都会被分配到room_type,以便在前端进行演示。例如:我不会显示单独的房间记录(例如:201号房间),但我会证明我有这种类型的房间。
  • 所以我会有一个房间“桌子”和一个room_type“桌子”,每个房间都有一个类型。
  • 然后是今天的房间(行)和日期(列)矩阵,以及将来最多6个月。

矩阵如下所示: Availability matrix

其中1表示该日期有空房,0表示已预订。因此,我要检测一个room_type是否在日期范围内可用,我必须:

  1. 对于此类型的每个房间;
  2. 在所需日期之间扫描所有列;
  3. 如果有一个房间在该行中找不到0,则表示该房间可用,因此这意味着此room_type可以显示为该日期范围可用。
  4. 在上表中,假设日期范围是10月1日至2017年10月14日(美国格式),唯一可用的房间将是C酒店的101室。

    然后,我可以将客户预订到该房间,因此客户在他/她的住宿期间无需更换房间。

    我的问题是:

    • 是否有任何存储可以容纳像内存中那样的大矩阵? (MySQL,Redis,PostgreSQL,Cassandra,MongoDB等)
    • 如果我应该使用RDBMS,那是什么类型的?我应该使用传统的RDBMS吗?或者这种“类似矩阵的结构”更适合新的NoSQL数据库的另一种风格。
    • 这是一个“类似矩阵的结构”这些巨大的高访问网站如何构建他们的数据? (例如:Expedia,Booking.com,Trivago等)或者有更好的方法可以更快地查询日期范围吗?

    我担心现在没有选择正确的结构,并且在网站需求量很大且房间数量更多的情况下,以后会遇到性能问题。

    谢谢。

1 个答案:

答案 0 :(得分:1)

首先,感谢您提出的问题。这是我所知道的复杂问题之一,考虑到基本酒店可用性之外的各种用例。一些示例:您如何进行地理搜索,如何在同一天支持同一房间的多次签到,如何使数据与世界视图保持高度一致(最新价格和可用性) ,您如何根据价格对酒店进行排名,如何添加更多属性,如自定义福利(无烟,24小时入住,包括厨房等),如何处理不同的取消政策等。

你明白了,我相信。

我遇到的最佳设计使用了列或无模式存储(如cassandra,mongo)以及RDBMS。

NoSQL商店可以灵活地添加更多属性,还可以搜索城市,附近搜索等多个维度。

RDBMS可以存储很少变化的数据,如不同的房间类型,酒店描述等。

例如,对于上面的简单用例,我会在RDBMS中存储所有不同的房间类型,酒店到房间的映射。但酒店价格和可用性将转到NoSQL商店。我会将房价和可用性存储在NoSQL商店中,其搜索属性包括签入/签出日期,人数,房间数作为此表的关键字。我会定期运行一个cron作业来填充所有可用房间的所有不同搜索排列(通过在另一个预订表上交叉查找)并更新NoSQL商店。通过这种方式,读取路径更快(这与许多社交媒体网站设计其架构的写入方法非常类似。优化读取路径并在写入路径上传播更新,完全意识到读取数据可以是有点陈旧)。在我们的案例中,价格和可用性可能在cron作业运行之间的时间段内是陈旧的,但是这可以通过在预订时间之前使用一致的商店(例如预订表)进行另一次检查来轻松抵消。如果存在差异,您可以再次启动工作流程。

注意:以上是一个非常主观的意见,并基于价格和可用性不经常变化的假设。您可以使用像kafka这样的流媒体系统组合来加快更新速度