Обновлено: 10 апреля 2026 г. в 20:30

Airbnb

средний

Классический кейс Airbnb: геопоиск, календарь доступности, контур бронирования, динамическое ценообразование и доверие в двустороннем маркетплейсе.

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

Глава собирает в одну архитектуру жизненный цикл объявления, поиск по карте, сообщения, подтверждение брони, правила оплаты и механизмы защиты от злоупотреблений.

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

Геопоиск

Путь поиска по карте должен быстро находить кандидатов, но не тянуть за собой тяжёлую проверку календаря и платежей на каждом запросе.

Календарь доступности

Календарь можно проецировать и кэшировать для поиска, но подтверждение брони обязано проходить через более строгий контур корректности.

Контур бронирования

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

Доверие и антифрод

Маркетплейс не удерживает пользователей только красивой выдачей: доверие, проверки и борьба с мошенничеством здесь такой же core path, как и бронирование.

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

Источник

Acing the System Design Interview

В книге Zhiyong Tan есть отдельный разбор Airbnb как системного дизайн-кейса.

Читать обзор

Масштаб продукта

7M+ объявлений
220+ стран и регионов
150M+ гостей
2B+ забронированных ночей

1Функциональные требования

Путь гостя

  • Поиск по локации, датам, числу гостей и правилам размещения
  • Фильтрация по цене, типу жилья, удобствам и политике отмены
  • Просмотр карточки объявления с фото, описанием и отзывами
  • Бронирование, оплата и получение подтверждения
  • Обмен сообщениями с хозяином до и после поездки

Путь хозяина

  • Создание и обновление объявления, фото и правил проживания
  • Управление календарём доступности и ограничениями по датам
  • Настройка цен, скидок и правил мгновенного бронирования
  • Подтверждение запросов на бронь и общение с гостем
  • Получение выплат и работа с отзывами после поездки

2Нефункциональные требования

Быстрый поиск

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

Высокая доступность

Бронирование и поддержка поездки не должны падать в сезонных пиках и во время локальных сбоев.

Корректность бронирования

Один и тот же интервал нельзя подтвердить двум гостям одновременно, даже если поиск и кэш успели устареть.

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

Масштаб системы

Объявлений:7M
Поисков в день:100M
Броней в день:1M
Фотографий:500M+

3Геопоиск

Связанная тема

Proximity Service

Разбор Alex Xu помогает отдельно понять nearby search, пространственные индексы и геофильтрацию.

Читать обзор

Геопоиск в Airbnb не заканчивается на поиске по координатам. После первичного выбора кандидатов система отдельно проверяет календарь и только затем применяет , чтобы учесть релевантность, персональные предпочтения и коммерческие сигналы.

Подходы к геоиндексированию

ПодходОписаниеКогда полезен
GeohashСтроковое кодирование координат, удобное для prefix-match запросовПростые lookup-сценарии и Redis
Quadtree ✓Рекурсивно делит карту на квадранты и хорошо ложится на in-memory поискБыстрый отбор кандидатов для выдачи
S2 GeometryИерархические ячейки сферы, удобные для глобальных карт и сложной геометрииГлобальные продукты уровня Google Maps
PostGISРасширение PostgreSQL с пространственными индексами и SQL-операторамиНебольшой масштаб и сильная связка с БД

Как выглядит поисковый контур Airbnb

  1. 1Elasticsearch хранит поисковый индекс объявлений с координатами, фильтрами и текстовыми полями.
  2. 2geo_bounding_box ограничивает поиск текущей видимой областью карты.
  3. 3Отдельный сервис календаря убирает варианты, которые недоступны на выбранный диапазон дат.
  4. 4Поверх оставшихся кандидатов запускается персонализированная сортировка результатов.

Пример запроса в Elasticsearch

{
  "query": {
    "bool": {
      "filter": [
        {
          "geo_bounding_box": {
            "location": {
              "top_left": { "lat": 40.73, "lon": -74.1 },
              "bottom_right": { "lat": 40.01, "lon": -73.12 }
            }
          }
        },
        { "term": { "property_type": "entire_home" } },
        { "range": { "price": { "gte": 50, "lte": 200 } } },
        { "range": { "guests": { "gte": 2 } } }
      ]
    }
  }
}

