Вопрос для собеседования по проектированию системы

Приложение для бронирования отелей — Дизайн

Дизайн для Airbnb, Agoda, Booking.com

Приложения для бронирования отелей позволяют клиентам бронировать отель онлайн. Люди могут получить хорошие скидки из-за высокой конкуренции на рынке. Некоторые приложения предоставляют возможность бесплатного бронирования отеля и оплаты при выезде, в то время как некоторые взимают плату за отмену в зависимости от времени отмены.

Некоторые из доступных продуктов для бронирования отелей — Airbnb, Agoda, MakeMyTrip.

Давайте посмотрим требования к базовому приложению и сервисам, которые можно создать (с учетом архитектуры микросервиса) для этого приложения.

Требования

Система бронирования отелей требует взаимодействия отелей и клиентов с администратором.

  1. Отель может зарегистрироваться самостоятельно.
  2. Пользователь может создавать, обновлять, удалять, получать свои профили.
  3. Пользователь может искать отель, используя название отеля, название города.
  4. Отель может добавлять информацию о номере и информацию об инвентаре номеров.
  5. Отель может обновлять различные тарифы на типы номеров на разные даты.
  6. Пользователь может увидеть типы номеров, доступных для искомого отеля.
  7. Пользователь может забронировать отель. Пользователь может получить все сделанные им бронирования.
  8. Пользователь может получить подробный счет, содержащий налоговые данные.
  9. Пользователь может произвести оплату, используя различные способы оплаты — кредитную карту, кошелек и т. д.

Дизайн высокого уровня

Подробности о сервисах, API и модели данных описаны ниже. CDN (сеть доставки контента) используется для хранения статических изображений (например, изображений отелей, изображений номеров и т. д.). База данных может быть RDBS, если количество запросов не так велико и может легко обрабатываться SQL. Redis кэш можно использовать для повторного поиска отелей и номеров. Kafka используется для отправки уведомлений клиентам.

Услуги — Дизайн API

Гостиничный сервис

Все функции, связанные с отелем, будут выполняться службой Отель Сервис. Он будет взаимодействовать только с Hotel Данными. Он отобразит первую страницу приложения, то есть список всех отелей или отелей, которые были найдены. Это также позволит отелям зарегистрироваться.

Отели могут зарегистрироваться самостоятельно — addHotel

Клиенты могут увидеть список всех отелей — getAllHotels

Администратор может искать отель по идентификатору — getHotelById

Клиенты могут искать отели по названию — getHotelsByName.

Клиенты могут искать отели по городу — getHotelsByCity

Администратор может обновить информацию об отеле — updateHotel

Администратор может удалить отель по идентификатору — deleteHotel

Обслуживание пользователей

Функции, связанные с профилями пользователей, будут предоставляться Службой пользователей. Он будет взаимодействовать только с Пользовательскими данными. Это позволит Клиентам регистрироваться и обновлять свои профили.

Пользователи могут зарегистрироваться самостоятельно — addUser

Пользователи могут удалять свои профили — deleteUser

Пользователи могут обновлять свои профили — updateUser

Пользователи могут получить информацию о своих профилях — getUser

Обслуживание номеров

После выбора отеля пользователю будет показан список типов номеров. Перечень номеров содержит подробную информацию о количестве номеров, доступных для каждого типа номеров (одноместный номер, двухместный номер, вилла и т. д.).

Отель может добавить номер — addRoom

Отель может добавить инвентарь номеров — addRoomInventory

Администратор может получить комнату, используя идентификатор комнаты — getRoom

Клиент может увидеть тип номера для данного отеля и дату — getAllRoomInventory

Отель может обновить номер — updateRoom

Отель может удалить номер — deleteRoom

Тарифное обслуживание

Для каждого типа номера клиент может увидеть стоимость, связанную с этим номером. Стоимость номера может меняться в зависимости от даты. Данные о тарифах содержат несколько прейскурантов на каждую дату. Отель может обновить эти тарифы. Также можно добавить поддержку добавления прейскуранта для диапазона дат. Эту проблему можно решить, используя алгоритм слияния интервалов.

Отель может добавить прейскурант — addRateCard.

Клиент может получить прейскурант для любого типа номера — getRateCard

