SlideShare a Scribd company logo
Reactive Streams
Алексей Романчук
2
Обо мне
10k msg/s
4
Эволюция backendов
DBApp
5
Эволюция backendов
DB
API
Storage
Cache
App
App
Высокопроизводительный
backend
60мс
8
60мс
• парсинг запроса - 1мс
8
60мс
• парсинг запроса - 1мс
• проверка в кеше - 2мс
8
60мс
• парсинг запроса - 1мс
• проверка в кеше - 2мс
• запрос в БД - 30мс
8
60мс
• парсинг запроса - 1мс
• проверка в кеше - 2мс
• запрос в БД - 30мс
• запрос в АПИ - 25мс
8
60мс
• парсинг запроса - 1мс
• проверка в кеше - 2мс
• запрос в БД - 30мс
• запрос в АПИ - 25мс
• формирование ответа - 2мс
8
60мс
9
10
Синхронная модель
• Отдельный поток
10
Синхронная модель
• Отдельный поток
• 95% ожидает
10
Синхронная модель
• Отдельный поток
• 95% ожидает
• Занимает ресурсы
10
Синхронная модель
11
Ожидание
12
Асинхронная модель
• Обработка в разных потоках
12
Асинхронная модель
• Обработка в разных потоках
• Потоки не простаивают
12
Асинхронная модель
• Обработка в разных потоках
• Потоки не простаивают
• Эффективное использование ресурсов
12
Асинхронная модель
13
Асинхронные границы везде
• БД
13
Асинхронные границы везде
• БД
• Внешние API
13
Асинхронные границы везде
• БД
• Внешние API
• Сеть
13
Асинхронные границы везде
• БД
• Внешние API
• Сеть
• Взаимодействие с другими потокам
13
Асинхронные границы везде
14
Асинхронность это сложно
• Композиция
14
Асинхронность это сложно
• Композиция
• Ветвление
14
Асинхронность это сложно
• Композиция
• Ветвление
• Обработка ошибок
14
Асинхронность это сложно
• Композиция
• Ветвление
• Обработка ошибок
• Backpressure
14
Асинхронность это сложно
15
Асинхронность это сложно
16
Асинхронность это сложно
17
Асинхронность это сложно
18
Модели
• Mutex, semaphore, etc
18
Модели
• Mutex, semaphore, etc
• Green threads
18
Модели
• Mutex, semaphore, etc
• Green threads
• Future-Promise
18
Модели
• Mutex, semaphore, etc
• Green threads
• Future-Promise
• Потоки данных
18
Модели
Потоки
20
“В одну реку нельзя войти
дважды”
22
Потоки данных
• Множество сообщений одного типа
22
Потоки данных
• Множество сообщений одного типа
• Зависит от времени начала наблюдения
22
Потоки данных
• Множество сообщений одного типа
• Зависит от времени начала наблюдения
• Может не иметь ни начала ни конца
22
Потоки данных
23
Потоки вокруг нас
• curl twitter.com | grep CodeFest | wc -n
23
Потоки вокруг нас
• curl twitter.com | grep CodeFest | wc -n
• сетевые соединения
23
Потоки вокруг нас
• curl twitter.com | grep CodeFest | wc -n
• сетевые соединения
• звук и видео
23
Потоки вокруг нас
• curl twitter.com | grep CodeFest | wc -n
• сетевые соединения
• звук и видео
• запросы и ответы сервера
23
Потоки вокруг нас
24
Backend
Запрос Ответ
МАГИЯЗапросЗапрос ОтветОтвет
25
26
Backend
26
Backend
26
Backend
Парсинг БД API Ответ
26
Backend
Парсинг БД API Ответ
26
Backend
Парсинг БД API Ответ
26
Backend
Парсинг БД API Ответ
26
Backend
Парсинг БД API Ответ
26
Backend
Парсинг БД API Ответ
Парсинг БД API Ответ
26
Backend
Парсинг БД API Ответ
Парсинг БД API Ответ
26
Backend
Парсинг БД API Ответ
Парсинг БД API Ответ
26
Backend
Парсинг БД API Ответ
Парсинг БД API Ответ
27
Backend
Парсинг БД API Ответ
Парсинг БД API Ответ
28
Потоки данных
Парсинг БД API Ответ
28
Потоки данных
Парсинг БД API Ответ
28
Потоки данных
Парсинг БД API Ответ
28
Потоки данных
Парсинг БД API Ответ
28
Потоки данных
Парсинг БД API Ответ
29
Преимущества
• Простые асинхронные границы
29
Преимущества
• Простые асинхронные границы
• Картина в целом
29
Преимущества
• Простые асинхронные границы
• Картина в целом
• Параллельное программирование
29
Преимущества
• Простые асинхронные границы
• Картина в целом
• Параллельное программирование
• Ошибки и завершение
29
Преимущества
Backpressure
31
Событий слишком много
31
Событий слишком много
Отправитель
31
Событий слишком много
Отправитель Получатель
31
Событий слишком много
Отправитель Получатель
32
Событий слишком много
Отправитель Получатель
33
Событий слишком много
Отправитель Получатель
34
Событий слишком много
Отправитель Получатель
35
Событий слишком много
Отправитель Получатель
36
Событий слишком много
Отправитель Получатель
37
Событий слишком много
Отправитель Получатель
38
Событий слишком много
Отправитель Получатель
39
Блокирующий вызов
Отправитель Получатель
39
Блокирующий вызов
Отправитель Получатель
39
Блокирующий вызов
Отправитель Получатель
40
Pull
Отправитель Получатель
40
Pull
Отправитель Получатель
40
Pull
Отправитель Получатель
41
Negative Acknowledge
Отправитель Получатель
41
Negative Acknowledge
Отправитель Получатель
41
Negative Acknowledge
Отправитель Получатель
42
Negative Acknowledge
Отправитель Получатель
43
Dynamic pull-push
Отправитель Получатель
43
Dynamic pull-push
Отправитель Получатель
4
44
Dynamic pull-push
4
Отправитель Получатель
45
Dynamic pull-push
3
Отправитель Получатель
46
Dynamic pull-push
3
Отправитель Получатель
47
Dynamic pull-push
0
Отправитель Получатель
48
Dynamic pull-push
0
Отправитель Получатель
49
Dynamic pull-push
0
Отправитель Получатель
49
Dynamic pull-push
0
Отправитель Получатель
2
50
Dynamic pull-push
2
Отправитель Получатель
51
Dynamic pull-push
0
Отправитель Получатель
52
Все в сборе
ОтветБДПарсинг
52
Все в сборе
ОтветБДПарсинг
52
Все в сборе
ОтветБДПарсинг
52
Все в сборе
ОтветБДПарсинг
52
Все в сборе
ОтветБДПарсинг
52
Все в сборе
ОтветБДПарсинг
52
Все в сборе
ОтветБДПарсинг
52
Все в сборе
Reactive Streams
54
Reactive Streams
• Спецификация
54
Reactive Streams
• Спецификация
• Асинхронного взаимодействия
54
Reactive Streams
• Спецификация
• Асинхронного взаимодействия
• Упорядоченные сообщения
54
Reactive Streams
• Спецификация
• Асинхронного взаимодействия
• Упорядоченные сообщения
• Обратная связь
54
Reactive Streams
55
Реализации
• RxJava
55
Реализации
• RxJava
• Akka Stream
55
Реализации
• RxJava
• Akka Stream
• Reactor
55
Реализации
• RxJava
• Akka Stream
• Reactor
• Ratpack
55
Реализации
“Talk is cheap,
show me the code”
57
Akka Stream
• Reactive Stream
57
Akka Stream
• Reactive Stream
• Dynamic pull-push model
57
Akka Stream
• Reactive Stream
• Dynamic pull-push model
• Scala, Java
57
Akka Stream
• Reactive Stream
• Dynamic pull-push model
• Scala, Java
• Статическая типизация
57
Akka Stream
• Reactive Stream
• Dynamic pull-push model
• Scala, Java
• Статическая типизация
• Модель акторов
57
Akka Stream
* <dl>

