как мы сделали поисковой движок
DESCRIPTION
TRANSCRIPT
![Page 2: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/2.jpg)
МЕТАПОИСК
![Page 3: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/3.jpg)
МЕТАПОИСК
![Page 4: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/4.jpg)
МЕТАПОИСК
![Page 5: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/5.jpg)
МЕТАПОИСК
![Page 6: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/6.jpg)
МЕТАПОИСК
![Page 7: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/7.jpg)
МЕТАПОИСК
![Page 8: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/8.jpg)
INTRO
• 20k запросов в час
• 13Gb в минуту
• 6k билетов в сутки
• 60 одновременных запросов
![Page 9: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/9.jpg)
ПОИСК V1.0
![Page 10: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/10.jpg)
ПОИСК V1.0
• 1 ROR приложение
• ~130 гемов
• 10k тестов
![Page 11: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/11.jpg)
ПОИСК V1.0
• 30 минут на деплой
![Page 12: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/12.jpg)
ПОИСК V1.0
• 30 минут на деплой
• 350mb на процесс
![Page 13: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/13.jpg)
ПОИСК V1.0
• 30 минут на деплой
• 350mb на процесс
• 30сек на старт приложения
![Page 14: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/14.jpg)
ПОИСК V1.0
• 30 минут на деплой
• 350mb на процесс
• 30сек на старт приложения
• Блокирующий i/o
![Page 15: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/15.jpg)
ПРОЩАЙ, RAILS
![Page 16: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/16.jpg)
![Page 17: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/17.jpg)
ПРОЩАЙ, RAILS OOP
![Page 18: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/18.jpg)
– 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: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/19.jpg)
SOA
![Page 20: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/20.jpg)
SOA?
![Page 21: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/21.jpg)
SOA!
![Page 22: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/22.jpg)
SOA
• Сервисы
• Интерфейсы
• Конфигурации
![Page 23: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/23.jpg)
SOA
data_extenderINPUT OUTPUT
SET CONFIG
GET CONFIG
![Page 24: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/24.jpg)
ПОИСК
![Page 25: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/25.jpg)
ПОИСК
![Page 26: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/26.jpg)
ПОИСК
![Page 27: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/27.jpg)
ПОИСК
![Page 28: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/28.jpg)
ПОИСК
params
![Page 29: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/29.jpg)
ПОИСК
params
onetwotrip_gate
ozon_gate
![Page 30: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/30.jpg)
ПОИСК
params
onetwotrip_gate
ozon_gate
awad_gate
![Page 31: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/31.jpg)
ПОИСК
params
onetwotrip_gate
ozon_gate
awad_gate
eviterra_gate
![Page 32: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/32.jpg)
ПОИСК
params
onetwotrip_gate
ozon_gate
awad_gate
eviterra_gate
result
![Page 33: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/33.jpg)
DSL
![Page 34: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/34.jpg)
![Page 35: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/35.jpg)
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: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/36.jpg)
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: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/37.jpg)
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: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/38.jpg)
EXTERNAL JSON DSL
• ЛЕГКО ВАЛИДИРОВАТЬ
• ЛЕГКО ОБРАБОТАТЬ
• ЛЕГКО ВЫПОЛНИТЬ
![Page 39: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/39.jpg)
![Page 40: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/40.jpg)
IO
![Page 41: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/41.jpg)
IOA
B
wait
wait
wait
C
t
![Page 42: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/42.jpg)
IO
A B
wait
wait
wait
C
t
![Page 43: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/43.jpg)
IO
A
B
Ct
![Page 44: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/44.jpg)
АСИНХРОННЫЙ IO
• кооперативная многозадачность
• экономия памяти
• просто укладывается в голове
![Page 45: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/45.jpg)
АСИНХРОННЫЙ 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: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/46.jpg)
АСИНХРОННЫЙ 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: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/47.jpg)
DATA
![Page 48: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/48.jpg)
СПРАВОЧНИКИ
• файлы
• kyotocabinet
• inotify
• rsync
![Page 49: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/49.jpg)
ЛОГИ
• логи в пределах узла
• нет глобального хранилища
![Page 50: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/50.jpg)
ПОИСКОВАЯ ВЫДАЧА
• быстрое key-value хранилище
• избыточность
• синхронизация с глобальным хранилищем
![Page 51: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/51.jpg)
CLUSTER
![Page 52: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/52.jpg)
КЛАСТЕРRedis
MySQL
RabbitMQ
Redis
![Page 53: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/53.jpg)
ОТКАЗ #1Redis
RabbitMQ
Redis
![Page 54: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/54.jpg)
ОТКАЗ #2Redis
MySQL
RabbitMQ
![Page 55: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/55.jpg)
КЛАСТЕРRedis
MySQL
RabbitMQ
Redis
![Page 56: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/56.jpg)
RESULTS
• 250 мб на процесс
• до 10 одновременных запросов
• 500 одновременных соединений
• все данные внутри процесса
![Page 57: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/57.jpg)
PITFALLS
![Page 58: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/58.jpg)
TORNADO СТРАННЫЙ
![Page 59: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/59.jpg)
TORNADO != ASYNC
![Page 60: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/60.jpg)
ASYNC != EASY && FAST
![Page 61: как мы сделали поисковой движок](https://reader033.vdocuments.pub/reader033/viewer/2022051513/54528084af7959013f8b84b8/html5/thumbnails/61.jpg)
ABOUT
АНТОН ПЛЕШИВЦЕВ !twitter.com/allaud github.com/allaud https://www.facebook.com/ant.pl.3 !aviasales.ru