Архитектура поиска в Booking.com

Post on 15-Apr-2017

326 views 1 download

transcript

Архитектурапоискав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мс

Заключение

• скорость– этонетолькопроконверсию• посмотритенаматериализацию• бизнес-процессымогутоблегчитьжизнь

Иван Кругловivan.kruglov@booking.com

Спасибо!

Ваши вопросы?