3. Обычный сайт (монолитная архитектура)
/index
View
DB
Controller
Получить сессию
Загрузить отклики
…
Загрузить список резюме
3
4. Проблемы
1. Один репозиторий, много разработчиков
2. Рост кодовой базы
3. Ограничения в использовании языка программирования
4. Внешние подрядчики
5. ... to be counted
4
5. Сервис-ориентированная архитектура
(SOA)
модульный подход к разработке программного обеспечения,
основанный на использовании распределённых, слабо связанных
заменяемых компонентов со стандартизированными интерфейсами и
протоколам взаимодействия.
Источник: Wikipedia
5
7. Компонент системы в разработке
• Один сервис - один репозиторий
• Свобода выбора языка программирования
• Возможность отдать на аутсорс
7
8. Контролируемая деградация
• Лучше показать часть информации, чем упасть с 500
• Лучше показать самое важное за 100мс—1с, чем все за 10 секунд
8
9.
10.
11. Почему это важно
• 47% людей ожидают, что страница будет загружаться менее двух
секунд
• 40% закрывают страницу, если она загружается более трех секунд
• 52% считают важным скорость загрузки страницы
Источник: Akamai
11
12.
13. Разные требования к сервисам
• Не все сервисы должны работать под большой нагрузкой
• Некоторые могут и "полежать"
• Оптимизируем только там, где это нужно
13
14. Виртуализация
• На одной машине один сервис
• Легче мониторить
• Легче деплоить
• Можно добавлять/удалять машины по необходимости
14
20. Разработка
• Стало проще?
• Усложнение поддержки тестовых и development стендов
• Был один лог - стало много
20
21. Уникальный идентификатор запроса
(request_id)
• Генерируется на nginx (ngx_http_requestid_module)
• Пробрасывается http-заголовком (X-Request-Id) на все сервисы
• Каждая запись в логе содержит request_id
• Все логи сливаем на graylog2
21
29. 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
30. Что хотелось
• Уменьшить количество многоуровневых запросов
• Иметь бо́льшую свободу в выборе шаблонизатора
• Чтобы работало и на upstream Tornado
30
35. 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
36. Postprocessors
• Набор последовательных обработчиков над выходными данными
• Выполняются после выполнения обработчика запроса
(RequestHandler)
def template(handler, data, callback):
out = template_engine.render(handler.template_name,
data=handler.get_data())
callback(handler, out)
36