Frontik сервер-агрегатор на python. Зачем frontik? I. - презентация

Содержание

Слайд 2

Зачем frontik? I

Зачем frontik?

I

Слайд 3

100% 08:00 20:00

100%

08:00

20:00

Слайд 4

Слайд 5

Яндекс (XScript) Mail.ru (FEST)

Яндекс (XScript)
Mail.ru (FEST)

Слайд 6

Выбрали XScript OpenSource Проверено XSLT

Выбрали XScript
 OpenSource
 Проверено
 XSLT

Слайд 7

100% 08:00 20:00

100%

08:00

20:00

Слайд 8

Минусы XScript XML-based язык агрегации Нет доступа к кишкам HTTP Сложность доработки

Минусы XScript
 XML-based язык агрегации
 Нет доступа к кишкам HTTP
 Сложность доработки

Слайд 9

Что frontik? II

Что frontik?

II

Слайд 10

Основной сценарий использования:

Основной сценарий использования:

Слайд 11

Frontik - application server, основанный на Tornado Web Server Tornado: AsyncHttpServer

Frontik - application server, 
основанный на Tornado Web Server
Tornado:
AsyncHttpServer
один поток

выполнения
ioloop
прием новых соединений 
обработка (handling)
AsyncHttpClient

Как сделано

Слайд 12

диспетчеризация запросов по URL HTTP опрос backend`ов парсинг, обработка и агрегация

диспетчеризация запросов по URL
HTTP опрос backend`ов 
парсинг, обработка и

агрегация xml ответов
XSLT шаблонизация

Где же тут Frontik?

Слайд 13

Реальный пример

Реальный пример

Слайд 14

Как это работает:

Как это работает:

Слайд 15

Фичи от frontik`а 1. app-root/helloworld.py class Page(frontik.page.PageHandler): @set_xsl('helloworld.xsl') def get_page(self, request):

Фичи от frontik`а

1. app-root/helloworld.py
class Page(frontik.page.PageHandler):
@set_xsl('helloworld.xsl')
  def get_page(self, request):   
    res =

etree.Element('hello')
  res.text = 'world'
    self.doc.put(res) 
Слайд 16

Фичи от frontik`а 2. Обработка ответов def cb(xml, response): nodes =

Фичи от frontik`а

2. Обработка ответов
def cb(xml, response): 
    nodes = xpath.Evaluate(..., xml)
 

if not nodes:
        finish('Nothing found!')
    else:
        ... self.get_url(request, cb)
Слайд 17

Фичи от frontik`а 3. Future placeholder = self.get_url(...) self.doc.put(placeholder)

Фичи от frontik`а

3. Future
placeholder = self.get_url(...)
self.doc.put(placeholder)

Слайд 18

Фичи от frontik`а 4. SyncGroups group=frontik.async.AsyncGroup(finish_cb) self.get_url(request1, group.add(cb1)) self.post_url(request2, group.add(cb2))

Фичи от frontik`а

4. SyncGroups
group=frontik.async.AsyncGroup(finish_cb)
self.get_url(request1, group.add(cb1))
self.post_url(request2, group.add(cb2))

Слайд 19

Фичи от frontik`а 5. Главное: простота развития Быстрая и гибкая разработка на python

Фичи от frontik`а

5. Главное: простота развития 
Быстрая и гибкая разработка на python

Слайд 20

Как frontik? III

Как frontik?

III

Слайд 21

→ xslt → xml ответ Этапы трансформации Было: Cтало: → → xml ответ xslt → пост-обработка

→   xslt →

xml ответ

Этапы трансформации

Было:
Cтало:

→           →

xml ответ

xslt → пост-обработка

Слайд 22

Пост-обработка Fuchakubutsu (переводы)

Пост-обработка

Fuchakubutsu
(переводы)

Слайд 23

Пост-обработка ссылки на региональные сайты (200kb xml, 7k nodes)

Пост-обработка

ссылки на региональные сайты
(200kb xml, 7k nodes)

Слайд 24

Кэш Было: поиск → загрузка найденного → XSLT → результат Cтало:

Кэш

 
Было:
поиск → загрузка найденного → XSLT → результат
Cтало:
поиск →

memcached →                       → XSLT→ результат

дозагрузка ненайденого в кеше

Слайд 25

Дублирование кода верстки обвязка сайта (jsp vs. xslt)

Дублирование кода верстки

обвязка сайта (jsp vs. xslt)

Слайд 26

Обвязка сайта Было: browser ↔ jsp Cтало: browser ↔ frontik ↔ jsp

Обвязка сайта

Было:
browser   ↔ jsp
Cтало:
browser ↔ frontik ↔ jsp

Слайд 27

Проблемные места (они же — планы развития) Один процесс — однин

Проблемные места (они же — планы развития)

 
Один процесс — однин тред

— одно ядро процессора
Блокировка обслуживания на время вычислений 
Отсутствие стриминга
Спагетти-код