4. Поиск по Интранету
› Десятки сервисов – Вики, Трекер, Код и т.п.
› Сотни миллионов документов
Поиск по сервисам внутри Яндекс Коннект
› Тысячи организаций
Продукты
4
9. 〉Два брокера
› MongoDB – глобальные распределенные
очереди
› Redis – локальные очереди на одной машине
〉Отдельные ноды и очереди для каждой стадии
Celery
9
14. Tornado
› Асинхронный поход в API
› Простая агрегация данных
Django
› Удобное окружение
› ORM
› REST API
Почему Django и Tornado
14
15. Базовый степ
class Step(object):
def get_future(self, state, requester):
"""
Переопределяется в наследниках,
возвращает таску с основной
логикой степа. Не переопределяется для тех,
у кого нет хождений по http
"""
moment = gen.Future()
moment.set_result(None)
return moment
16. @gen.coroutine
def execute(self, state, requester):
""" Метод который запускает выполнение таски
из self.get_future """
if not state.errors:
res = yield self.get_future(state, requester)
self.process_response(state, res)
def process_response(self, state, response):
""" Переопределяется в наследниках.
По умолчанию не делает ничего. """
pass
17. ParallelStep
class ParallelStep(CompoundStep):
@gen.coroutine
def execute(self, state, requester):
steps = self.get_steps(state)
if not state.errors and steps:
responses = yield [step.get_future(state, requester)
for step in steps]
for response, step in zip(responses, steps):
step.process_response(response)]
self.process_response(state, responses)
18. ChainStep
class ChainStep(CompoundStep):
@gen.coroutine
def execute(self, state, requester):
data = []
steps = self.get_steps(state)
for step in steps:
if state.errors:
break
response = yield step.get_future(state, requester)
data.append(response)
step.process_response(state, response)
self.process_response(state, data)
21. 〉Все компоненты в одном образе
〉У компонента свой набор процессов
〉Контроль процессов с помощью supervisord
〉Для разработки docker-compose
Docker
21