* <dt><b>Scheduler:</b></dt>

* <dd>you specify which {@link Scheduler} this operator will use</dd>

* </dl>

*

* @param notificationHandler

* receives an Observable of notifications with which a user can complete or error, aborting the repeat.

* @param scheduler

* the {@link Scheduler} to emit the items on

* @return the source Observable modified with repeat logic

* @see <a href="http://reactivex.io/documentation/operators/repeat.html">ReactiveX operators documentation: Repeat</a>

*/

public final Observable<T> repeatWhen(final Func1<? super Observable<? extends Void>, ? extends Observable<?>> notificationHandler, Scheduler scheduler) {

Func1<? super Observable<? extends Notification<?>>, ? extends Observable<?>> dematerializedNotificationHandler = new Func1<Observable<? extends Notification<?>>, Observable<?>>()
@Override

public Observable<?> call(Observable<? extends Notification<?>> notifications) {

return notificationHandler.call(notifications.map(new Func1<Notification<?>, Void>() {

@Override

public Void call(Notification<?> notification) {

return null;

}

}));

}

};

return OnSubscribeRedo.repeat(this, dematerializedNotificationHandler, scheduler);

}



/**

* Returns an Observable that emits the same values as the source Observable with the exception of an

* {@code onCompleted}. An {@code onCompleted} notification from the source will result in the emission of

* a {@code void} item to the Observable provided as an argument to the {@code notificationHandler}

* function. If that Observable calls {@code onComplete} or {@code onError} then {@code repeatWhen} will

* call {@code onCompleted} or {@code onError} on the child subscription. Otherwise, this Observable will

* resubscribe to the source observable.

* <p>

* <img width="640" height="430" src="https://raw.github.com/wiki/ReactiveX/RxJava/images/rx-operators/repeatWhen.f.png" alt="">

* <dl>

* <dt><b>Scheduler:</b></dt>

* <dd>{@code repeatWhen} operates by default on the {@code trampoline} {@link Scheduler}.</dd>

* </dl>

*

* @param notificationHandler

* receives an Observable of notifications with which a user can complete or error, aborting the repeat.

* @return the source Observable modified with repeat logic

* @see <a href="http://reactivex.io/documentation/operators/repeat.html">ReactiveX operators documentation: Repeat</a>

*/

public final Observable<T> repeatWhen(final Func1<? super Observable<? extends Void>, ? extends Observable<?>> notificationHandler) {

Func1<? super Observable<? extends Notification<?>>, ? extends Observable<?>> dematerializedNotificationHandler = new Func1<Observable<? extends Notification<?>>, Observable<?>>()
@Override

public Observable<?> call(Observable<? extends Notification<?>> notifications) {

return notificationHandler.call(notifications.map(new Func1<Notification<?>, Void>() {

@Override

public Void call(Notification<?> notification) {

return null;

}

}));

}

};

return OnSubscribeRedo.repeat(this, dematerializedNotificationHandler);

}
/**

* An Observable that never sends any information to an {@link Observer}.

* This Observable is useful primarily for testing purposes.

*

* @param <T>

* the type of item (not) emitted by the Observable

*/

private static class NeverObservable<T> extends Observable<T> {

public NeverObservable() {

super(new OnSubscribe<T>() {



@Override

public void call(Subscriber<? super T> observer) {

// do nothing

}



});

}

}



/**

* An Observable that invokes {@link Observer#onError onError} when the {@link Observer} subscribes to it.

*

* @param <T>

* the type of item (ostensibly) emitted by the Observable

*/

