Upgrade to Pro — share decks privately, control downloads, hide ads and more …

JUGNsk Meetup#10. Олег Докука: "The State of Reactive Streams"

jugnsk
August 27, 2019

JUGNsk Meetup#10. Олег Докука: "The State of Reactive Streams"

Спецификация реактивных стримов является венцом творения в области асинхронного, неблокирующего стриминга с четкой калибровкой потока данных. Появление спецификации привнесло глоток свежего воздуха в мир реактивного программирования в Java экосистеме. В результате мы стали свидетелями объединения многих реактивных библиотек под одним API.

Очевидно, что данная спецификация была разработана во имя светлого будущего. Но есть ли вообще у такого подхода это будущее в современных реалиях? Как остальные языки программирования отреагировали на появление данного стандарта, и получилось ли расширить экспансию данного стандарта так же успешно, как и в JVM-мире? Более того, что произойдет со стандартом с появлением fibers в Java вместе с проектом Loom?

В докладе обсудим все эти вопросы и многое другое. В результате вам точно станет ясно, зачем же реактивные стримы появились изначально и что с ними будет в итоге.

jugnsk

August 27, 2019
Tweet

More Decks by jugnsk

Other Decks in Programming

Transcript

  1. Что будет • Зачем нам нужна реактивщина и как она

    возникла • Что у нас есть сегодня? • Что ждет в будущем?
  2. Это То Туда Сюда Нетуда Отличия от не реактивных систем

    • НЕ реактивные системы - обрабатывают события выборочно и не своевременно • Реактивная система - изменяет свое поведение как результат обработки всех произошедших событий (реакция на все входящие события )
  3. Агонь const onMouseMoveObserver = (e: JQuery.Event) => { box.css({ top:

    e.clientY - offsetY, left: e.clientX - offsetX }) } box.mousemove(onMouseMoveObserver)
  4. Проблематика • Возникла необходимость построения сложной обработки событий • Интерфейсы

    с не тривиальной анимацией • Читаемость и прозрачность код стала снижаться
  5. kids u = delayAnims 0.5 (map (move (mouseMotion u)) [jake,

    becky, charlotte, pat]) нИчесИ
  6. Итог - все круто • Паттерн Наблюдатель как подход •

    Functional Reactive Animation как языковая парадигма
  7. Недостатки подходов • Ходки за одним НЕ эффективны из за

    задержки сети • Пропускная способность сети НЕ безгранична • Ресурсы компьютера ограничены
  8. Проблематика Observer Iterator + Асинхронный Push - А где конец?

    - А как отписаться? - Синхронный Pull + Ясно, где конец + Можем отписаться
  9. В чем суть Observer Iterator + = Rx + Асинхронный

    Push + Ясно, где конец + Понятно, как отписаться { } onNext onError onComplete Observer { } subscribe() Observable { } cancel() Subscription
  10. range(1, 200) .pipe( filter(x => x % 2 === 1),

    map(x => x + x) ) .subscribe(x => console.log(x)); Observable .range(1, 200) .filter(x -> x % 2 === 1) .map(x -> x + x) .subscribe(x -> out.println(x)); Observable .range(1, 200) .filter{ $0 % 2 === 1 } .map{ $0 + $0 } .subscribe(onNext: { print($0) }); Языковая парадигма
  11. Итог - все круто • Rx подход решил проблемы •

    Построение сложных асинхронных взаимодействий вновь стало простым
  12. В чем суть Rx + Rx Push модель + Async

    Batch pull + Стандартный набор интерфейсов { } onNext onError onComplete onSubscribe Subscriber { } subscribe() Publisher { } cancel() request() Subscription RS + Batch = Push Pull
  13. Итог - все круто • Reactive-Streams spec - стандарт реактивных

    библиотек • Улучшеный API c Push-Pull стримингом
  14. IAsyncEnumerator<T> enumerator = enumerable.GetAsyncEnumerator(); try { while (await enumerator.WaitForNextAsync()) {

    while (true) { int item = enumerator.TryGetNext(out bool success); if (!success) break; Use(item); } } } finally { await enumerator.DisposeAsync(); } IAsyncEnumerator<T> enumerator = enumerable.GetAsyncEnumerator(); try { while (await enumerator.WaitForNextAsync()) { while (true) { int item = enumerator.TryGetNext(out bool success); if (!success) break; Use(item); } } } finally { await enumerator.DisposeAsync(); } IAsyncEnumerator<T> enumerator = enumerable.GetAsyncEnumerator(); try { while (await enumerator.WaitForNextAsync()) { while (true) { int item = enumerator.TryGetNext(out bool success); if (!success) break; Use(item); } } } finally { await enumerator.DisposeAsync(); } IAsyncEnumerator<T> enumerator = enumerable.GetAsyncEnumerator(); try { while (await enumerator.WaitForNextAsync()) { while (true) { int item = enumerator.TryGetNext(out bool success); if (!success) break; Use(item); } } } finally { await enumerator.DisposeAsync(); } В чем суть
  15. | | | | | | | | | |

    | | Скорость Размер Констрейны Push Pull Sm all Big K/V PK/FK Куб от Гуся…
 шутка - 
 от Эрика Мейера https://queue.acm.org/detail.cfm?id=2169076 | | | | | | | | | | | | Async/Await | | | | | | | | | | | | | | | | | | | | | | | | | | | Reactive-Streams
  16. Финальный Итог • Эволюция Reactive Streams начала с давных времен

    • Зародилась в мире UI и нашла свою жизнь в мире EE приложений • Все это выродилось в стандарт нацеленный на стабильность системы • Стандарт есть стандарт - работает везде и также • Используй все это с умом подглядывая на куб от гуся!