Отель может обновить прейскурант — updateRateCard

Отель может удалить прейскурант — deleteRateCard

Ценовая служба

На странице оформления заказа Служба ценообразования позволит клиентам видеть детали счета. Он вызовет Службу бронирования, чтобы получить список номеров, выбранных для выставления счета. Мы также можем добавить поддержку применения купонов, которая может быть реализована с помощью Шаблона стратегии и иметь различные типы стратегий — TwentyPercentOff, FiveHundredOff и т. д.

Клиент может просмотреть детали счета — getBill

Служба бронирования

Клиент может зарезервировать комплект номеров в каком-либо отеле. Служба бронирования проверяет наличие свободных номеров, выбранных клиентом. Клиент также может проверить историю всех бронирований. Они также могут отменить бронирование.

Клиент может добавить резервирование — addReservation

Клиент может получить бронирование — getReservation

Отель может проверить все бронирования, забронированные для его отеля — getAllReservationsByHotelId

Клиент может просматривать историю своих бронирований — getAllReservationsByUserId.

Клиент может отменить бронирование — CancelReservation.

Платежный сервис

Платежи в отелях можно производить с помощью Платежного сервиса. Он будет взаимодействовать с Платежными данными, а также вызывать Службу ценообразования для подтверждения произведенного платежа и Службу бронирования для обновления статуса бронирования. . Это позволит Клиентам добавить Платеж против своего бронирования.

Клиенты могут оплатить бронирование — addPayment

Администратор может искать платеж по идентификатору — getPaymentById

Клиенты могут видеть произведенный платеж — getPaymentByReservationId

Платеж должен соответствовать счету — validatePayment

Модель данных — Классы модели

Гостиница

  • Идентификатор отеля — уникальный для каждого отеля
  • имя
  • Адрес

Мы также можем добавлять отзывы и оценки.

Адрес

  • Идентификатор адреса — уникальный для каждого
  • Адрес
  • Город
  • Почтовый индекс
  • Местоположение — может содержать ссылку на карты Google или значения долготы и широты.

Пользователь

  • Идентификатор пользователя — уникальный для каждого
  • Имя пользователя
  • Номер телефона
  • Адрес

Мы также можем добавить имя, фамилию, пол, биографию и некоторые другие сведения, связанные с пользователем.

Комната

  • Идентификатор отеля
  • Описание
  • Тип комнаты
  • Номер этажа
  • Номер комнаты
  • Наличие номеров

В отеле может быть несколько типов номеров. Комнат каждого типа может быть несколько.

Инвентарь комнаты

  • Идентификатор инвентаря комнаты
  • Идентификатор отеля
  • Тип комнаты
  • Дата
  • Общее количество номеров данного типа.
  • Общее количество забронированных номеров на данную дату и тип номера.

Прейскурант

  • Идентификатор отеля
  • Тип комнаты
  • Дата
  • Цена

Тарифная карта уникальна и содержит комбинированный первичный ключ, состоящий из идентификатора отеля, типа номера и даты.

Модель резервирования

  • Идентификатор бронирования
  • Идентификатор отеля
  • ID пользователя
  • Список типов забронированных номеров
  • Статус бронирования
  • Дата начала
  • Дата окончания

Счет

  • Идентификатор счета — уникальный для каждого счета
  • Общий налог
  • Необходимая к оплате сумма

Мы также можем добавить налоговое раздвоение — CGST, SGST для Индии. Скидку также можно добавить вместе с ее раздвоением — скидка по карте, скидка по купону.

Оплата

  • Идентификатор платежа
  • Идентификатор бронирования
  • Сумма, уплаченная пользователем
  • Статус платежа

Подведение итогов

Идеального дизайна не существует. Все дизайны хороши. Речь всегда идет о компромиссе между сделанными выборами. Я выложил полный рабочий код на GitHub. Не стесняйтесь обращаться в случае каких-либо обсуждений, и я буду рад объединить новые PR — добавить новые функции или улучшить существующие.

Особая благодарность Алексу Сюй. Глава его книги Система управления отелемИнтервью по проектированию системы — руководство для инсайдеров_том 2 послужила вдохновением для создания этого дизайна.

Надеюсь, вам всем понравилось это читать. Спасибо, что читаете, ребята.!!!