Использование soa для построения сложных веб проектов -...
DESCRIPTION
TRANSCRIPT
![Page 2: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/2.jpg)
Что такое SOA?
![Page 3: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/3.jpg)
Обычный сайт (монолитная архитектура)
/index
View
DB
ControllerПолучить сессию
Загрузить отклики…
Загрузить список резюме
3
![Page 4: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/4.jpg)
Проблемы1. Один репозиторий, много разработчиков
2. Рост кодовой базы
3. Ограничения в использовании языка программирования
4. Внешние подрядчики
5. ... to be counted
4
![Page 5: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/5.jpg)
Сервис-ориентированная архитектура(SOA)модульный подход к разработке программного обеспечения,
основанный на использовании распределённых, слабо связанных
заменяемых компонентов со стандартизированными интерфейсами и
протоколам взаимодействия.
Источник: Wikipedia
5
![Page 6: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/6.jpg)
SOA-based сайт
/index
Controller
View
Сессия
Сервис откликов
Сервис резюме
DB1
DB2
DB3
protobuf
JSON
XML
Cloud Service
6
![Page 7: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/7.jpg)
Компонент системы в разработке• Один сервис - один репозиторий
• Свобода выбора языка программирования
• Возможность отдать на аутсорс
7
![Page 8: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/8.jpg)
Контролируемая деградация• Лучше показать часть информации, чем упасть с 500
• Лучше показать самое важное за 100мс—1с, чем все за 10 секунд
8
![Page 9: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/9.jpg)
![Page 10: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/10.jpg)
![Page 11: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/11.jpg)
Почему это важно• 47% людей ожидают, что страница будет загружаться менее двух
секунд
• 40% закрывают страницу, если она загружается более трех секунд
• 52% считают важным скорость загрузки страницы
Источник: Akamai
11
![Page 12: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/12.jpg)
![Page 13: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/13.jpg)
Разные требования к сервисам• Не все сервисы должны работать под большой нагрузкой
• Некоторые могут и "полежать"
• Оптимизируем только там, где это нужно
13
![Page 14: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/14.jpg)
Виртуализация• На одной машине один сервис
• Легче мониторить
• Легче деплоить
• Можно добавлять/удалять машины по необходимости
14
![Page 15: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/15.jpg)
Дополнительный слой кеширования
/index
Controller
View
Сессия
Сервис откликов
Сервис резюме
DB1
DB2
DB3
protobuf
JSON
XML
memcached, redis, …varnish, nginx (proxy_cache)
Cloud Service
15
![Page 16: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/16.jpg)
Много платформ
Основной сайт hh.ru
API api.hh.ru
Мобильный сайт m.hh.ru
Сессия Сервис откликов
Сервис резюме
Облако сервисов
16
![Page 17: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/17.jpg)
Проблемы
![Page 18: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/18.jpg)
Сеть• TCP / HTTP overhead
• Задержки между виртуальными машинами (используем SR-IOV)
18
![Page 19: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/19.jpg)
Эксплуатация• Больше конфигов
• Больше деплоя
• Больше мониторинга
19
![Page 20: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/20.jpg)
Разработка• Стало проще?
• Усложнение поддержки тестовых и development стендов
• Был один лог - стало много
20
![Page 21: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/21.jpg)
Уникальный идентификатор запроса(request_id)
• Генерируется на nginx (ngx_http_requestid_module)
• Пробрасывается http-заголовком (X-Request-Id) на все сервисы
• Каждая запись в логе содержит request_id
• Все логи сливаем на graylog2
21
![Page 22: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/22.jpg)
Немного про
Python
![Page 23: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/23.jpg)
Frontik
backend1
backend2
backend3
Templating
User request
HTML/JSON
Request Handler
23
![Page 24: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/24.jpg)
Frontikclass Page(page.PageHandler):
@page.user_page(xsl='pages/index.xsl')
def get_page(self):
self.doc.put(
self.get_url('{}/resumes'.format(resumeHost)),
self.get_url('{}/negotiations'.format(negHost))
)
24
![Page 25: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/25.jpg)
25
![Page 26: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/26.jpg)
26
![Page 27: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/27.jpg)
27
![Page 28: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/28.jpg)
28
![Page 29: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/29.jpg)
Frontik• Изначально был заточен под XML/XSLT (сейчас умеет и JSON)
• Работает на нашей патченной Tornado 2.0
(https://github.com/hhru/tornado)
• Требует libcurl, собранный с c-ares
(https://github.com/tornadoweb/tornado/pull/1017)
• Мало документации и примеров
https://github.com/hhru/frontik
29
![Page 30: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/30.jpg)
Что хотелось• Уменьшить количество многоуровневых запросов
• Иметь бо́льшую свободу в выборе шаблонизатора
• Чтобы работало и на upstream Tornado
30
![Page 31: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/31.jpg)
Tortik
![Page 32: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/32.jpg)
Preprocessors
backend1
backend2
backend3
Postprocessors
User request
HTML/JSON or cool debug page
Request Handler
32
![Page 33: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/33.jpg)
Preprocessors• Набор асинхронных обработчиков (например, получение сессии)
• Выполняются до начала выполнения обработчика запроса
def session(handler, callback):
def _session_callback(session):
handler.session = session
callback()
session_client.get_session(_session_callback, ...)
33
![Page 34: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/34.jpg)
Preprocessorsclass MobilePageHandler(tortik.page.RequestHandler):
preprocessors = [
session,
pagedata
]
34
![Page 35: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/35.jpg)
Request Handler• Стандартные обработчики Tornado (get, post, ...) с @asynchronous
• Выходные данные формируются через
self.add('name', data) - аналог self.doc.put() во Frontik'е
• Можно и сразу self.complete({'name': data})
def get(self):
self.add('server_time', int(time.time))
self.add('data', {...})
self.complete()
35
![Page 36: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/36.jpg)
Postprocessors• Набор последовательных обработчиков над выходными данными
• Выполняются после выполнения обработчика запроса
(RequestHandler)
def template(handler, data, callback):
out = template_engine.render(handler.template_name,
data=handler.get_data())
callback(handler, out)
36
![Page 37: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/37.jpg)
Postprocessorsclass MobilePageHandler(tortik.page.RequestHandler):
postprocessors = [
template,
translation
]
37
![Page 38: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/38.jpg)
Отправка запросов на бэкендыself.fetch_requests([
self.make_request(
name='vacancies',
method='GET',
full_url='https://api.hh.ru/vacancies/8252535'),
...
], callback=self.complete)
38
![Page 39: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/39.jpg)
Отправка запросов на бэкендыself.fetch_requests([
('vacancies', 'https://api.hh.ru/vacancies/8252535'),
...
], callback=_cb)
39
![Page 40: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/40.jpg)
Отправка запросов на бэкендыdef _cb():
response = self.responses['vacancies']
data = response.data # json или xml
# плюс автоматический
# self.add('vacancies', response.data)
self.complete()
40
![Page 41: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/41.jpg)
Этапы обработки запроса• получение сессии
• обработка запроса (отправка запросов на сервисы и т.п.)
• шаблонизация
41
![Page 42: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/42.jpg)
Этапы обработки запросаhandler.log.stage_started('render')
# do some hard render stuff
handler.log.stage_complete('render')
42
![Page 43: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/43.jpg)
Этапы обработки запросаhandler.fetch_requests(
...
callback=_cb,
stage='session'
)
43
![Page 44: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/44.jpg)
Этапы обработки запросаMONIK handler=hhmobile.pages.Page method=GET code=200
total=93 session=13.98 page=47.14 render=21.77
translation=7.30
44
![Page 45: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/45.jpg)
Этапы обработки запросаMONIK handler=hhmobile.pages.Page method=GET code=200
total=93 session=13.98 page=47.14 render=21.77
translation=7.30
45
![Page 46: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/46.jpg)
Этапы обработки запросаMONIK handler=hhmobile.pages.Page method=GET code=200
total=93 session=13.98 page=47.14 render=21.77
translation=7.30
46
![Page 47: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/47.jpg)
Этапы обработки запросаMONIK handler=hhmobile.pages.Page method=GET code=200
total=93 session=13.98 page=47.14 render=21.77
translation=7.30
47
![Page 48: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/48.jpg)
Мониторинг
48
![Page 49: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/49.jpg)
Мониторинг
49
![Page 50: Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon RU 2014](https://reader034.vdocuments.pub/reader034/viewer/2022042515/54c5224e4a7959c9708b4577/html5/thumbnails/50.jpg)
Спасибо!Виталий Глибин, HeadHunter
@glibin, glibin.ru
https://github.com/hhru/tortik
https://github.com/hhru/frontik
50