как мы сделали поисковой движок

61
КАК МЫ НАПИСАЛИ НОВЫЙ ПОИСК Антон Плешивцев, aviasales.ru

Upload: ant-pl

Post on 31-Oct-2014

22 views

Category:

Technology


2 download

DESCRIPTION

 

TRANSCRIPT

Page 1: как мы сделали поисковой движок

КАК МЫ НАПИСАЛИ НОВЫЙ ПОИСКАнтон Плешивцев, aviasales.ru

Page 2: как мы сделали поисковой движок

МЕТАПОИСК

Page 3: как мы сделали поисковой движок

МЕТАПОИСК

Page 4: как мы сделали поисковой движок

МЕТАПОИСК

Page 5: как мы сделали поисковой движок

МЕТАПОИСК

Page 6: как мы сделали поисковой движок

МЕТАПОИСК

Page 7: как мы сделали поисковой движок

МЕТАПОИСК

Page 8: как мы сделали поисковой движок

INTRO

• 20k запросов в час

• 13Gb в минуту

• 6k билетов в сутки

• 60 одновременных запросов

Page 9: как мы сделали поисковой движок

ПОИСК V1.0

Page 10: как мы сделали поисковой движок

ПОИСК V1.0

• 1 ROR приложение

• ~130 гемов

• 10k тестов

Page 11: как мы сделали поисковой движок

ПОИСК V1.0

• 30 минут на деплой

Page 12: как мы сделали поисковой движок

ПОИСК V1.0

• 30 минут на деплой

• 350mb на процесс

Page 13: как мы сделали поисковой движок

ПОИСК V1.0

• 30 минут на деплой

• 350mb на процесс

• 30сек на старт приложения

Page 14: как мы сделали поисковой движок

ПОИСК V1.0

• 30 минут на деплой

• 350mb на процесс

• 30сек на старт приложения

• Блокирующий i/o

Page 15: как мы сделали поисковой движок

ПРОЩАЙ, RAILS

Page 16: как мы сделали поисковой движок
Page 17: как мы сделали поисковой движок

ПРОЩАЙ, RAILS OOP

Page 18: как мы сделали поисковой движок

– Paul Graham

«When I see patterns in my programs, I consider it a sign of trouble. The shape of a program should reflect

only the problem it needs to solve. Any other regularity in the code is a sign, to me at least, that I’m using abstractions that aren’t powerful enough…».

Page 19: как мы сделали поисковой движок

SOA

Page 20: как мы сделали поисковой движок

SOA?

Page 21: как мы сделали поисковой движок

SOA!

Page 22: как мы сделали поисковой движок

SOA

• Сервисы

• Интерфейсы

• Конфигурации

Page 23: как мы сделали поисковой движок

SOA

data_extenderINPUT OUTPUT

SET CONFIG

GET CONFIG

Page 24: как мы сделали поисковой движок

ПОИСК

Page 25: как мы сделали поисковой движок

ПОИСК

Page 26: как мы сделали поисковой движок

ПОИСК

Page 27: как мы сделали поисковой движок

ПОИСК

Page 28: как мы сделали поисковой движок

ПОИСК

params

Page 29: как мы сделали поисковой движок

ПОИСК

params

onetwotrip_gate

ozon_gate

Page 30: как мы сделали поисковой движок

ПОИСК

params

onetwotrip_gate

ozon_gate

awad_gate

Page 31: как мы сделали поисковой движок

ПОИСК

params

onetwotrip_gate

ozon_gate

awad_gate

eviterra_gate

Page 32: как мы сделали поисковой движок

ПОИСК

params

onetwotrip_gate

ozon_gate

awad_gate

eviterra_gate

result

Page 33: как мы сделали поисковой движок

DSL

Page 34: как мы сделали поисковой движок
Page 35: как мы сделали поисковой движок

INTERNAL DSL

namespace :deploy do desc 'Restart application' task :restart do on roles(:app), in: :sequence, wait: 5 do # Your restart mechanism here, for example: execute :touch, release_path.join('tmp/restart.txt') end end end

