2015-12-06 Антон Тарасенко - Ваш следующий сервис будет...

28
Ваш следующий сервис будет асинхронным Антон Тарасенко

Transcript of 2015-12-06 Антон Тарасенко - Ваш следующий сервис будет...

Page 1: 2015-12-06 Антон Тарасенко - Ваш следующий сервис будет асинхронным

Ваш следующий сервис будет асинхронным

Антон Тарасенко

Page 2: 2015-12-06 Антон Тарасенко - Ваш следующий сервис будет асинхронным

I Мотивация

Page 3: 2015-12-06 Антон Тарасенко - Ваш следующий сервис будет асинхронным

Native Threads

vs

Event-driven Architecture

Page 4: 2015-12-06 Антон Тарасенко - Ваш следующий сервис будет асинхронным

Мотивация

● CompletableFuture в Java 8.● Цепочки асинхронных операций.● Альтернативы: Scala Future, Finagle Future и

даже Guava ListenableFuture.● Теперь не нужны сторонние зависимости.● На Java все еще нет легковесного решения. ● Асинхронные приложения - в массы.

Page 5: 2015-12-06 Антон Тарасенко - Ваш следующий сервис будет асинхронным

Накладные расходы на CompletableFuture

https://github.com/zymosi3/java-async-benchmark

Page 6: 2015-12-06 Антон Тарасенко - Ваш следующий сервис будет асинхронным

The Reactive Manifesto

http://www.reactivemanifesto.org/

Page 7: 2015-12-06 Антон Тарасенко - Ваш следующий сервис будет асинхронным

II Решение

Page 8: 2015-12-06 Антон Тарасенко - Ваш следующий сервис будет асинхронным

Service и Pipeline

● Service - это конфигурируемая сущность, выполняющая одну функцию.

● Function<Context, CompletableFuture<Context>>● Pipeline - это композиция сервисов● И Pipeline - это тоже Service● Каждая функция приложения представлена одним

Pipeline● Нет зависимости от протокола входящих/исходящих

запросов и ответов.

Page 9: 2015-12-06 Антон Тарасенко - Ваш следующий сервис будет асинхронным

Context

● Состояние запроса● Контракт сервисов● Сознательно используем mutable структуру● Контракт не проверяется на этапе компиляции● По сравнению со статическим связыванием

memory footprint может быть даже уменьшен

Page 10: 2015-12-06 Антон Тарасенко - Ваш следующий сервис будет асинхронным

Пример: передача управления

Page 11: 2015-12-06 Антон Тарасенко - Ваш следующий сервис будет асинхронным

Пример: Get User Pipeline

Page 12: 2015-12-06 Антон Тарасенко - Ваш следующий сервис будет асинхронным

Конфигурация

● Используем typesafe config. https://github.com/typesafehub/config

● Каждый сервис получает свою часть конфигурации при создании.

● Рекофигурация без перезапуска.● Сервис может переопределить стандартную

логику реконфигурации.● Файлы конфигурации хранятся в zookeeper.

Page 13: 2015-12-06 Антон Тарасенко - Ваш следующий сервис будет асинхронным

Плагины

● Дополнение и добавление функциональности к сервису.● Используется только одна обертка.● Точки расширения: до вызова, после, реконфигурация.

getUserService { plugins { ReconfigurationPlugin { lockOnReconfig: true } TimerPlugin { timerName : getUserRemote.time } TimeoutPlugin {} } class: net.thumbtack.doorkeeper.application.service.GetUserService apiHost: localhost apiPort: 8080}

Page 14: 2015-12-06 Антон Тарасенко - Ваш следующий сервис будет асинхронным

Обработка ошибок

● Любое исключение прерывает Pipeline.● Исключение сохраняется в контексте.● Результат прерванного Pipeline - контекст с

ошибкой.

Page 15: 2015-12-06 Антон Тарасенко - Ваш следующий сервис будет асинхронным

Таймауты

● Context содержит время начала и значение таймаута.

