SlideShare une entreprise Scribd logo
1  sur  61
Télécharger pour lire hors ligne
КАК МЫ НАПИСАЛИ НОВЫЙ ПОИСК
Антон Плешивцев, aviasales.ru
МЕТАПОИСК
МЕТАПОИСК
МЕТАПОИСК
МЕТАПОИСК
МЕТАПОИСК
МЕТАПОИСК
INTRO
• 20k запросов в час	

• 13Gb в минуту	

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

• 60 одновременных запросов
ПОИСК V1.0
ПОИСК V1.0
• 1 ROR приложение	

• ~130 гемов	

• 10k тестов
ПОИСК V1.0
• 30 минут на деплой
ПОИСК V1.0
• 30 минут на деплой	

• 350mb на процесс
ПОИСК V1.0
• 30 минут на деплой	

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

• 30сек на старт приложения
ПОИСК V1.0
• 30 минут на деплой	

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

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

• Блокирующий i/o
ПРОЩАЙ, RAILS
ПРОЩАЙ, RAILS OOP
– 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…».
SOA
SOA?
SOA!
SOA
• Сервисы	

• Интерфейсы	

• Конфигурации
SOA
data_extenderINPUT OUTPUT
SET CONFIG
GET CONFIG
ПОИСК
ПОИСК
ПОИСК
ПОИСК
ПОИСК
params
ПОИСК
params
onetwotrip_gate
ozon_gate
ПОИСК
params
onetwotrip_gate
ozon_gate
awad_gate
ПОИСК
params
onetwotrip_gate
ozon_gate
awad_gate
eviterra_gate
ПОИСК
params
onetwotrip_gate
ozon_gate
awad_gate
eviterra_gate
result
DSL
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
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;	

}	

}
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" 	

]
EXTERNAL JSON DSL
• ЛЕГКО ВАЛИДИРОВАТЬ	

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

• ЛЕГКО ВЫПОЛНИТЬ
IO
IO
A
B
wait
wait
wait
C
t
IO
A B
wait
wait
wait
C
t
IO
A
B
C
t
АСИНХРОННЫЙ IO
• кооперативная многозадачность	

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

• просто укладывается в голове
АСИНХРОННЫЙ 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")
АСИНХРОННЫЙ 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")
DATA
СПРАВОЧНИКИ
• файлы	

• kyotocabinet	

• inotify	

• rsync
ЛОГИ
• логи в пределах узла	

• нет глобального хранилища
ПОИСКОВАЯ ВЫДАЧА
• быстрое key-value хранилище	

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

• синхронизация с глобальным хранилищем
CLUSTER
КЛАСТЕР
Redis
MySQL
RabbitMQ
Redis
ОТКАЗ #1
Redis
RabbitMQ
Redis
ОТКАЗ #2
Redis
MySQL
RabbitMQ
КЛАСТЕР
Redis
MySQL
RabbitMQ
Redis
RESULTS
• 250 мб на процесс	

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

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

• все данные внутри процесса
PITFALLS
TORNADO СТРАННЫЙ
TORNADO != ASYNC
ASYNC != EASY && FAST
ABOUT
АНТОН ПЛЕШИВЦЕВ	

!
twitter.com/allaud
github.com/allaud
https://www.facebook.com/ant.pl.3
!
aviasales.ru

Contenu connexe

Tendances

Знакомство с WebAssembly
Знакомство с WebAssemblyЗнакомство с WebAssembly
Знакомство с WebAssemblyNikita Zimin
 