Page 36: как мы сделали поисковой движок

EXTERNAL DSLserver { listen 80; client_max_body_size 16M; root /home/aviasales/woodpecker/current/public; charset utf-8; ! location / { try_files $uri/index.html $uri @app; } ! location @app { proxy_set_header Client-Ip $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_redirect off; proxy_pass http://app; } }

Page 37: как мы сделали поисковой движок

EXTERNAL JSON DSL

"s": [ "qatar_supported_directions", "qatar_jetradar_ruler", "qatar_throttler", "qatar_special_ticket_mark", "time_zones_extender", "drop_bad_tickets", "merge", "gate_productivity_extender", "airlines_extender", "deeplinks_extender", "airline_deeplinks_extender_db", "order_urls_collector", "result" ]

Page 38: как мы сделали поисковой движок

EXTERNAL JSON DSL

• ЛЕГКО ВАЛИДИРОВАТЬ

• ЛЕГКО ОБРАБОТАТЬ

• ЛЕГКО ВЫПОЛНИТЬ

Page 39: как мы сделали поисковой движок
Page 40: как мы сделали поисковой движок

IO

Page 41: как мы сделали поисковой движок

IOA

B

wait

wait

wait

C

t

Page 42: как мы сделали поисковой движок

IO

A B

wait

wait

wait

C

t

Page 43: как мы сделали поисковой движок

IO

A

B

Ct

Page 44: как мы сделали поисковой движок

АСИНХРОННЫЙ IO

• кооперативная многозадачность

• экономия памяти

• просто укладывается в голове

Page 45: как мы сделали поисковой движок

АСИНХРОННЫЙ IO В TORNADO V1.0

class AsyncHandler(RequestHandler): @asynchronous def get(self): http_client = AsyncHTTPClient() http_client.fetch("http://example.com", callback=self.on_fetch) ! def on_fetch(self, response): do_something_with_response(response) self.render("template.html")

Page 46: как мы сделали поисковой движок

АСИНХРОННЫЙ IO В TORNADO V2.0

class GenAsyncHandler(RequestHandler): @gen.coroutine def get(self): http_client = AsyncHTTPClient() response = yield http_client.fetch("http://example.com") do_something_with_response(response) self.render("template.html")

Page 47: как мы сделали поисковой движок

DATA

Page 48: как мы сделали поисковой движок

СПРАВОЧНИКИ

• файлы

• kyotocabinet

• inotify

• rsync

Page 49: как мы сделали поисковой движок

ЛОГИ

• логи в пределах узла

• нет глобального хранилища

Page 50: как мы сделали поисковой движок

ПОИСКОВАЯ ВЫДАЧА

• быстрое key-value хранилище

• избыточность

• синхронизация с глобальным хранилищем

Page 51: как мы сделали поисковой движок

CLUSTER

Page 52: как мы сделали поисковой движок

КЛАСТЕРRedis

MySQL

RabbitMQ

Redis

Page 53: как мы сделали поисковой движок

ОТКАЗ #1Redis

RabbitMQ

Redis

Page 54: как мы сделали поисковой движок

ОТКАЗ #2Redis

MySQL

RabbitMQ

Page 55: как мы сделали поисковой движок

КЛАСТЕРRedis

MySQL

RabbitMQ

Redis

Page 56: как мы сделали поисковой движок

RESULTS

• 250 мб на процесс

• до 10 одновременных запросов

• 500 одновременных соединений

• все данные внутри процесса

Page 57: как мы сделали поисковой движок

PITFALLS

Page 58: как мы сделали поисковой движок

TORNADO СТРАННЫЙ

Page 59: как мы сделали поисковой движок

TORNADO != ASYNC

Page 60: как мы сделали поисковой движок

ASYNC != EASY && FAST

Page 61: как мы сделали поисковой движок

ABOUT

АНТОН ПЛЕШИВЦЕВ !twitter.com/allaud github.com/allaud https://www.facebook.com/ant.pl.3 !aviasales.ru