● 2 подхода: внешняя и внутренняя обработка.● По умолчанию - внутренняя.● Внешняя - конфигурируемо.

Page 16: 2015-12-06 Антон Тарасенко - Ваш следующий сервис будет асинхронным

HTTP Server & Client

● Асинхронный HTTP-сервер на netty.● Роутинг URL на Pipeline.● Асинхронный HTTP-клиент на netty.● Можно использовать для внутрикластерных

или сторонних вызовов.

Page 17: 2015-12-06 Антон Тарасенко - Ваш следующий сервис будет асинхронным

Метрики

● Dropwizard metrics http://metrics.dropwizard.io/

● Контекст содержит MetricRegistry● TimerPlugin и CounterPlugin

Page 18: 2015-12-06 Антон Тарасенко - Ваш следующий сервис будет асинхронным

Request tracking

● Контекст содержит GUID.● GUID должен быть сквозным во всей системе.

Page 19: 2015-12-06 Антон Тарасенко - Ваш следующий сервис будет асинхронным

Spring

● Все сервисы - это бины.● Точнее прототипы бинов.● Удобно управлять межсервисными

зависимостями.

Page 20: 2015-12-06 Антон Тарасенко - Ваш следующий сервис будет асинхронным

Планы

● Инструменты управления приложением● Отладочная информация в ответе● Приоритизация трафика● Тротлинг● Межпроцессное взаимодействие● Балансировка нагрузки

Page 21: 2015-12-06 Антон Тарасенко - Ваш следующий сервис будет асинхронным

III Альтернативы

Page 22: 2015-12-06 Антон Тарасенко - Ваш следующий сервис будет асинхронным

Сравнение: RXJava

● Мультиплатформенная реализация паттерна Observable

● Есть несколько инструментов построенных на ней.

● Дает большие накладные расходы чем CompletableFuture.

Page 23: 2015-12-06 Антон Тарасенко - Ваш следующий сервис будет асинхронным

Сравнение: finagle

● Почти весь API не зависит от сетевого протокола

● Futures● Servers и Clients● Services и Filters● Трассировка, мониторинг и статистика,

балансировка нагрузки.

Page 24: 2015-12-06 Антон Тарасенко - Ваш следующий сервис будет асинхронным

Сравнение: akka + akka-http

● Java/Scala API.● Модель акторов, вдохновленная Erlang.● Просто создавать конкурентные и распределенные

системы.● Позволяет строить надежные системы.● Мощная конфигурирация через Typesafe Config.● Управляемый жизненный цикл компонент(акторов).● Утилиты для мониторинга actor-system.● “Заражает” дизайн системы моделью акторов.● Реализация синхронных сценариев представляет

проблему.

Page 25: 2015-12-06 Антон Тарасенко - Ваш следующий сервис будет асинхронным

Сравнение: akka + akka-http

● Проект развился на основе Spray.● До сих пор является экспериментальным модулем.● Предоставляет низкоуровненвый и высокоуровневый API.● Удобные пайплайны через akka-streams.● Монструозный DSL для роутинга, ломающий парсеры,

статические анализаторы и психику разработчика.● Из-за akka-streams сложно отлаживать и понимать что

происходит на уровне акторов.● Разработчики заявляют о феноменальной

производительности, однако воспроизвести их результаты публично пока никто не смог

Page 26: 2015-12-06 Антон Тарасенко - Ваш следующий сервис будет асинхронным

IV Заключение

Page 27: 2015-12-06 Антон Тарасенко - Ваш следующий сервис будет асинхронным

Наши проекты

● Интерфейс к высоконагруженному хранилищу данных (60-80k qps, <2ms).

● Сервис обогащения рекламных запросов (50k-60k qps, <3ms)

● AdServer (20k-30k qps, <50ms, запросы через сеть <40ms)

Page 28: 2015-12-06 Антон Тарасенко - Ваш следующий сервис будет асинхронным

Вопросы?

Антон Тарасенко