4Календарь доступности

Связанный кейс

Hotel Booking

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

Читать обзор

⚠️ Главная сложность

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

Схема данных

-- Календарь по дням
CREATE TABLE availability (
  listing_id   UUID,
  date         DATE,
  status       ENUM('available',
               'blocked', 'booked'),
  price        DECIMAL,
  min_nights   INT,
  PRIMARY KEY (listing_id, date)
);

-- Индекс для поиска
CREATE INDEX idx_available
ON availability(date, status)
WHERE status = 'available';

Оптимизации

  • Интервалы дат: хранить диапазоны, если календарь меняется пакетами
  • Bitmap: упаковать занятые дни в битовые маски для быстрых проверок
  • Кэширование: держать горячие календари в Redis рядом с поиском
  • Разделение нагрузки: изолировать горячие объявления от длинного хвоста

По мере роста продукта календарь почти неизбежно приходит к по идентификатору объявления или географическому сегменту. Идея простая: поиск может жить на read-model и кэше, а подтверждение брони должно идти в узкий, хорошо контролируемый источник истины.

Синхронизация с поиском

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

  1. 1Поисковый индекс возвращает кандидатов по карте, фильтрам и базовым признакам.
  2. 2Сервис календаря пакетно проверяет нужный диапазон дат и выкидывает недоступные варианты.
  3. 3Финальная выдача доупорядочивается персонализацией и продуктовыми сигналами.

5Контур бронирования

Instant Book и Request to Book

Instant Book

Гость получает подтверждение сразу, без ручного одобрения со стороны хозяина.

  • + Самый быстрый путь до оплаты
  • + Выше конверсия и меньше трения
  • - Больше риска для хозяина
Request to Book

Хозяин сначала просматривает запрос и только потом подтверждает бронь.

  • + Больше контроля для хозяина
  • - Медленнее путь для гостя
  • - Ниже общая конверсия

Процесс мгновенного бронирования

  1. 1Проверка доступности: атомарно проверить диапазон дат и поставить блокировку через Redis SETNX или SELECT FOR UPDATE.
  2. 2Расчёт цены: собрать ночные ставки, сборы, налоги и скидки в итоговую сумму.
  3. 3Авторизация платежа: выполнить Stripe PaymentIntent и удержать сумму без окончательного списания.
  4. 4Фиксация брони: в одной транзакции сохранить бронь и обновить календарь доступности.
  5. 5Уведомления: разослать подтверждение гостю и хозяину по email и push-каналам.
  6. 6Финальное списание: перевести авторизацию в capture по правилам продукта.

Распределённая координация

Бронирование затрагивает календарь, оплату, состояние брони и уведомления, поэтому сценарий удобно собирать через : каждый шаг либо подтверждается, либо откатывается компенсирующим действием.

Saga: CreateBooking
├── Step 1: Reserve dates (Availability Service)
│   └── Compensate: Release dates
├── Step 2: Authorize payment (Payment Service)
│   └── Compensate: Cancel authorization
├── Step 3: Create booking (Booking Service)
│   └── Compensate: Delete booking
└── Step 4: Send notifications (Async, no compensate)

6Динамическое ценообразование

Для Airbnb цена — не статическое поле в карточке, а отдельный контур с собственными сигналами спроса и предложения. В больших городах и в сезонных всплесках именно помогает выровнять загрузку, не ломая понятность продукта для хозяина и гостя.

Из чего складывается цена

Хозяин задаёт
  • Базовую цену за ночь
  • Надбавки на выходные
  • Недельные и месячные скидки
  • Плату за уборку и дополнительных гостей
Платформа добавляет
  • Сервисный сбор для гостя и хозяина
  • Локальные налоги и обязательные сборы
  • Конвертацию валют и округление
  • Рекомендации для автоматического управления ценой

Smart Pricing

Автоматические рекомендации по цене собирают несколько классов сигналов:

Сигналы спроса:
  • Сезонность
  • События в городе
  • День недели и глубина бронирования
Сигналы предложения:
  • Заполняемость похожих объектов
  • Lead time до поездки
  • Цены конкурирующих объявлений
Сигналы объявления:
  • Рейтинг и качество отзывов
  • Удобства и тип размещения
  • Качество фотографий и контента

7Контур доверия и безопасности

Для Airbnb важен не только checkout-flow. Продукт обязан поддерживать , который проверяет участников, защищает коммуникацию и отдельно занимается , иначе маркетплейс начинает терять обе стороны сразу.

Доверие для обеих сторон

Для гостей
  • Проверенные фотографии и описание жилья
  • Отзывы других гостей
  • Статус Superhost
  • Airbnb Cover и поддержка 24/7
  • Понятные правила отмены и возврата
Для хозяев
  • Проверка личности гостя
  • История отзывов и поведения
  • Защита от ущерба
  • Страховой депозит и правила дома
  • Проверки на злоупотребления и серые сценарии

Контур антифрода

  • ML-модели: отсеивают фейковые объявления и подозрительные бронирования.
  • Risk scoring: пользователь, платёж и бронирование получают отдельную оценку риска.
  • Анализ сообщений: NLP помогает замечать попытки увода оплаты за пределы платформы.
  • Проверка фото: CV-модели сопоставляют изображения с заявленным объектом.

Система отзывов

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

  • Blind reviews: стороны видят отзывы только после публикации обеих оценок или завершения окна ожидания.
  • Ограниченное окно: отзыв нужно оставить в течение фиксированного периода после поездки.
  • Публичный ответ: хозяин может прокомментировать отзыв и снять часть неопределённости для будущих гостей.

8Высокоуровневая архитектура и стандартные сценарии

Архитектура и сценарии Airbnb

Поисковый и транзакционный контуры двустороннего маркетплейса

Поисковый контур (нагрузка на чтение)

Приложение гостя
поиск и фильтры
API Gateway
авторизация и маршрутизация
Сервис поиска
запрос к геоиндексу
Чтение календаря
проекция доступности
Сервис ранжирования
релевантность и ML

Транзакционный контур (корректность брони)

Кабинет хозяина
подтверждение и обновления
API Gateway
авторизация и маршрутизация
Оркестратор бронирования
координация шагов
Платёжный сервис
авторизация и возврат
Хранилище броней
состояние заказа
Сервис инвентаря
блокировка и освобождение дат
Уведомления
email, push, sms
Airbnb разводит быстрый поисковый контур и строгий транзакционный контур: карта и выдача не должны тормозить подтверждение брони.
Выберите сценарий сверху, чтобы подсветить конкретный путь запроса через архитектуру.

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

9Что важно проговорить на интервью

✓ Обязательно обсудить

  • Как выбрать геоиндекс и не смешать его с календарём доступности
  • Как синхронизировать поиск, календарь и подтверждение брони
  • Как защититься от двойного бронирования и гонок на популярных объектах
  • Почему у гостя и хозяина разные сценарии, ограничения и ожидаемые сроки ответа
  • Чем отличаются авторизация платежа и окончательное списание

💡 Дополнительные темы

  • Автоматическое управление ценой и его связь с сезонностью и конкурентной средой
  • Персонализация поисковой выдачи и разнообразие результатов
  • Интернационализация: валюты, языки, локальные налоги и правила
  • Расширение продукта с жилья на experiences и другие категории предложения

Если остаётся время, полезно отдельно проговорить путь медиа: исходные фотографии хранятся отдельно, а resized-версии и публичная раздача почти всегда уходят в , чтобы не мешать ни поиску, ни бронированию.

Типичные ошибки на интервью

  • Свести кейс только к каталогу и забыть про вторую сторону маркетплейса
  • Пытаться держать полный календарь внутри поискового индекса
  • Игнорировать таймзоны и локальные правила расчёта ночей
  • Не обсуждать доверие, антифрод и качество пользовательского контента

Связанные главы

Чтобы отмечать прохождение, включи трекинг в Настройки