KAZOOMEETUP MOSCOW 2015. Владимир Потапьев. Обзор приложения Circlemaker (RAD...
KAZOOMEETUP MOSCOW 2015. Владимир Потапьев. Обзор приложения Circlemaker (RAD...KAZOOMEETUP MOSCOW 2015. Владимир Потапьев. Обзор приложения Circlemaker (RAD...
KAZOOMEETUP MOSCOW 2015. Владимир Потапьев. Обзор приложения Circlemaker (RAD...SIPLABS Communications
 
Путь к Go на конкретном примере
Путь к Go на конкретном примереПуть к Go на конкретном примере
Путь к Go на конкретном примереSergey Xek
 
KAZOOMEETUP MOSCOW 2015. Максим Кржеменевский. Масштабируемость и отказоустой...
KAZOOMEETUP MOSCOW 2015. Максим Кржеменевский. Масштабируемость и отказоустой...KAZOOMEETUP MOSCOW 2015. Максим Кржеменевский. Масштабируемость и отказоустой...
KAZOOMEETUP MOSCOW 2015. Максим Кржеменевский. Масштабируемость и отказоустой...SIPLABS Communications
 
CodeFest 2012. Евтухович И. — Как мы делали Групон
CodeFest 2012. Евтухович И. — Как мы делали ГрупонCodeFest 2012. Евтухович И. — Как мы делали Групон
CodeFest 2012. Евтухович И. — Как мы делали ГрупонCodeFest
 
Zabbix 3.2 - мониторинг качественно нового уровня / Алексей Владышев (Zabbix)
Zabbix 3.2 - мониторинг качественно нового уровня / Алексей Владышев (Zabbix)Zabbix 3.2 - мониторинг качественно нового уровня / Алексей Владышев (Zabbix)
Zabbix 3.2 - мониторинг качественно нового уровня / Алексей Владышев (Zabbix)Ontico
 
Bosun современный мониторинг / Дима Медведев (OneTwoTrip)
Bosun современный мониторинг / Дима Медведев (OneTwoTrip)Bosun современный мониторинг / Дима Медведев (OneTwoTrip)
Bosun современный мониторинг / Дима Медведев (OneTwoTrip)Ontico
 
антон веснин Rails Application Servers
антон веснин Rails Application Serversантон веснин Rails Application Servers
антон веснин Rails Application Serversrit2010
 
Alexei Vladishev - Zabbix 3.0 что дальше
Alexei Vladishev - Zabbix 3.0 что дальшеAlexei Vladishev - Zabbix 3.0 что дальше
Alexei Vladishev - Zabbix 3.0 что дальшеZabbix
 
KAZOOMEETUP MOSCOW 2015. Михаил Родионов. Введение в KAZOO (KAZOO 101)
KAZOOMEETUP MOSCOW 2015. Михаил Родионов. Введение в KAZOO (KAZOO 101)KAZOOMEETUP MOSCOW 2015. Михаил Родионов. Введение в KAZOO (KAZOO 101)
KAZOOMEETUP MOSCOW 2015. Михаил Родионов. Введение в KAZOO (KAZOO 101)SIPLABS Communications
 
Александр Зобнин, Grafana Labs
Александр Зобнин, Grafana LabsАлександр Зобнин, Grafana Labs
Александр Зобнин, Grafana LabsBadoo Development
 
Андрей Денисов – В ожидании мониторинга баз данных
Андрей Денисов – В ожидании мониторинга баз данныхАндрей Денисов – В ожидании мониторинга баз данных
Андрей Денисов – В ожидании мониторинга баз данныхBadoo Development
 
Разработка API для большого, нагруженного сервиса
Разработка API для большого, нагруженного сервисаРазработка API для большого, нагруженного сервиса
Разработка API для большого, нагруженного сервисаendeveit
 
Chrome push notifications. Анатомия и разработка
Chrome push notifications. Анатомия и разработкаChrome push notifications. Анатомия и разработка
Chrome push notifications. Анатомия и разработкаAlexandr Mikhaylenko
 
Колёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проекта
Колёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проектаКолёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проекта
Колёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проектаITCrowd Almaty
 
КРИ-2013. "Нагрузочное тестирование или Боты - санитары сервера"
КРИ-2013. "Нагрузочное тестирование или Боты - санитары сервера"КРИ-2013. "Нагрузочное тестирование или Боты - санитары сервера"
КРИ-2013. "Нагрузочное тестирование или Боты - санитары сервера"Alexander Akbashev
 
Бекэнд для push-уведомлений своими руками
Бекэнд для push-уведомлений своими рукамиБекэнд для push-уведомлений своими руками
Бекэнд для push-уведомлений своими рукамиAlexandr Mikhaylenko
 
Курс Java-2016. Занятие 09. Web
Курс Java-2016. Занятие 09. WebКурс Java-2016. Занятие 09. Web
Курс Java-2016. Занятие 09. Web7bits
 
Pundle для менджемента зависимостей в python проектах
Pundle для менджемента зависимостей в python проектахPundle для менджемента зависимостей в python проектах
Pundle для менджемента зависимостей в python проектахMikhail Krivushin
 
Illya Klymov - "Vue.JS: What did I swap React for in 2017 and why?"
Illya Klymov - "Vue.JS: What did I swap React for in 2017 and why?"Illya Klymov - "Vue.JS: What did I swap React for in 2017 and why?"
Illya Klymov - "Vue.JS: What did I swap React for in 2017 and why?"IT Event
 

Tendances (20)

Знакомство с WebAssembly
Знакомство с WebAssemblyЗнакомство с WebAssembly
Знакомство с WebAssembly
 
KAZOOMEETUP MOSCOW 2015. Владимир Потапьев. Обзор приложения Circlemaker (RAD...
KAZOOMEETUP MOSCOW 2015. Владимир Потапьев. Обзор приложения Circlemaker (RAD...KAZOOMEETUP MOSCOW 2015. Владимир Потапьев. Обзор приложения Circlemaker (RAD...
KAZOOMEETUP MOSCOW 2015. Владимир Потапьев. Обзор приложения Circlemaker (RAD...
 
Путь к Go на конкретном примере
Путь к Go на конкретном примереПуть к Go на конкретном примере
Путь к Go на конкретном примере
 
KAZOOMEETUP MOSCOW 2015. Максим Кржеменевский. Масштабируемость и отказоустой...
KAZOOMEETUP MOSCOW 2015. Максим Кржеменевский. Масштабируемость и отказоустой...KAZOOMEETUP MOSCOW 2015. Максим Кржеменевский. Масштабируемость и отказоустой...
KAZOOMEETUP MOSCOW 2015. Максим Кржеменевский. Масштабируемость и отказоустой...
 
CodeFest 2012. Евтухович И. — Как мы делали Групон
CodeFest 2012. Евтухович И. — Как мы делали ГрупонCodeFest 2012. Евтухович И. — Как мы делали Групон
CodeFest 2012. Евтухович И. — Как мы делали Групон
 
Zabbix 3.2 - мониторинг качественно нового уровня / Алексей Владышев (Zabbix)
Zabbix 3.2 - мониторинг качественно нового уровня / Алексей Владышев (Zabbix)Zabbix 3.2 - мониторинг качественно нового уровня / Алексей Владышев (Zabbix)
Zabbix 3.2 - мониторинг качественно нового уровня / Алексей Владышев (Zabbix)
 
Bosun современный мониторинг / Дима Медведев (OneTwoTrip)
Bosun современный мониторинг / Дима Медведев (OneTwoTrip)Bosun современный мониторинг / Дима Медведев (OneTwoTrip)
Bosun современный мониторинг / Дима Медведев (OneTwoTrip)
 
антон веснин Rails Application Servers
антон веснин Rails Application Serversантон веснин Rails Application Servers
антон веснин Rails Application Servers
 
Alexei Vladishev - Zabbix 3.0 что дальше
Alexei Vladishev - Zabbix 3.0 что дальшеAlexei Vladishev - Zabbix 3.0 что дальше
Alexei Vladishev - Zabbix 3.0 что дальше
 
KAZOOMEETUP MOSCOW 2015. Михаил Родионов. Введение в KAZOO (KAZOO 101)
KAZOOMEETUP MOSCOW 2015. Михаил Родионов. Введение в KAZOO (KAZOO 101)KAZOOMEETUP MOSCOW 2015. Михаил Родионов. Введение в KAZOO (KAZOO 101)
KAZOOMEETUP MOSCOW 2015. Михаил Родионов. Введение в KAZOO (KAZOO 101)
 
Александр Зобнин, Grafana Labs
Александр Зобнин, Grafana LabsАлександр Зобнин, Grafana Labs
Александр Зобнин, Grafana Labs
 
Андрей Денисов – В ожидании мониторинга баз данных
Андрей Денисов – В ожидании мониторинга баз данныхАндрей Денисов – В ожидании мониторинга баз данных
Андрей Денисов – В ожидании мониторинга баз данных
 
Разработка API для большого, нагруженного сервиса
Разработка API для большого, нагруженного сервисаРазработка API для большого, нагруженного сервиса
Разработка API для большого, нагруженного сервиса
 
Chrome push notifications. Анатомия и разработка
Chrome push notifications. Анатомия и разработкаChrome push notifications. Анатомия и разработка
Chrome push notifications. Анатомия и разработка
 
Колёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проекта
Колёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проектаКолёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проекта
Колёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проекта
 
КРИ-2013. "Нагрузочное тестирование или Боты - санитары сервера"
КРИ-2013. "Нагрузочное тестирование или Боты - санитары сервера"КРИ-2013. "Нагрузочное тестирование или Боты - санитары сервера"
КРИ-2013. "Нагрузочное тестирование или Боты - санитары сервера"
 
Бекэнд для push-уведомлений своими руками
Бекэнд для push-уведомлений своими рукамиБекэнд для push-уведомлений своими руками
Бекэнд для push-уведомлений своими руками
 
Курс Java-2016. Занятие 09. Web
Курс Java-2016. Занятие 09. WebКурс Java-2016. Занятие 09. Web
Курс Java-2016. Занятие 09. Web
 
Pundle для менджемента зависимостей в python проектах
Pundle для менджемента зависимостей в python проектахPundle для менджемента зависимостей в python проектах
Pundle для менджемента зависимостей в python проектах
 
Illya Klymov - "Vue.JS: What did I swap React for in 2017 and why?"
Illya Klymov - "Vue.JS: What did I swap React for in 2017 and why?"Illya Klymov - "Vue.JS: What did I swap React for in 2017 and why?"
Illya Klymov - "Vue.JS: What did I swap React for in 2017 and why?"
 

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

"Хероковая жизнь" Юрий Литвиненко
"Хероковая жизнь" Юрий Литвиненко"Хероковая жизнь" Юрий Литвиненко
"Хероковая жизнь" Юрий ЛитвиненкоFwdays
 
Илья Биин: Организация совместной работы Go и Python-based сервисов в Ostrovo...
Илья Биин: Организация совместной работы Go и Python-based сервисов в Ostrovo...Илья Биин: Организация совместной работы Go и Python-based сервисов в Ostrovo...
Илья Биин: Организация совместной работы Go и Python-based сервисов в Ostrovo...Yandex
 
Экономически эффективный процесс тестирования
Экономически эффективный процесс тестированияЭкономически эффективный процесс тестирования
Экономически эффективный процесс тестированияCodeFest
 
Подписание паспорта готовности электронной цифровой подписью в ЕКИС. Смирнова...
Подписание паспорта готовности электронной цифровой подписью в ЕКИС. Смирнова...Подписание паспорта готовности электронной цифровой подписью в ЕКИС. Смирнова...
Подписание паспорта готовности электронной цифровой подписью в ЕКИС. Смирнова...TCenter500
 
Подписание паспорта готовности электронной цифровой подписью в ЕКИС
Подписание паспорта готовности электронной цифровой подписью в ЕКИСПодписание паспорта готовности электронной цифровой подписью в ЕКИС
Подписание паспорта готовности электронной цифровой подписью в ЕКИСTCenter500
 
Экономически эффективный процесс тестирования (Codefest 2015)
Экономически эффективный процесс тестирования (Codefest 2015)Экономически эффективный процесс тестирования (Codefest 2015)
Экономически эффективный процесс тестирования (Codefest 2015)Andrei Solntsev
 

Similaire à как мы сделали поисковой движок (6)

"Хероковая жизнь" Юрий Литвиненко
"Хероковая жизнь" Юрий Литвиненко"Хероковая жизнь" Юрий Литвиненко
"Хероковая жизнь" Юрий Литвиненко
 
Илья Биин: Организация совместной работы Go и Python-based сервисов в Ostrovo...
Илья Биин: Организация совместной работы Go и Python-based сервисов в Ostrovo...Илья Биин: Организация совместной работы Go и Python-based сервисов в Ostrovo...
Илья Биин: Организация совместной работы Go и Python-based сервисов в Ostrovo...
 
Экономически эффективный процесс тестирования
Экономически эффективный процесс тестированияЭкономически эффективный процесс тестирования
Экономически эффективный процесс тестирования
 
Подписание паспорта готовности электронной цифровой подписью в ЕКИС. Смирнова...
Подписание паспорта готовности электронной цифровой подписью в ЕКИС. Смирнова...Подписание паспорта готовности электронной цифровой подписью в ЕКИС. Смирнова...
Подписание паспорта готовности электронной цифровой подписью в ЕКИС. Смирнова...
 
Подписание паспорта готовности электронной цифровой подписью в ЕКИС
Подписание паспорта готовности электронной цифровой подписью в ЕКИСПодписание паспорта готовности электронной цифровой подписью в ЕКИС
Подписание паспорта готовности электронной цифровой подписью в ЕКИС
 
Экономически эффективный процесс тестирования (Codefest 2015)
Экономически эффективный процесс тестирования (Codefest 2015)Экономически эффективный процесс тестирования (Codefest 2015)
Экономически эффективный процесс тестирования (Codefest 2015)
 

Plus de Антон Плешивцев (10)

1k speedup
1k speedup1k speedup
1k speedup
 
Es6 good parts
Es6 good partsEs6 good parts
Es6 good parts
 
How to create modern web application (about Virool mobile player)
How to create modern web application (about Virool mobile player)How to create modern web application (about Virool mobile player)
How to create modern web application (about Virool mobile player)
 
CodeFest dirty facts about AngularJS
CodeFest dirty facts about AngularJSCodeFest dirty facts about AngularJS
CodeFest dirty facts about AngularJS
 
Повышение конверсии через оптимизацию JS
Повышение конверсии через оптимизацию JSПовышение конверсии через оптимизацию JS
Повышение конверсии через оптимизацию JS
 
Frontend for the win
Frontend for the winFrontend for the win
Frontend for the win
 
Why fp
Why fpWhy fp
Why fp
 
Happydev presentation soa
Happydev presentation soaHappydev presentation soa
Happydev presentation soa
 
Happydev presentation angular
Happydev presentation angularHappydev presentation angular
Happydev presentation angular
 
интерфейсы3 ppt
интерфейсы3 pptинтерфейсы3 ppt
интерфейсы3 ppt
 

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