Download - Архитектура поиска в Booking.com
АрхитектурапоискавBooking.comИванКруглов
Амстердам
Wemustdeliverthebestexperience,asfrictionlessaspossible,andgrowandadaptfasttothecustomer’sneedbyEduardoShiota
Wemustdeliverthebestexperience,asfrictionlessaspossible,andgrowandadaptfasttothecustomer’sneedbyEduardoShiota
byEduardoShiota
Wemustdeliverthebestexperience,asfrictionlessaspossible,andgrowandadaptfasttothecustomer’sneed
0
200 000
400 000
600 000
800 000
1 000 000
1 200 000
2002 2004 2006 2008 2010 2012 2014 2016
объектовразмещения
ежедневнозабронированных
ночей
byEduardoShiota
Wemustdeliverthebestexperience,asfrictionlessaspossible,andgrowandadaptfasttothecustomer’sneed
try & fail
A/Bтестирование
Buy now
Buy now
vs
1000+экспериментов
70+роллаутов вдень
byEduardoShiota
Wemustdeliverthebestexperience,asfrictionlessaspossible,andgrowandadaptfasttothecustomer’sneed
наилучшеевпечатление
низкиеценыбольшойвыборактуальнаяинформацияхорошийпоискудобнодоступносаппорт говоритнамоемязыкемобильныйсайтскоростьмобильноеприложениесайтнародномязыкеидр.
наилучшеевпечатление
низкиеценыбольшойвыборактуальнаяинформацияхороший поискудобнодоступносаппорт говоритнамоемязыкемобильныйсайтскоростьмобильноеприложениесайтнародномязыкеидр.
низкиеценыбольшойвыборактуальнаяинформацияхороший поискудобнодоступносаппорт говоритнамоемязыкемобильныйсайтскоростьмобильноеприложениесайтнародномязыкеидр.
наилучшеевпечатление
почемуважнаскорость?
https://goo.gl/DP593vhttps://goo.gl/HhquKLhttps://goo.gl/w1RIhHhttps://goo.gl/brL9Zxhttps://goo.gl/EbXZl1https://goo.gl/Gcaunb
поиск90%
10%
поиск50%50%
поискэволюция поиска текущая
архитектура
заключение
План
ПОИСК
поиск
отбор по атрибутам
group fitотбор по availability
ранжирование
autocomplete&
disambiguation
определениегеопозиции
поиск
отбор по атрибутам
group fitотбор по availability
ранжирование
autocomplete&
disambiguation
определениегеопозиции
деревняПариж,Кигинский район,РеспубликаБашкортостан,Россия?
inventory
гостиница«Домикструбой»
1янв. 2 янв. 3 янв.2 000₽ 1750 ₽
4 янв. 5 янв.1500 ₽ 1250 ₽
availability
гостиница«Домикструбой»
стоит6500₽с1янв.по5янв.
1янв. 2 янв. 3 янв.2 000₽ 1750 ₽
4 янв. 5 янв.1500 ₽ 1250 ₽
2 янв. 3 янв. 4 янв. 5 янв.2 150₽ занято 1650 ₽ 1150 ₽
1 янв.
2 000₽ 1750 ₽ N/A занято1900₽ занято занято 900 ₽занято 1500 ₽ занято N/A
сзвтрк,беспл.отмена
беззвтрк,беспл.отмена
с звтрк,плативперед
беззвтрк,плативперед
Эволюцияпоиска
<100 000(до 2010г.)
• теплыйLAMP-овый стекс2003г.• монолитнаяархитектура
inv
поиск
~150000(около2010г.)
• тяжелыйрасчетavailability• надо:~500отелей вПариже
*3+типакомнат*2+тарифа=3000+ расчетов
• можем:• 1000расчетоввсекдля1ночи• 90расчетоввсекдля30ночей
inv
поиск
Чтоделать?
1. Кэширование• maxcachehitratio:60%
2. ДавайтеперепишемвсенаX?• пострадаетagility• естьчтолучше?
3. Можнопопробоватьматериализовать!• высокийировныйperformance• огромныйобъемданных
1янв.– 2янв.=2000₽1янв.– 3янв.=3750₽1янв.– 4янв.=5250₽1янв.– 5янв.=6500₽2янв.– 3янв.=1750₽2янв.– 4янв.=3250₽2янв.– 5янв.=4500₽3янв.– 4янв.=1500₽3янв.– 5янв.=2750₽4янв.– 5янв.=1250₽
1 млн.отелей
3+типакомнат
2+тарифа
1-30длительностейпроживания
данныена1+ годвперед
100млрд.цен
• какнеиспортитьuserexperience?• какподдерживатьконсистентность?
Схемасматериализацией
поиск
AVinv материализация AVAV
поиск
autocomplete&
disambiguation
t =минуты
invAV
…globalrealtimequeue
globalbatchqueue
realtimequeue
batchqueue
расчетновогодня
AV
AV
кластерматериализации
материализаторматериализаторматериализаторматериализатор
очередьуведомлений
источникобновления
AV БД
• оптимизируемподчтение• кластеризацияPK погеопозиции (Z-ordercurve)• шардинг по check-in• 1xизменениев inv =>1000xизмененийвAV• SSD• 4KIOPs reads+writes,45MB/s
AVAVAV
https://goo.gl/24mFR8
• ускорениев50-100xраз• быстрыйхолодныйстарт• времяматериализациивнорме<1мин• метрики+алерты• qualitycheck
Результаты
поиск
AVinv материализация AVAV
500000+(до~2014г.)
• uwsgi +nginx +perl +mysql• ростбизнеса• новыефичи• поискпостранамирегионам
• один запрос=один воркер
2014 – 2015 гг.
• Map-Reduceфреймворк• SOA
• большиезапросы– быстрее• маленькиезапросы– медленнее
• IPCoverheadsAVinv материализация AVAV
MR
веб-сервер
MR
MR
Текущаяархитектура
Надочто-томенять!
• чтохотелось:• отойтиотустаревшихподходов• сохранитьMRи SOA• быстрыйдоступкAVидругимданным• базаданныхвкоторуюможнобыстрописать• дешевыйпараллелизм
• попробовалиTarantool
• будемделать:• Perl=>Java
• multithreading,меньшийконстантныйфактор• данныеin-memory• MySQL=>RocksDB
координаторкоординатор
веб-сервер
координатор
AVпоиск AVпоиск AVпоиск
AVпоиск AVпоиск AVпоиск
AVпоиск AVпоиск AVпоиск
статический шардинг
hotel_id mod Nреплики эквивалентны
shard0
реплика0 реплика1 реплика M
…
…
…
shard1
shardN
… … …
материал.очередьavailability
материализация
inv
scatter-gatherрандомный выборреплики
retry, если необходимо
ping nodes
апдейты за последние часы
in-memory индексы
AV persisted
Paris=>[hotels inParis]has_parking =>[hotelswithparking]
входные данные:
1. геопозиция: Париж2. атрибуты поиска: парковка, завтрак и т.д.
инвертированныеиндексы
Paris=>[hotels inParis]has_parking =>[hotelswithparking]Париж=>[отели вПариже]has_parking =>[отелиспарковкой ]
отели отели отели
thread0 threadNthread1
… filtersorttopn
filtersorttopn
filtersorttopn
merge
…
ккоординатору
AV
входные данные:
3. check-in, check-out4. состав «команды»
ПочемувстроеннаяБД?
ПочемуименноRocksDB?
ПочемуRocksDB?
http://rocksdb.org
ПочемувстроеннаяБД?latency вмасштабе
CPUцикл 0,3нс 1сдоступвL1кэш 0,9нс 3сдоступвL2кэш 2,8нс 9сдоступвL3кэш 12,9нс 43сдоступвосновнуюпамять 120нс 6минсжатие 1КБв Snappy 3000нс 2,7часотправка1КБпосети 10000нс 9часчтение1МБизосновнойпамяти 250000нс 9днейroundtripвнутридатацентра 500000нс 19днейретрансмит TCPпакета 2000000000нс 200лет
https://gist.github.com/jboner/2841832http://talks.godoc.org/github.com/davecheney/high-performance-go-workshop/high-performance-go-workshop.slide#1
ПочемувстроеннаяБД?latency вмасштабе
CPUцикл 0,3нс 1сдоступвL1кэш 0,9нс 3сдоступвL2кэш 2,8нс 9сдоступвL3кэш 12,9нс 43сдоступвосновнуюпамять 120нс 6минсжатие 1КБв Snappy 3000нс 2,7часотправка1КБпосети 10000нс 9часчтение1МБизосновнойпамяти 250000нс 9днейroundtripвнутридатацентра 500000нс 19днейретрансмит TCPпакета 2000000000нс 200лет
ПочемуRocksDB?
• нужнаkey-valueвстроеннаяБД(store,get,delete)• попробовалиразныеварианты:• MapDB,Tokyo/Kyotocabinet,leveldb
• «боевыеусловия»:• датасет вpagecache• 80%чтение+20%запись
• стабильныйrandomreadperformanceприrandomwrites• HDDs, ~1.5KwriteIOPs,6MB/s
https://goo.gl/dqeBPG
Результаты• времяответапоисковогосервиса:
• времяответастраничкипоиска:
base:2086ms
variant1:1361ms
кол-воотелей до послеАдриатическоепобережье ~30 000 13сек 30мсРим ~6 000 5сек 20мсСофия ~300 200мс 10мс
Заключение
• скорость– этонетолькопроконверсию• посмотритенаматериализацию• бизнес-процессымогутоблегчитьжизнь