📜  Design BookMyShow – 系统设计面试题(1)

📅  最后修改于: 2023-12-03 15:00:24.036000             🧑  作者: Mango

Design BookMyShow – 系统设计面试题

简介

BookMyShow是印度最大的在线电影票预订网站之一。该网站为电影爱好者提供了一种方便、快捷的方式来购买电影票。

该网站的用户可以轻松地搜索电影、选择座位、查看价格和时间表、购买电影票、取消订单等等。用户还可以使用一个安全的支付通道来完成交易。

业务需求

该网站应该能够满足以下业务需求:

  • 用户应该能够在网站上查看电影列表。
  • 用户应该能够选择一个电影并查看其详情,包括演员、剧情梗概、时长、类型等。
  • 用户应该能够查看电影的放映时间表,并选择其中一个时间段进行购买。
  • 用户应该能够选择座位进行购买。
  • 用户应该能够进行订单的取消。

此外,网站管理员还应该有以下功能:

  • 管理员应该能够添加新的电影到电影列表中。
  • 管理员应该能够编辑电影列表、放映时间表、座位图等。
  • 管理员应该能够查看已完成的订单、未完成的订单、取消的订单等。
系统设计
架构图

BookMyShow的架构图

组件设计

1. 用户管理组件

用户管理组件是该系统的核心组件之一。主要职责是为用户提供其所需的信息,使得用户能够在该系统中完成订单的购买和取消。

组件接口
/**
 * 用于显示电影列表的接口
 */
interface MovieListDisplay {
  ngOnInit(): void;
  ngOnDestroy(): void;
  onMovieSelected(movie: Movie): void;
  refreshMovies(): void;
}

/**
 * 用于显示电影详情的接口
 */
interface MovieDetailDisplay {
  ngOnInit(): void;
  ngOnDestroy(): void;
  setMovie(movie: Movie): void;
  getSelectedShowtime(): Showtime;
  setSelectedShowtime(showtime: Showtime): void;
  buyTicket(): void;
}

/**
 * 用于显示座位图的接口
 */
interface SeatMapDisplay {
  ngOnInit(): void;
  ngOnDestroy(): void;
  getSeatMap(): SeatMap;
  setSeatMap(seatMap: SeatMap): void;
  getSelectedSeats(): Array<Seat>;
  setSelectedSeats(seats: Array<Seat>): void;
  checkout(): void;
}
类图

用户管理组件类图

2. 管理员管理组件

管理员管理组件主要是为管理员提供管理该系统所需的信息,例如:电影列表、放映时间表、订单详情等。

组件接口
/**
 * 用于管理电影列表的接口
 */
interface MovieListManagement {
  ngOnInit(): void;
  ngOnDestroy(): void;
  onMovieSelected(movie: Movie): void;
  createNewMovie(): void;
  deleteMovie(movie: Movie): void;
  editMovie(movie: Movie): void;
}

/**
 * 用于管理放映时间表的接口
 */
interface ShowtimeManagement {
  ngOnInit(): void;
  ngOnDestroy(): void;
  getShowtimes(): Array<Showtime>;
  createNewShowtime(): void;
  deleteShowtime(showtime: Showtime): void;
  editShowtime(showtime: Showtime): void;
}

/**
 * 用于管理座位图的接口
 */
interface SeatMapManagement {
  ngOnInit(): void;
  ngOnDestroy(): void;
  getSeatMaps(): Array<SeatMap>;
  createNewSeatMap(): void;
  deleteSeatMap(seatMap: SeatMap): void;
  editSeatMap(seatMap: SeatMap): void;
}
类图

管理员管理组件类图

3. 订单管理组件

订单管理组件主要是为管理员提供 查看订单、修改订单、取消订单等功能。

组件接口
/**
 * 用于管理订单的接口
 */
interface OrderManagement {
  ngOnInit(): void;
  ngOnDestroy(): void;
  getOrders(): Array<Order>;
  updateOrder(order: Order): void;
  deleteOrder(order: Order): void;
}
类图

订单管理组件类图

4. 支付组件

支付组件主要是为用户和管理员提供基于网上付款的付款通道,以便将订单的状态设置为 “已支付”,从而为用户提供有效的确认。

组件接口
/**
 * 用于用户付款的接口
 */
interface UserPayment {
  ngOnInit(): void;
  checkout(): void;
}

/**
 * 用于管理员退款的接口
 */
interface RefundManagement {
  ngOnInit(): void;
  ngOnDestroy(): void;
  getRefunds(): Array<Refund>;
  updateRefund(refund: Refund): void;
  deleteRefund(refund: Refund): void;
}
类图

支付组件类图

数据库设计

该系统使用关系型数据库来存储信息。以下是用于存储信息的表。

用户数据表

User
---
id: int (PK)
username: string
password: string
email: string
phone: string

电影数据表

Movie
----
id: int (PK)
title: string
poster: string
actors: string
description: string
duration: int
genre: string

放映时间表

Showtime
-------
id: int (PK)
start_time: date
end_time: date
movie_id: int (FK)
seat_map_id: int (FK)

座位图数据表

SeatMap
-------
id: int (PK)
name: string
rows: int
cols: int
layout: string

订单数据表

Order
-----
id: int (PK)
showtime_id: int (FK)
user_id: int (FK)
seat_ids: string
status: string

退款数据表

Refund
------
id: int (PK)
order_id: int (FK)
reason: string
status: string
服务器架构

该系统的服务器端使用基于云的虚拟服务器。该服务器允许多个客户端连接,并使用标准的Web服务协议作为通信接口。此外,该服务器使用AWS S3 来存储媒体文件。

编码实践

本系统应采用微服务的架构,每个服务有各自独立的功能。这些服务可以使用Docker来打包成容器,并在Kubernetes集群中进行控制和部署。

此外,该系统应该使用单元测试和性能测试来测试和评估系统的可靠性、安全性和性能。此外,要观察端到端的日志,以便快速诊断和定位故障。需要将日志推送到中央日志收集器中,以便分析和监控。

性能

该系统应该能够支持每天数百万个订单的处理,并且在每个订单中支持上百个座位数。此外,该系统应该能够支持多个同时进行支付的请求,并在几秒钟内完成所有支付操作。

为了实现这种性能和可扩展性,我们可以使用分布式系统架构,同时采用数据库分片来存储数据并减少查询时间。还要针对支付通道进行优化。支付操作应该是异步和可扩展的,以便快速响应大量的支付请求。