System Design Space
Граф знанийНастройки

Обновлено: 25 марта 2026 г. в 04:52

Google Maps / Proximity Service — геопоиск

medium

Классическая задача: geo-index, nearby search, ranking, кэширование, regional sharding и latency-budget для карты.

Геопоиск сложен тем, что объекты двигаются, запросы локальны, а hot spots возникают именно там, где система должна отвечать быстрее всего.

Кейс помогает разобрать spatial indexing, write amplification от moving objects, radius search, geo partitioning и freshness координат на read path.

В интервью и design review он полезен тем, что проверяет понимание пространственных индексов, локальности и компромиссов между точностью и latency.

Latency Budget

Каждый hop в критическом пути должен иметь чёткий тайм-бюджет и предсказуемое поведение.

Fanout Strategy

Выбор push/pull/hybrid напрямую влияет на масштабируемость и сложность системы.

Session State

Важно учитывать presence, reconnect, ordering и delivery semantics для клиента.

Graceful Degradation

При пиках нагрузок система должна понижать качество сервиса без массового отказа.

Источник

System Design Interview

Классический Proximity Service как отдельный паттерн геопоиска в продуктовых системах.

Открыть обзор

Proximity Service - это сервис, который отвечает на вопрос: "что находится рядом" для заданной точки, радиуса и фильтров. В продукте уровня Google Maps архитектура строится вокруг двух разных контуров: offline ingestion/indexing и online low-latency serving.

Требования

Функциональные

  • Пользователь двигает карту и получает ближайшие POI в текущем viewport.
  • Поиск nearby по радиусу, категории и текстовому запросу.
  • Поддержка пагинации и стабильного порядка результатов при скролле карты.
  • Отдельный API для подсказок (autocomplete) и API для деталей точки.
  • Онлайн-обновление данных о загруженности/статусе точки (опционально).

Нефункциональные

Latency: p95 < 200ms

UI карты не должен «лагать» при pan/zoom.

Availability: 99.99%

Поиск должен работать даже при деградации части индексов.

Freshness: минуты, не часы

Новые/закрытые точки должны попадать в выдачу быстро.

Scale: миллионы QPS

Геораспределённый трафик с ярко выраженными hot zones.

High-Level Architecture

Client Apps

Map UI, pan/zoom, nearby search

Geo API Gateway

Auth, throttling, routing by region

Proximity Serving

Geo index lookup + ranking + filters

Hot Cache

Redis/Memcached, геоячейки популярных зон

Geo Index Store

S2/H3/Geohash + posting lists по категориям

POI Metadata DB

Название, часы работы, рейтинг, теги

Запрос обрабатывается в две фазы: candidate retrieval по соседним ячейкам, затем ranking с учётом дистанции, релевантности и бизнес-сигналов.

Интерактивная обработка nearby-запроса

Меняй категорию и радиус, затем проходи pipeline по шагам.

Координата примера: 37.7793, -122.4192

Шаг 1 из 5

Geo API Gateway: валидация и нормализация запроса

Сервис валидирует входные параметры и направляет запрос в ближайший регион.

Latency budget: 15-25ms
  • Проверка API ключа, лимитов и обязательных параметров.
  • Нормализация lat/lng, радиуса и локали клиента.
  • Route-by-region в ближайший proximity serving cluster.
{
  "lat": 37.7793,
  "lng": -122.4192,
  "radius_m": 1500,
  "category": "cafe",
  "region": "us-west-1",
  "auth": "ok",
  "quota": "ok"
}

Выбор spatial index

ПодходГде особенно полезенКомпромиссы
GeohashПростой старт и key-value storageНеравномерность ячеек и edge effects возле границ.
S2Глобальные карты и аккуратная геометрия сферыСложнее implementation и debugging.
H3Аналитика, плотности, heatmapsПереход между резолюциями требует аккуратной настройки.
R-tree/QuadTreeТяжёлые spatial queries в БДДороже обновления при high write нагрузке.

API и data model (упрощённо)

Основной API

GET /v1/places/nearby?lat=37.78&lng=-122.41&radius=1500&category=cafe&limit=20

Response:
{
  "items": [
    { "place_id": "p123", "distance_m": 120, "score": 0.91 },
    { "place_id": "p889", "distance_m": 240, "score": 0.88 }
  ],
  "next_page_token": "..."
}

Индекс и метаданные

  • geo_cell_index: cell_id -> place_ids
  • poi: place_id, name, category, coords, rating, business_hours
  • popularity_signals: recent clicks/check-ins/reviews
  • change_log: события для incremental re-index

Надёжность и anti-patterns

Что помогает в production

  • Региональное шардирование по cell ranges + репликация по зонам.
  • Двухуровневый кэш: edge cache для популярных зон + service cache.
  • Graceful degradation: fallback на более грубую резолюцию индекса.
  • Incremental reindex вместо полного пересчёта индекса.

Типичные ошибки

  • Искать только в одной ячейке и забывать про соседние клетки на границе радиуса.
  • Сортировать только по расстоянию без quality score (rating, relevance, открыто/закрыто).
  • Не отделять online serving index от batch-пайплайна подготовки данных.
  • Делать глобальный кэш без регионального шардирования и без защиты от stampede.
  • Забыть про дедупликацию POI из разных провайдеров данных.

Reference

S2 Geometry

Практический инструмент для cell-based spatial indexing на сфере.

Открыть

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

  • Airbnb: геоиндекс и доступность - показывает смежный гео-домен с фокусом на поиск доступных объектов и региональное масштабирование.
  • Uber/Lyft: realtime location - дополняет геопоиск задачами живой геолокации, маршрутизации и строгих latency-бюджетов.
  • Search System: ranking pipeline - усиливает часть про ранжирование, сигнализацию и организацию search pipeline на больших объёмах.
  • CDN: edge кэш и latency - объясняет роль edge-слоя и кэширования для ускорения geo API и снижения глобальной задержки.

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