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

1,617 views
1,532 views

Published on

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,617
On SlideShare
0
From Embeds
0
Number of Embeds
149
Actions
Shares
0
Downloads
8
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

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

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

×