Вопрос для собеседования по проектированию системы
Приложение для бронирования отелей — Дизайн
Дизайн для Airbnb, Agoda, Booking.com
Приложения для бронирования отелей позволяют клиентам бронировать отель онлайн. Люди могут получить хорошие скидки из-за высокой конкуренции на рынке. Некоторые приложения предоставляют возможность бесплатного бронирования отеля и оплаты при выезде, в то время как некоторые взимают плату за отмену в зависимости от времени отмены.
Некоторые из доступных продуктов для бронирования отелей — Airbnb, Agoda, MakeMyTrip.
Давайте посмотрим требования к базовому приложению и сервисам, которые можно создать (с учетом архитектуры микросервиса) для этого приложения.
Требования
Система бронирования отелей требует взаимодействия отелей и клиентов с администратором.
- Отель может зарегистрироваться самостоятельно.
- Пользователь может создавать, обновлять, удалять, получать свои профили.
- Пользователь может искать отель, используя название отеля, название города.
- Отель может добавлять информацию о номере и информацию об инвентаре номеров.
- Отель может обновлять различные тарифы на типы номеров на разные даты.
- Пользователь может увидеть типы номеров, доступных для искомого отеля.
- Пользователь может забронировать отель. Пользователь может получить все сделанные им бронирования.
- Пользователь может получить подробный счет, содержащий налоговые данные.
- Пользователь может произвести оплату, используя различные способы оплаты — кредитную карту, кошелек и т. д.
Дизайн высокого уровня
Подробности о сервисах, 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 послужила вдохновением для создания этого дизайна.
Надеюсь, вам всем понравилось это читать. Спасибо, что читаете, ребята.!!!