private static class ThrowObservable<T> extends Observable<T> {



public ThrowObservable(final Throwable exception) {

super(new OnSubscribe<T>() {



/**

* Accepts an {@link Observer} and calls its {@link Observer#onError onError} method.

*

* @param observer

* an {@link Observer} of this Observable

*/

@Override

/**

* Operator function for lifting into an Observable.

*/

public interface Operator<R, T> extends Func1<Subscriber<? super R>, Subscriber<? super T>> {

// cover for generics insanity

}

/**

* Lifts a function to the current Observable and returns a new Observable that when subscribed to will pass

* the values of the current Observable through the Operator function.

* <p>

* In other words, this allows chaining Observers together on an Observable for acting on the values within

* the Observable.

* <p> {@code

* observable.map(...).filter(...).take(5).lift(new OperatorA()).lift(new OperatorB(...)).subscribe()

* }

* <p>

* If the operator you are creating is designed to act on the individual items emitted by a source

* Observable, use {@code lift}. If your operator is designed to transform the source Observable as a whole

* (for instance, by applying a particular set of existing RxJava operators to it) use {@link #compose}.

* <dl>

* <dt><b>Scheduler:</b></dt>

* <dd>{@code lift} does not operate by default on a particular {@link Scheduler}.</dd>

* </dl>

*

* @param lift the Operator that implements the Observable-operating function to be applied to the source

* Observable

* @return an Observable that is the result of applying the lifted Operator to the source Observable

* @see <a href="https://github.com/ReactiveX/RxJava/wiki/Implementing-Your-Own-Operators">RxJava wiki: Implementing Your Own Operators</a>

*/

public final <R> Observable<R> lift(final Operator<? extends R, ? super T> lift) {

return new Observable<R>(new OnSubscribe<R>() {

@Override

public void call(Subscriber<? super R> o) {

try {

Subscriber<? super T> st = hook.onLift(lift).call(o);

try {

// new Subscriber created and being subscribed with so 'onStart' it

st.onStart();

onSubscribe.call(st);

} catch (Throwable e) {

// localized capture of errors rather than it skipping all operators 

// and ending up in the try/catch of the subscribe method which then

// prevents onErrorResumeNext and other similar approaches to error handling

if (e instanceof OnErrorNotImplementedException) {

throw (OnErrorNotImplementedException) e;

}

st.onError(e);

}

} catch (Throwable e) {

if (e instanceof OnErrorNotImplementedException) {

throw (OnErrorNotImplementedException) e;

}

// if the lift function failed all we can do is pass the error to the final Subscriber

// as we don't have the operator available to us

o.onError(e);

}

}

});

}

/**

* Transform an Observable by applying a particular Transformer function to it.

* <p>

* This method operates on the Observable itself whereas {@link #lift} operates on the Observable's

* Subscribers or Observers.

* <p>

* If the operator you are creating is designed to act on the individual items emitted by a source

* Observable, use {@link #lift}. If your operator is designed to transform the source Observable as a whole

* (for instance, by applying a particular set of existing RxJava operators to it) use {@code compose}.

* <dl>

* <dt><b>Scheduler:</b></dt>

* <dd>{@code compose} does not operate by default on a particular {@link Scheduler}.</dd>

* </dl>

*

* @param transformer implements the function that transforms the source Observable

* @return the source Observable, transformed by the transformer function

* @see <a href="https://github.com/ReactiveX/RxJava/wiki/Implementing-Your-Own-Operators">RxJava wiki: Implementing Your Own Operators</a>

*/

@SuppressWarnings("unchecked")

public <R> Observable<R> compose(Transformer<? super T, ? extends R> transformer) {

return ((Transformer<T, R>) transformer).call(this);

}

/**

* Transformer function used by {@link #compose}.

* @warn more complete description needed

*/

public static interface Transformer<T, R> extends Func1<Observable<T>, Observable<R>> {

// cover for generics insanity

}





/* *********************************************************************************************************

* Operators Below Here

* *********************************************************************************************************

59
Ключевые абстракции
59
Ключевые абстракции
Source
59
Ключевые абстракции
Flow
59
Ключевые абстракции
Sink
60
Ключевые абстракции
Source SinkFlow
61
Source
val iterableSource = Source(1 to 50)

val tickSource = Source(1 second, 1 second, "Tick")

val singleSource = Source.single("CodeFest")

val emptySource = Source.empty()

val zmqSource = ???
62
Sink
val blackhole = Sink.ignore

val onComplete = Sink.onComplete { result =>

System.exit(0)

}

val foreach = Sink.foreach(println)

val firstElement = Sink.head[Int]
63
Flow
implicit val as = ActorSystem("CodeFest")

implicit val materializer = ActorFlowMaterializer()



val source = Source(1 to 50)

val sink = Sink.foreach[Int](println)

val flow = source.to(sink)

flow.run()
63
Flow
implicit val as = ActorSystem("CodeFest")

implicit val materializer = ActorFlowMaterializer()



val source = Source(1 to 50)

val sink = Sink.foreach[Int](println)

val flow = source.to(sink)

flow.run()
63
Flow
implicit val as = ActorSystem("CodeFest")

implicit val materializer = ActorFlowMaterializer()



val source = Source(1 to 50)

val sink = Sink.foreach[Int](println)

val flow = source.to(sink)

flow.run()
63
Flow
implicit val as = ActorSystem("CodeFest")

implicit val materializer = ActorFlowMaterializer()



val source = Source(1 to 50)

val sink = Sink.foreach[Int](println)

val flow = source.to(sink)

flow.run()
63
Flow
implicit val as = ActorSystem("CodeFest")

implicit val materializer = ActorFlowMaterializer()



val source = Source(1 to 50)

val sink = Sink.foreach[Int](println)

val flow = source.to(sink)

flow.run()
63
Flow
implicit val as = ActorSystem("CodeFest")

implicit val materializer = ActorFlowMaterializer()



val source = Source(1 to 50)

val sink = Sink.foreach[Int](println)

val flow = source.to(sink)

flow.run()
63
Flow
implicit val as = ActorSystem("CodeFest")

implicit val materializer = ActorFlowMaterializer()



val source = Source(1 to 50)

val sink = Sink.foreach[Int](println)

val flow = source.to(sink)

flow.run()
64
Flow
val flow2 = source

.map { x => x * 2 }

.filter { x => x % 3 == 0 }

.to(sink)

flow2.run()
64
Flow
val flow2 = source

.map { x => x * 2 }

.filter { x => x % 3 == 0 }

.to(sink)

flow2.run()
64
Flow
val flow2 = source

.map { x => x * 2 }

.filter { x => x % 3 == 0 }

.to(sink)

flow2.run()
64
Flow
val flow2 = source

.map { x => x * 2 }

.filter { x => x % 3 == 0 }

.to(sink)

flow2.run()
65
Flow
val source = Source(1 to 50)

val sink = Sink.foreach[String](println)



val flow2 = source

.map { x => x.toString }

.map { x => x / 13 }

.to(sink)

flow2.run()
65
Flow
val source = Source(1 to 50)

val sink = Sink.foreach[String](println)



val flow2 = source

.map { x => x.toString }

.map { x => x / 13 }

.to(sink)

flow2.run()
66
Flow
Парсинг БД API Ответ
67
Flow
val request: Source[Request] = ???

def parser: Request => Query = ???

def dbCall: Query => Future[List[Int]] = ???

def apiCall: List[Int] => Future[List[String]] = ???

def buildResponse: List[String] => Response = ???
67
Flow
val request: Source[Request] = ???

def parser: Request => Query = ???

def dbCall: Query => Future[List[Int]] = ???

def apiCall: List[Int] => Future[List[String]] = ???

def buildResponse: List[String] => Response = ???
67
Flow
val request: Source[Request] = ???

def parser: Request => Query = ???

def dbCall: Query => Future[List[Int]] = ???

def apiCall: List[Int] => Future[List[String]] = ???

def buildResponse: List[String] => Response = ???
67
Flow
val request: Source[Request] = ???

def parser: Request => Query = ???

def dbCall: Query => Future[List[Int]] = ???

def apiCall: List[Int] => Future[List[String]] = ???

def buildResponse: List[String] => Response = ???
67
Flow
val request: Source[Request] = ???

def parser: Request => Query = ???

def dbCall: Query => Future[List[Int]] = ???

def apiCall: List[Int] => Future[List[String]] = ???

def buildResponse: List[String] => Response = ???
67
Flow
val request: Source[Request] = ???

def parser: Request => Query = ???

def dbCall: Query => Future[List[Int]] = ???

def apiCall: List[Int] => Future[List[String]] = ???

def buildResponse: List[String] => Response = ???
67
Flow
val request: Source[Request] = ???

def parser: Request => Query = ???

def dbCall: Query => Future[List[Int]] = ???

def apiCall: List[Int] => Future[List[String]] = ???

def buildResponse: List[String] => Response = ???
67
Flow
val request: Source[Request] = ???

def parser: Request => Query = ???

def dbCall: Query => Future[List[Int]] = ???

def apiCall: List[Int] => Future[List[String]] = ???

def buildResponse: List[String] => Response = ???
val flow3 = request

.map(parser)

.mapAsync(dbCall)

.mapAsync(apiCall)

.map(buildResponse)

.to(response)
67
Flow
val request: Source[Request] = ???

def parser: Request => Query = ???

def dbCall: Query => Future[List[Int]] = ???

def apiCall: List[Int] => Future[List[String]] = ???

def buildResponse: List[String] => Response = ???
val flow3 = request

.map(parser)

.mapAsync(dbCall)

.mapAsync(apiCall)

.map(buildResponse)

.to(response)
67
Flow
val request: Source[Request] = ???

def parser: Request => Query = ???

def dbCall: Query => Future[List[Int]] = ???

def apiCall: List[Int] => Future[List[String]] = ???

def buildResponse: List[String] => Response = ???
val flow3 = request

.map(parser)

.mapAsync(dbCall)

.mapAsync(apiCall)

.map(buildResponse)

.to(response)
67
Flow
val request: Source[Request] = ???

def parser: Request => Query = ???

def dbCall: Query => Future[List[Int]] = ???

def apiCall: List[Int] => Future[List[String]] = ???

def buildResponse: List[String] => Response = ???
val flow3 = request

.map(parser)

.mapAsync(dbCall)

.mapAsync(apiCall)

.map(buildResponse)

.to(response)
67
Flow
val request: Source[Request] = ???

def parser: Request => Query = ???

def dbCall: Query => Future[List[Int]] = ???

def apiCall: List[Int] => Future[List[String]] = ???

def buildResponse: List[String] => Response = ???
val flow3 = request

.map(parser)

.mapAsync(dbCall)

.mapAsync(apiCall)

.map(buildResponse)

.to(response)
67
Flow
val request: Source[Request] = ???

def parser: Request => Query = ???

def dbCall: Query => Future[List[Int]] = ???

def apiCall: List[Int] => Future[List[String]] = ???

def buildResponse: List[String] => Response = ???
val flow3 = request

.map(parser)

.mapAsync(dbCall)

.mapAsync(apiCall)

.map(buildResponse)

.to(response)
67
Flow
val request: Source[Request] = ???

def parser: Request => Query = ???

def dbCall: Query => Future[List[Int]] = ???

def apiCall: List[Int] => Future[List[String]] = ???

def buildResponse: List[String] => Response = ???
val flow3 = request

.map(parser)

.mapAsync(dbCall)

.mapAsync(apiCall)

.map(buildResponse)

.to(response)
67
Flow
val request: Source[Request] = ???

def parser: Request => Query = ???

def dbCall: Query => Future[List[Int]] = ???

def apiCall: List[Int] => Future[List[String]] = ???

def buildResponse: List[String] => Response = ???
val flow3 = request

.map(parser)

.mapAsync(dbCall)

.mapAsync(apiCall)

.map(buildResponse)

.to(response)
68
Применения
• MQ
68
Применения
• MQ
• Потоки данных (события, метрики, файлы, видео)
68
Применения
• MQ
• Потоки данных (события, метрики, файлы, видео)
• UI
68
Применения
• MQ
• Потоки данных (события, метрики, файлы, видео)
• UI
• Очереди задач
68
Применения
69
Adopters
• C#
• Java, Scala
• JavaScript
• Objective-C
• Python
• Ruby
• PHP
70
Языки программирования
Мир изменился
Вопросы?
al.romanchuk@2gis.ru @1esha
• Reactive Streams
• Akka Stream
• Reactor
• Ratpack
• RxJava
• Reactive Manifesto
73
Ссылки
• Akka HTTP
• RxMongo
• https://github.com/pkinsky/akka-streams-example
74
Ссылки
• Reactive Extensions
• Reactive Extensions for JavaScript
• Reactive Cocoa
• Rx.py
• Rx.rb
• Rx.php
75
Ссылки
• drop, take
• group, mapConcat
• grouped, flatten
• buffer, conflate, expand
76
Flow
• Balance, Broadcast, Merge
• Zip, Unzip
• FlexiMerge, FlexiRoute
77
Graph

More Related Content

What's hot

A step-by-step approach toward high quality OutOfMemoryError analysis
A step-by-step approach toward high quality OutOfMemoryError analysisA step-by-step approach toward high quality OutOfMemoryError analysis
A step-by-step approach toward high quality OutOfMemoryError analysis
Vladimir Sitnikov
 
Implement your own profiler with blackjack and fun
Implement your own profiler with blackjack and funImplement your own profiler with blackjack and fun
Implement your own profiler with blackjack and fun
Vladimir Sitnikov
 
Автоматизация тестирования клиентской производительности / Николай Лавлинский...
Автоматизация тестирования клиентской производительности / Николай Лавлинский...Автоматизация тестирования клиентской производительности / Николай Лавлинский...
Автоматизация тестирования клиентской производительности / Николай Лавлинский...
Ontico
 
Подводные камни в нагрузочном тестировании
Подводные камни в нагрузочном тестированииПодводные камни в нагрузочном тестировании
Подводные камни в нагрузочном тестировании
Vladimir Sitnikov
 
Высокопроизводительная и отказоустойчивая архитектура фронтальных систем / Ма...
Высокопроизводительная и отказоустойчивая архитектура фронтальных систем / Ма...Высокопроизводительная и отказоустойчивая архитектура фронтальных систем / Ма...
Высокопроизводительная и отказоустойчивая архитектура фронтальных систем / Ма...
Ontico
 
Разбор сложных случаев OutOfMemoryError
Разбор сложных случаев OutOfMemoryErrorРазбор сложных случаев OutOfMemoryError
Разбор сложных случаев OutOfMemoryError
Vladimir Sitnikov
 
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов НиколайnoBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
Ontico
 
Regular expressions
Regular expressionsRegular expressions
Regular expressions
Vladimir Sitnikov
 
Виртуализированные сетевые сервисы на line rate в серверном окружении / Алекс...
Виртуализированные сетевые сервисы на line rate в серверном окружении / Алекс...Виртуализированные сетевые сервисы на line rate в серверном окружении / Алекс...
Виртуализированные сетевые сервисы на line rate в серверном окружении / Алекс...
Ontico
 
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
Ontico
 
Zabbix 3.2 - мониторинг качественно нового уровня / Алексей Владышев (Zabbix)
Zabbix 3.2 - мониторинг качественно нового уровня / Алексей Владышев (Zabbix)Zabbix 3.2 - мониторинг качественно нового уровня / Алексей Владышев (Zabbix)
Zabbix 3.2 - мониторинг качественно нового уровня / Алексей Владышев (Zabbix)
Ontico
 
PostgreSQL и JDBC: выжимаем все соки
PostgreSQL и JDBC: выжимаем все сокиPostgreSQL и JDBC: выжимаем все соки
PostgreSQL и JDBC: выжимаем все соки
Vladimir Sitnikov
 
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
Ontico
 
"Fault tolerant workflow orchestration on PHP", Anton Tsitou
"Fault tolerant workflow orchestration on PHP", Anton Tsitou"Fault tolerant workflow orchestration on PHP", Anton Tsitou
"Fault tolerant workflow orchestration on PHP", Anton Tsitou
Fwdays
 
Zabbix и миллионы метрик: наилучший опыт масштабного мониторинга / Алексей Вл...
Zabbix и миллионы метрик: наилучший опыт масштабного мониторинга / Алексей Вл...Zabbix и миллионы метрик: наилучший опыт масштабного мониторинга / Алексей Вл...
Zabbix и миллионы метрик: наилучший опыт масштабного мониторинга / Алексей Вл...
Ontico
 
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
Ontico
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Ontico
 
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
Ontico
 
Реактивный двигатель вашего Android приложения
Реактивный двигатель вашего Android приложенияРеактивный двигатель вашего Android приложения
Реактивный двигатель вашего Android приложения
Matvey Malkov
 
Эффективная отладка репликации MySQL / Света Смирнова (Percona)
Эффективная отладка репликации MySQL / Света Смирнова (Percona)Эффективная отладка репликации MySQL / Света Смирнова (Percona)
Эффективная отладка репликации MySQL / Света Смирнова (Percona)
Ontico
 

What's hot (20)

A step-by-step approach toward high quality OutOfMemoryError analysis
A step-by-step approach toward high quality OutOfMemoryError analysisA step-by-step approach toward high quality OutOfMemoryError analysis
A step-by-step approach toward high quality OutOfMemoryError analysis
 
Implement your own profiler with blackjack and fun
Implement your own profiler with blackjack and funImplement your own profiler with blackjack and fun
Implement your own profiler with blackjack and fun
 
Автоматизация тестирования клиентской производительности / Николай Лавлинский...
Автоматизация тестирования клиентской производительности / Николай Лавлинский...Автоматизация тестирования клиентской производительности / Николай Лавлинский...
Автоматизация тестирования клиентской производительности / Николай Лавлинский...
 
Подводные камни в нагрузочном тестировании
Подводные камни в нагрузочном тестированииПодводные камни в нагрузочном тестировании
Подводные камни в нагрузочном тестировании
 
Высокопроизводительная и отказоустойчивая архитектура фронтальных систем / Ма...
Высокопроизводительная и отказоустойчивая архитектура фронтальных систем / Ма...Высокопроизводительная и отказоустойчивая архитектура фронтальных систем / Ма...
Высокопроизводительная и отказоустойчивая архитектура фронтальных систем / Ма...
 
Разбор сложных случаев OutOfMemoryError
Разбор сложных случаев OutOfMemoryErrorРазбор сложных случаев OutOfMemoryError
Разбор сложных случаев OutOfMemoryError
 
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов НиколайnoBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
 
Regular expressions
Regular expressionsRegular expressions
Regular expressions
 
Виртуализированные сетевые сервисы на line rate в серверном окружении / Алекс...
Виртуализированные сетевые сервисы на line rate в серверном окружении / Алекс...Виртуализированные сетевые сервисы на line rate в серверном окружении / Алекс...
Виртуализированные сетевые сервисы на line rate в серверном окружении / Алекс...
 
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
 
Zabbix 3.2 - мониторинг качественно нового уровня / Алексей Владышев (Zabbix)
Zabbix 3.2 - мониторинг качественно нового уровня / Алексей Владышев (Zabbix)Zabbix 3.2 - мониторинг качественно нового уровня / Алексей Владышев (Zabbix)
Zabbix 3.2 - мониторинг качественно нового уровня / Алексей Владышев (Zabbix)
 
PostgreSQL и JDBC: выжимаем все соки
PostgreSQL и JDBC: выжимаем все сокиPostgreSQL и JDBC: выжимаем все соки
PostgreSQL и JDBC: выжимаем все соки
 
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
 
"Fault tolerant workflow orchestration on PHP", Anton Tsitou
"Fault tolerant workflow orchestration on PHP", Anton Tsitou"Fault tolerant workflow orchestration on PHP", Anton Tsitou
"Fault tolerant workflow orchestration on PHP", Anton Tsitou
 
Zabbix и миллионы метрик: наилучший опыт масштабного мониторинга / Алексей Вл...
Zabbix и миллионы метрик: наилучший опыт масштабного мониторинга / Алексей Вл...Zabbix и миллионы метрик: наилучший опыт масштабного мониторинга / Алексей Вл...
Zabbix и миллионы метрик: наилучший опыт масштабного мониторинга / Алексей Вл...
 
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
 
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
 
Реактивный двигатель вашего Android приложения
Реактивный двигатель вашего Android приложенияРеактивный двигатель вашего Android приложения
Реактивный двигатель вашего Android приложения
 
Эффективная отладка репликации MySQL / Света Смирнова (Percona)
Эффективная отладка репликации MySQL / Света Смирнова (Percona)Эффективная отладка репликации MySQL / Света Смирнова (Percona)
Эффективная отладка репликации MySQL / Света Смирнова (Percona)
 

Viewers also liked

«Как выковать процесс самому»  – Михаил Вязанкин, 2ГИС
«Как выковать процесс самому»  – Михаил Вязанкин, 2ГИС«Как выковать процесс самому»  – Михаил Вязанкин, 2ГИС
«Как выковать процесс самому»  – Михаил Вязанкин, 2ГИС
2ГИС Технологии
 
Codefest2014 trends
Codefest2014 trendsCodefest2014 trends
Codefest2014 trends
Alexey Rybak
 
«Вывод продукта на новых территориях», Елизавета Алексеенко
«Вывод продукта на новых территориях», Елизавета Алексеенко«Вывод продукта на новых территориях», Елизавета Алексеенко
«Вывод продукта на новых территориях», Елизавета Алексеенко
DevDay
 
CodeFest 2013. Кульпин В. — Первый на Луне или открываем удаленный офис разра...
CodeFest 2013. Кульпин В. — Первый на Луне или открываем удаленный офис разра...CodeFest 2013. Кульпин В. — Первый на Луне или открываем удаленный офис разра...
CodeFest 2013. Кульпин В. — Первый на Луне или открываем удаленный офис разра...CodeFest
 
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
2ГИС Технологии
 
«GitHub Flow — немного сложнее, чем на бумаге», Александр Бирюков
«GitHub Flow — немного сложнее, чем на бумаге», Александр Бирюков«GitHub Flow — немного сложнее, чем на бумаге», Александр Бирюков
«GitHub Flow — немного сложнее, чем на бумаге», Александр Бирюков
2ГИС Технологии
 
Event collaboration happy people
Event collaboration happy peopleEvent collaboration happy people
Event collaboration happy people
event-collaboration Happy People
 
Buzzon digital agency presentation
Buzzon digital agency presentationBuzzon digital agency presentation
Buzzon digital agency presentation
Raim Dadybayev
 
"Фронтенд в Яндексе: сложные сервисы, непростые решения". Елена Джетпыспаева,...
"Фронтенд в Яндексе: сложные сервисы, непростые решения". Елена Джетпыспаева,..."Фронтенд в Яндексе: сложные сервисы, непростые решения". Елена Джетпыспаева,...
"Фронтенд в Яндексе: сложные сервисы, непростые решения". Елена Джетпыспаева,...
Yandex
 
Eventum Premo. Trends&Values
Eventum Premo. Trends&ValuesEventum Premo. Trends&Values
Eventum Premo. Trends&ValuesEventum Premo
 
Гид по посуде для алкоголя
Гид по посуде для алкоголяГид по посуде для алкоголя
Гид по посуде для алкоголяEventum Premo
 
Как разнообразить автомобильный day-to-day PR?
Как разнообразить автомобильный day-to-day PR?Как разнообразить автомобильный day-to-day PR?
Как разнообразить автомобильный day-to-day PR?
Eventum Premo
 
HappyNewYear
HappyNewYearHappyNewYear
HappyNewYear
Eventum Premo
 
Eventum Premo. Awards
Eventum Premo. AwardsEventum Premo. Awards
Eventum Premo. AwardsEventum Premo
 
мероприятия будущего Eventum Premo
мероприятия будущего Eventum Premoмероприятия будущего Eventum Premo
мероприятия будущего Eventum Premo
Eventum Premo
 
Eventum Premo | Projects for auto industry | ENG
Eventum Premo | Projects for auto industry | ENGEventum Premo | Projects for auto industry | ENG
Eventum Premo | Projects for auto industry | ENG
Eventum Premo
 
Мероприятия на гоночных трассах
Мероприятия на гоночных трассахМероприятия на гоночных трассах
Мероприятия на гоночных трассахEventum Premo
 
Eventum Premo - Sport
Eventum Premo - SportEventum Premo - Sport
Eventum Premo - Sport
Eventum Premo
 
Eventum Premo | Проекты для автомобильных компаний
Eventum Premo | Проекты для автомобильных компанийEventum Premo | Проекты для автомобильных компаний
Eventum Premo | Проекты для автомобильных компаний
Eventum Premo
 

Viewers also liked (20)

«Как выковать процесс самому»  – Михаил Вязанкин, 2ГИС
«Как выковать процесс самому»  – Михаил Вязанкин, 2ГИС«Как выковать процесс самому»  – Михаил Вязанкин, 2ГИС
«Как выковать процесс самому»  – Михаил Вязанкин, 2ГИС
 
Codefest2014 trends
Codefest2014 trendsCodefest2014 trends
Codefest2014 trends
 
«Вывод продукта на новых территориях», Елизавета Алексеенко
«Вывод продукта на новых территориях», Елизавета Алексеенко«Вывод продукта на новых территориях», Елизавета Алексеенко
«Вывод продукта на новых территориях», Елизавета Алексеенко
 
CodeFest 2013. Кульпин В. — Первый на Луне или открываем удаленный офис разра...
CodeFest 2013. Кульпин В. — Первый на Луне или открываем удаленный офис разра...CodeFest 2013. Кульпин В. — Первый на Луне или открываем удаленный офис разра...
CodeFest 2013. Кульпин В. — Первый на Луне или открываем удаленный офис разра...
 
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
 
«GitHub Flow — немного сложнее, чем на бумаге», Александр Бирюков
«GitHub Flow — немного сложнее, чем на бумаге», Александр Бирюков«GitHub Flow — немного сложнее, чем на бумаге», Александр Бирюков
«GitHub Flow — немного сложнее, чем на бумаге», Александр Бирюков
 
Event collaboration happy people
Event collaboration happy peopleEvent collaboration happy people
Event collaboration happy people
 
Event-agency C4group // 2014
Event-agency C4group // 2014Event-agency C4group // 2014
Event-agency C4group // 2014
 
Buzzon digital agency presentation
Buzzon digital agency presentationBuzzon digital agency presentation
Buzzon digital agency presentation
 
"Фронтенд в Яндексе: сложные сервисы, непростые решения". Елена Джетпыспаева,...
"Фронтенд в Яндексе: сложные сервисы, непростые решения". Елена Джетпыспаева,..."Фронтенд в Яндексе: сложные сервисы, непростые решения". Елена Джетпыспаева,...
"Фронтенд в Яндексе: сложные сервисы, непростые решения". Елена Джетпыспаева,...
 
Eventum Premo. Trends&Values
Eventum Premo. Trends&ValuesEventum Premo. Trends&Values
Eventum Premo. Trends&Values
 
Гид по посуде для алкоголя
Гид по посуде для алкоголяГид по посуде для алкоголя
Гид по посуде для алкоголя
 
Как разнообразить автомобильный day-to-day PR?
Как разнообразить автомобильный day-to-day PR?Как разнообразить автомобильный day-to-day PR?
Как разнообразить автомобильный day-to-day PR?
 
HappyNewYear
HappyNewYearHappyNewYear
HappyNewYear
 
Eventum Premo. Awards
Eventum Premo. AwardsEventum Premo. Awards
Eventum Premo. Awards
 
мероприятия будущего Eventum Premo
мероприятия будущего Eventum Premoмероприятия будущего Eventum Premo
мероприятия будущего Eventum Premo
 
Eventum Premo | Projects for auto industry | ENG
Eventum Premo | Projects for auto industry | ENGEventum Premo | Projects for auto industry | ENG
Eventum Premo | Projects for auto industry | ENG
 
Мероприятия на гоночных трассах
Мероприятия на гоночных трассахМероприятия на гоночных трассах
Мероприятия на гоночных трассах
 
Eventum Premo - Sport
Eventum Premo - SportEventum Premo - Sport
Eventum Premo - Sport
 
Eventum Premo | Проекты для автомобильных компаний
Eventum Premo | Проекты для автомобильных компанийEventum Premo | Проекты для автомобильных компаний
Eventum Premo | Проекты для автомобильных компаний
 

Similar to Быстрое построение backendов c помощью реактивных потоков

Построение аналитического хранилища на 100 петабайт
Построение аналитического хранилища на 100 петабайтПостроение аналитического хранилища на 100 петабайт
Построение аналитического хранилища на 100 петабайт
Alexander Mazurov
 
redux: the best for isomorphic apps
redux: the best for isomorphic appsredux: the best for isomorphic apps
redux: the best for isomorphic apps
Denis Izmaylov
 
"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25
"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25
"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25
MoscowJS
 
Программируемость и автоматизация решений Ciscо - практическое применение
Программируемость и автоматизация решений Ciscо - практическое применениеПрограммируемость и автоматизация решений Ciscо - практическое применение
Программируемость и автоматизация решений Ciscо - практическое применение
Cisco Russia
 
Клиентские приложения под нагрузкой (HighLoad 2014)
Клиентские приложения под нагрузкой (HighLoad 2014)Клиентские приложения под нагрузкой (HighLoad 2014)
Клиентские приложения под нагрузкой (HighLoad 2014)
Andrey Smirnov
 
Клиентские приложения под нагрузкой, Андрей Смирнов
Клиентские приложения под нагрузкой, Андрей СмирновКлиентские приложения под нагрузкой, Андрей Смирнов
Клиентские приложения под нагрузкой, Андрей Смирнов
Ontico
 
Мы делили апельсин
Мы делили апельсинМы делили апельсин
Мы делили апельсин
Olga Lavrentieva
 
SOA: Строим свой service mesh
SOA: Строим свой service meshSOA: Строим свой service mesh
SOA: Строим свой service mesh
Ivan Kruglov
 
SOA: строим свой service mesh / Иван Круглов (Booking.com)
SOA: строим свой service mesh / Иван Круглов (Booking.com)SOA: строим свой service mesh / Иван Круглов (Booking.com)
SOA: строим свой service mesh / Иван Круглов (Booking.com)
Ontico
 
Антон Киршанов — Особенности архитектуры Single Page Application
Антон Киршанов — Особенности архитектуры Single Page Application Антон Киршанов — Особенности архитектуры Single Page Application
Антон Киршанов — Особенности архитектуры Single Page Application
Yandex
 
Breaking logs
Breaking logsBreaking logs
Breaking logs
Ilya Sergeev
 
Moscow js 26 webpack
Moscow js 26   webpackMoscow js 26   webpack
Moscow js 26 webpack
lgordey
 
MoscowJS 26 webpack presentation
MoscowJS 26 webpack presentationMoscowJS 26 webpack presentation
MoscowJS 26 webpack presentation
lgordey
 
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
AvitoTech
 
Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)
Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)
Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)
Ontico
 
Проблематика создания OpenFlow контроллеров для SDN
Проблематика создания OpenFlow контроллеров для SDNПроблематика создания OpenFlow контроллеров для SDN
Проблематика создания OpenFlow контроллеров для SDNARCCN
 
Service mesh для микросервисов
Service mesh для микросервисовService mesh для микросервисов
Service mesh для микросервисов
Ivan Kruglov
 
Multithreading in java past and actual
Multithreading in java past and actualMultithreading in java past and actual
Multithreading in java past and actual
Yevgen Levik
 
Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС
Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИСРеактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС
Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС
2ГИС Технологии
 
Изоморфные react-приложения
Изоморфные react-приложенияИзоморфные react-приложения
Изоморфные react-приложения
Denis Izmaylov
 

Similar to Быстрое построение backendов c помощью реактивных потоков (20)

Построение аналитического хранилища на 100 петабайт
Построение аналитического хранилища на 100 петабайтПостроение аналитического хранилища на 100 петабайт
Построение аналитического хранилища на 100 петабайт
 
redux: the best for isomorphic apps
redux: the best for isomorphic appsredux: the best for isomorphic apps
redux: the best for isomorphic apps
 
"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25
"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25
"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25
 
Программируемость и автоматизация решений Ciscо - практическое применение
Программируемость и автоматизация решений Ciscо - практическое применениеПрограммируемость и автоматизация решений Ciscо - практическое применение
Программируемость и автоматизация решений Ciscо - практическое применение
 
Клиентские приложения под нагрузкой (HighLoad 2014)
Клиентские приложения под нагрузкой (HighLoad 2014)Клиентские приложения под нагрузкой (HighLoad 2014)
Клиентские приложения под нагрузкой (HighLoad 2014)
 
Клиентские приложения под нагрузкой, Андрей Смирнов
Клиентские приложения под нагрузкой, Андрей СмирновКлиентские приложения под нагрузкой, Андрей Смирнов
Клиентские приложения под нагрузкой, Андрей Смирнов
 
Мы делили апельсин
Мы делили апельсинМы делили апельсин
Мы делили апельсин
 
SOA: Строим свой service mesh
SOA: Строим свой service meshSOA: Строим свой service mesh
SOA: Строим свой service mesh
 
SOA: строим свой service mesh / Иван Круглов (Booking.com)
SOA: строим свой service mesh / Иван Круглов (Booking.com)SOA: строим свой service mesh / Иван Круглов (Booking.com)
SOA: строим свой service mesh / Иван Круглов (Booking.com)
 
Антон Киршанов — Особенности архитектуры Single Page Application
Антон Киршанов — Особенности архитектуры Single Page Application Антон Киршанов — Особенности архитектуры Single Page Application
Антон Киршанов — Особенности архитектуры Single Page Application
 
Breaking logs
Breaking logsBreaking logs
Breaking logs
 
Moscow js 26 webpack
Moscow js 26   webpackMoscow js 26   webpack
Moscow js 26 webpack
 
MoscowJS 26 webpack presentation
MoscowJS 26 webpack presentationMoscowJS 26 webpack presentation
MoscowJS 26 webpack presentation
 
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
 
Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)
Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)
Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)
 
Проблематика создания OpenFlow контроллеров для SDN
Проблематика создания OpenFlow контроллеров для SDNПроблематика создания OpenFlow контроллеров для SDN
Проблематика создания OpenFlow контроллеров для SDN
 
Service mesh для микросервисов
Service mesh для микросервисовService mesh для микросервисов
Service mesh для микросервисов
 
Multithreading in java past and actual
Multithreading in java past and actualMultithreading in java past and actual
Multithreading in java past and actual
 
Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС
Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИСРеактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС
Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС
 
Изоморфные react-приложения
Изоморфные react-приложенияИзоморфные react-приложения
Изоморфные react-приложения
 

More from CodeFest

Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander Graebe
CodeFest
 
Никита Прокопов
Никита ПрокоповНикита Прокопов
Никита Прокопов
CodeFest
 
Денис Баталов
Денис БаталовДенис Баталов
Денис Баталов
CodeFest
 
Елена Гальцина
Елена ГальцинаЕлена Гальцина
Елена Гальцина
CodeFest
 
Александр Калашников
Александр КалашниковАлександр Калашников
Александр Калашников
CodeFest
 
Ирина Иванова
Ирина ИвановаИрина Иванова
Ирина Иванова
CodeFest
 
Marko Berković
Marko BerkovićMarko Berković
Marko Berković
CodeFest
 
Денис Кортунов
Денис КортуновДенис Кортунов
Денис Кортунов
CodeFest
 
Александр Зимин
Александр ЗиминАлександр Зимин
Александр Зимин
CodeFest
 
Сергей Крапивенский
Сергей КрапивенскийСергей Крапивенский
Сергей Крапивенский
CodeFest
 
Сергей Игнатов
Сергей ИгнатовСергей Игнатов
Сергей Игнатов
CodeFest
 
Николай Крапивный
Николай КрапивныйНиколай Крапивный
Николай Крапивный
CodeFest
 
Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander Graebe
CodeFest
 
Вадим Смирнов
Вадим СмирновВадим Смирнов
Вадим Смирнов
CodeFest
 
Константин Осипов
Константин ОсиповКонстантин Осипов
Константин Осипов
CodeFest
 
Raffaele Rialdi
Raffaele RialdiRaffaele Rialdi
Raffaele Rialdi
CodeFest
 
Максим Пугачев
Максим ПугачевМаксим Пугачев
Максим Пугачев
CodeFest
 
Rene Groeschke
Rene GroeschkeRene Groeschke
Rene Groeschke
CodeFest
 
Иван Бондаренко
Иван БондаренкоИван Бондаренко
Иван Бондаренко
CodeFest
 
Mete Atamel
Mete AtamelMete Atamel
Mete Atamel
CodeFest
 

More from CodeFest (20)

Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander Graebe
 
Никита Прокопов
Никита ПрокоповНикита Прокопов
Никита Прокопов
 
Денис Баталов
Денис БаталовДенис Баталов
Денис Баталов
 
Елена Гальцина
Елена ГальцинаЕлена Гальцина
Елена Гальцина
 
Александр Калашников
Александр КалашниковАлександр Калашников
Александр Калашников
 
Ирина Иванова
Ирина ИвановаИрина Иванова
Ирина Иванова
 
Marko Berković
Marko BerkovićMarko Berković
Marko Berković
 
Денис Кортунов
Денис КортуновДенис Кортунов
Денис Кортунов
 
Александр Зимин
Александр ЗиминАлександр Зимин
Александр Зимин
 
Сергей Крапивенский
Сергей КрапивенскийСергей Крапивенский
Сергей Крапивенский
 
Сергей Игнатов
Сергей ИгнатовСергей Игнатов
Сергей Игнатов
 
Николай Крапивный
Николай КрапивныйНиколай Крапивный
Николай Крапивный
 
Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander Graebe
 
Вадим Смирнов
Вадим СмирновВадим Смирнов
Вадим Смирнов
 
Константин Осипов
Константин ОсиповКонстантин Осипов
Константин Осипов
 
Raffaele Rialdi
Raffaele RialdiRaffaele Rialdi
Raffaele Rialdi
 
Максим Пугачев
Максим ПугачевМаксим Пугачев
Максим Пугачев
 
Rene Groeschke
Rene GroeschkeRene Groeschke
Rene Groeschke
 
Иван Бондаренко
Иван БондаренкоИван Бондаренко
Иван Бондаренко
 
Mete Atamel
Mete AtamelMete Atamel
Mete Atamel
 

Быстрое построение backendов c помощью реактивных потоков