Slide 1

Slide 1 text

15 de Agosto de 2020, Brasil TITLE Speaker Improving the performance and readability of Java applications with Spring Web Flux Kamila Santos

Slide 2

Slide 2 text

15 de Agosto de 2020, Brasil Backend Developer github.com/kamilahsantos in/kamila-santos-oliveira/ @kamilah_santos https://dev.to/kamilahsantos

Slide 3

Slide 3 text

15 de Agosto de 2020, Brasil

Slide 4

Slide 4 text

15 de Agosto de 2020, Brasil Reactive Manifest https://www.reactivemanifesto.org/ @kamilah_santos

Slide 5

Slide 5 text

15 de Agosto de 2020, Brasil Responsivo O sistema responde em tempo hábil, se possível @kamilah_santos

Slide 6

Slide 6 text

15 de Agosto de 2020, Brasil Resiliente O sistema permanece responsivo a falhas @kamilah_santos

Slide 7

Slide 7 text

15 de Agosto de 2020, Brasil Elástico O sistema permanece responsivo em face de uma carga de trabalho variável. @kamilah_santos

Slide 8

Slide 8 text

15 de Agosto de 2020, Brasil Message Driven Os aplicativos reativos contam com a passagem de mensagens assíncronas para estabelecer um limite entre os componentes, garantindo acoplamento flexível, isolamento e transparência @kamilah_santos

Slide 9

Slide 9 text

15 de Agosto de 2020, Brasil Reactive Streams Iniciativa para fornecer um padrão / guia / regras para processamento de fluxo assíncrono com backpressure NIO @kamilah_santos

Slide 10

Slide 10 text

15 de Agosto de 2020, Brasil interface Flow.Publisher métodos para produzir streams e demais eventos @kamilah_santos

Slide 11

Slide 11 text

15 de Agosto de 2020, Brasil @kamilah_santos

Slide 12

Slide 12 text

15 de Agosto de 2020, Brasil interface Flow.Subscriber métodos para receber streams e demais eventos @kamilah_santos

Slide 13

Slide 13 text

15 de Agosto de 2020, Brasil @kamilah_santos

Slide 14

Slide 14 text

15 de Agosto de 2020, Brasil interface Flow.Subscription métodos para vincular o Publisher e o Subscriber. @kamilah_santos

Slide 15

Slide 15 text

15 de Agosto de 2020, Brasil @kamilah_santos

Slide 16

Slide 16 text

15 de Agosto de 2020, Brasil interface Flow.Processor define métodos para fazer algumas operações avançadas, como transformar itens de publishers para subscriber @kamilah_santos

Slide 17

Slide 17 text

15 de Agosto de 2020, Brasil @kamilah_santos

Slide 18

Slide 18 text

15 de Agosto de 2020, Brasil class SubmissionPublisher implements Flow.Publisher Producer flexível de itens, em conformidade com a Reactive Streams. @kamilah_santos

Slide 19

Slide 19 text

15 de Agosto de 2020, Brasil @kamilah_santos

Slide 20

Slide 20 text

15 de Agosto de 2020, Brasil Reactive streams destinado a ambientes de tempo de execução (JVM), bem como protocolos de rede. https://github.com/reactive-streams/reactive-streams-jv m @kamilah_santos

Slide 21

Slide 21 text

15 de Agosto de 2020, Brasil Reactive streams o objetivo principal é definir a troca de dados de fluxo através de um limite assíncrono. @kamilah_santos

Slide 22

Slide 22 text

15 de Agosto de 2020, Brasil Reactive streams seu escopo é encontrar um conjunto mínimo de métodos, interfaces e protocolos que irão descrever as operações e entidades necessárias para ter fluxos de dados assíncronos com backpressure NIO. @kamilah_santos

Slide 23

Slide 23 text

15 de Agosto de 2020, Brasil Functional Features Java 8+ @kamilah_santos

Slide 24

Slide 24 text

15 de Agosto de 2020, Brasil @kamilah_santos

Slide 25

Slide 25 text

15 de Agosto de 2020, Brasil @kamilah_santos

Slide 26

Slide 26 text

15 de Agosto de 2020, Brasil @kamilah_santos

Slide 27

Slide 27 text

15 de Agosto de 2020, Brasil @kamilah_santos

Slide 28

Slide 28 text

15 de Agosto de 2020, Brasil @kamilah_santos

Slide 29

Slide 29 text

15 de Agosto de 2020, Brasil @kamilah_santos

Slide 30

Slide 30 text

15 de Agosto de 2020, Brasil Conceitos de programação reativa @kamilah_santos

Slide 31

Slide 31 text

15 de Agosto de 2020, Brasil Backpressure Resistência ou força que se opõe ao fluxo de dados desejado por meio do software. Feedback do receptor ao produtor de que ele não está suportando a carga @kamilah_santos

Slide 32

Slide 32 text

15 de Agosto de 2020, Brasil Stream Sequência de objetos que suporta vários métodos que podem ser operados para produzir um resultado @kamilah_santos

Slide 33

Slide 33 text

15 de Agosto de 2020, Brasil Stream vinculado a uma fonte de dados, um stream é capaz de emitir três eventos: @kamilah_santos

Slide 34

Slide 34 text

15 de Agosto de 2020, Brasil onNext() representa algum valor, vá para o próximo valor de uma lista @kamilah_santos

Slide 35

Slide 35 text

15 de Agosto de 2020, Brasil onError() houve um erro na execução @kamilah_santos

Slide 36

Slide 36 text

15 de Agosto de 2020, Brasil onComplete() no caso de eventos finitos, indica que foi concluído @kamilah_santos

Slide 37

Slide 37 text

15 de Agosto de 2020, Brasil Flux Pode emitir de 0 to N eventos, passando por OnNext (), OnComplete () e onError. @kamilah_santos

Slide 38

Slide 38 text

15 de Agosto de 2020, Brasil Mono Emite um evento ou nenhum (0 to 1 event). @kamilah_santos

Slide 39

Slide 39 text

15 de Agosto de 2020, Brasil Observable um observable pode passar mensagens de forma assíncrona. @kamilah_santos

Slide 40

Slide 40 text

15 de Agosto de 2020, Brasil Subscriber consome os dados recebidos da subscription @kamilah_santos

Slide 41

Slide 41 text

15 de Agosto de 2020, Brasil Publisher produz os dados que serão consumidos pela assinatura. @kamilah_santos

Slide 42

Slide 42 text

15 de Agosto de 2020, Brasil Subscription conexão entre o Subscriber e o Publisher @kamilah_santos

Slide 43

Slide 43 text

15 de Agosto de 2020, Brasil Cold Observable a sequência de eventos só é executada se o Observable tiver um subscriber associado @kamilah_santos

Slide 44

Slide 44 text

15 de Agosto de 2020, Brasil Hot Observable ele emite eventos independentemente de haver um subscriber associado @kamilah_santos

Slide 45

Slide 45 text

15 de Agosto de 2020, Brasil Por que o WebFlux foi criado? Spring WebFlux pode ser definido como uma versão “paralela” ao já conhecido e amplamente utilizado Spring MVC (servlet), tendo como principal diferença o suporte para streams NIO reativos e por suportar o conceito de backpressure com o servidor Netty vindo por default embutido em seu arquitetura. @kamilah_santos

Slide 46

Slide 46 text

15 de Agosto de 2020, Brasil Por que o WebFlux foi criado? A partir da versão 5.0 do Spring Framework temos uma parte reativa além da estrutura Servlet que já existia, cada módulo destes é opcional, você pode usar a parte Servlet, a parte reativa ou mesmo ambas em suas aplicações. @kamilah_santos

Slide 47

Slide 47 text

15 de Agosto de 2020, Brasil https://docs.spring.io/spring-framework/docs/5.0.0.BUILD-SNAPSHOT/spring-framework-reference/ html/web-reactive.html @kamilah_santos

Slide 48

Slide 48 text

15 de Agosto de 2020, Brasil Spring Webflux foi desenvolvido porque precisávamos de aplicativos não bloqueantes que pudessem trabalhar com um pequeno número de threads simultaneamente e que pudessem ser executados com alguns recursos de hardware. @kamilah_santos

Slide 49

Slide 49 text

15 de Agosto de 2020, Brasil no Servlet 3.1, uma API NIO foi fornecida, mas seu uso não corresponde ao resto da API e a todos os conceitos por trás do Servlet, que possui contratos de bloqueio. @kamilah_santos

Slide 50

Slide 50 text

15 de Agosto de 2020, Brasil Estes fatores foram decisivos para o desenvolvimento de uma nova API que fosse utilizada independentemente do tempo de execução e de forma não bloqueante, o que foi possível com os servidores (Netty por exemplo) que se consolidaram na operação assíncrona e não bloqueante. @kamilah_santos

Slide 51

Slide 51 text

15 de Agosto de 2020, Brasil Outra razão é que o WebFlux torna mais fácil entender e usar conceitos de programação funcional / reativa. Com a adição de recursos funcionais do Java 8 e Flowable API no Java 9 , que permitiu ao Spring WebFlux ter functional endpoints e annotated controllers nos aplicativos. @kamilah_santos

Slide 52

Slide 52 text

15 de Agosto de 2020, Brasil Como as requests funcionam? @kamilah_santos

Slide 53

Slide 53 text

15 de Agosto de 2020, Brasil Este modelo, dependendo do volume de requisições e da forma como foi desenvolvido, pode causar lentidão na sua aplicação e até mesmo um erro de Out Of Memory (este tipo de erro geralmente ocorre quando mantemos objetos por muito tempo ou tentamos processar muito de dados de uma vez) @kamilah_santos

Slide 54

Slide 54 text

15 de Agosto de 2020, Brasil @kamilah_santos

Slide 55

Slide 55 text

15 de Agosto de 2020, Brasil Com este modelo de design de API tradicional, não oferecemos suporte para Backpressure, a escrita da API é imperativa e, como já foi dito, funciona de forma síncrona e bloqueante @kamilah_santos

Slide 56

Slide 56 text

15 de Agosto de 2020, Brasil @kamilah_santos

Slide 57

Slide 57 text

15 de Agosto de 2020, Brasil @kamilah_santos

Slide 58

Slide 58 text

15 de Agosto de 2020, Brasil E no Webflux? @kamilah_santos

Slide 59

Slide 59 text

15 de Agosto de 2020, Brasil Neste modelo de requisição, para cada item deste Flux que é lido e retornado do banco de dados, um onNext () é chamado e quando atinge o último recebe um “sinal” de onComplete () ou se ocorre um erro, ele receberá um onError (). @kamilah_santos

Slide 60

Slide 60 text

15 de Agosto de 2020, Brasil @kamilah_santos

Slide 61

Slide 61 text

15 de Agosto de 2020, Brasil Os pedidos disparados por um cliente, são recebidos pelo Netty, que é o nosso servidor não bloqueante, que será recebido pelo loop de eventos, que irá receber este evento e enviá-lo, o adaptador reativo (reactor-netty) passará este para o dispatcher handler que é responsável pelo terminal para passar essas informações de volta ao cliente, isso ocorre de forma assíncrona e não bloqueante. @kamilah_santos

Slide 62

Slide 62 text

15 de Agosto de 2020, Brasil @kamilah_santos

Slide 63

Slide 63 text

15 de Agosto de 2020, Brasil O adaptador reativo geralmente é fornecido por uma biblioteca, aqui cobrirá o projeto do Reactor. @kamilah_santos

Slide 64

Slide 64 text

15 de Agosto de 2020, Brasil Project Reactor @kamilah_santos

Slide 65

Slide 65 text

15 de Agosto de 2020, Brasil É uma biblioteca baseada nas Reactive Streams Specifications, é totalmente não bloqueante e interage diretamente com a API Java funcional (Stream, Duration e Completable Future), para composição de elementos utilizando Flux e Mono em arquiteturas de microsserviços , oferecendo mecanismos de backpressure prontos para TCP, UDP e HTTP (incluindo sockets da web). @kamilah_santos

Slide 66

Slide 66 text

15 de Agosto de 2020, Brasil Seus operators e schedulers podem suportar um grande volume de transferência (até 10 milhões de solicitações por segundo, de acordo com a documentação do Reactor https://projectreactor.io/), também foi a primeira biblioteca reativa a implementar alguns pontos sugeridos pela reactive streams applications( https://github.com/reactor/reactive-streams-common s), que mais tarde também foram implementados por RxJava2. @kamilah_santos

Slide 67

Slide 67 text

15 de Agosto de 2020, Brasil Seus módulos são fluxos reativos abstratos e interoperáveis para facilitar o seu desenvolvimento, podendo ser utilizados com: Spring Frameworks Drivers e clientes (por exemplo CloudFoundry Java Client https://github.com/cloudfoundry/cf-java-client) - em protocolos / contratos como R2DBC (https://r2dbc.io/) e RSocket (https://rsocket.io/), por exemplo. @kamilah_santos

Slide 68

Slide 68 text

15 de Agosto de 2020, Brasil Reactor Core é a parte principal desta biblioteca, os outros módulos são dependentes dela, ela fornece tipos reativos que implementam um Publisher que fornece Flux e Mono @kamilah_santos

Slide 69

Slide 69 text

15 de Agosto de 2020, Brasil Reactor Netty é o servidor de nosso aplicativo NIO, usada para o desenvolvimento de servidores altamente escaláveis. @kamilah_santos

Slide 70

Slide 70 text

15 de Agosto de 2020, Brasil Reactor Test é responsável por apoiar testes reativos e asserções @kamilah_santos

Slide 71

Slide 71 text

15 de Agosto de 2020, Brasil Netty é possível trabalhar no nível do socket e criar seus próprios protocolos de comunicação @kamilah_santos

Slide 72

Slide 72 text

15 de Agosto de 2020, Brasil Netty Para essas configurações de servidor NIO, é bom ter conhecimento de threads, event loop, buffers e gerenciamento de memória @kamilah_santos

Slide 73

Slide 73 text

15 de Agosto de 2020, Brasil @kamilah_santos

Slide 74

Slide 74 text

15 de Agosto de 2020, Brasil Exemplo @kamilah_santos

Slide 75

Slide 75 text

15 de Agosto de 2020, Brasil Performance @kamilah_santos

Slide 76

Slide 76 text

15 de Agosto de 2020, Brasil Palestra completa em: https://www.youtube.com/watch?v=ODzY5uJfzDI&t=3s @kamilah_santos

Slide 77

Slide 77 text

15 de Agosto de 2020, Brasil Palestra completa em: https://www.youtube.com/watch?v=ODzY5uJfzDI&t=3s @kamilah_santos

Slide 78

Slide 78 text

15 de Agosto de 2020, Brasil Palestra completa em: https://www.youtube.com/watch?v=ODzY5uJfzDI&t=3s @kamilah_santos

Slide 79

Slide 79 text

15 de Agosto de 2020, Brasil Palestra completa em: https://www.youtube.com/watch?v=ODzY5uJfzDI&t=3s @kamilah_santos

Slide 80

Slide 80 text

15 de Agosto de 2020, Brasil Palestra completa em: https://www.youtube.com/watch?v=ODzY5uJfzDI&t=3s @kamilah_santos

Slide 81

Slide 81 text

15 de Agosto de 2020, Brasil Exemplos dos testes: https://github.com/violetagg/web-benchmarks/tree/experimental @kamilah_santos

Slide 82

Slide 82 text

15 de Agosto de 2020, Brasil Beneficios @kamilah_santos

Slide 83

Slide 83 text

15 de Agosto de 2020, Brasil - não bloqueante, o que gera certo ganho de desempenho. - menos threads, menos memória usada / gasta - visão mais clara dos recursos funcionais da linguagem - processa diferentes formas de solicitação de forma assíncrona @kamilah_santos

Slide 84

Slide 84 text

15 de Agosto de 2020, Brasil - segue os princípios do manifesto reativo: aplicativos responsivos, resilientes, elásticos e orientados por mensagens. - Backpressure - Com o Reactor temos: maior legibilidade do código, grande variedade de operadores para manipular os dados e um alto nível de abstração. @kamilah_santos

Slide 85

Slide 85 text

15 de Agosto de 2020, Brasil Problemas @kamilah_santos

Slide 86

Slide 86 text

15 de Agosto de 2020, Brasil - Uma forma diferente de programação (programação declarativa) - Difícil de depurar (rastreamento de pilha mais complicado de entender). - Nem todos os drivers de banco de dados estão totalmente prontos para programação reativa. @kamilah_santos

Slide 87

Slide 87 text

15 de Agosto de 2020, Brasil Quando usar @kamilah_santos

Slide 88

Slide 88 text

15 de Agosto de 2020, Brasil - Se você tem fast producers (emissão de informação mais rápida) e consumidores baixos (consumidores lentos e bloqueadores), sem suporte de contrapressão. - Tráfego variável - Chamadas constantes ao banco de dados e esse banco de dados já possui um driver reativo, a mudança para o webflux pode diminuir o tempo de latência. - Muitos fluxos, eventos no aplicativo. - Quando este serviço é consumido via celular e possui alto volume de tráfego. @kamilah_santos

Slide 89

Slide 89 text

15 de Agosto de 2020, Brasil Quando não usar @kamilah_santos

Slide 90

Slide 90 text

15 de Agosto de 2020, Brasil - se o seu aplicativo não tiver um volume de tráfego muito alto, ele não terá várias fontes de solicitação - Se não houver acúmulo de solicitações, isso ocorre devido a processos de bloqueio. - Se as dependências já utilizadas em seus serviços estão bloqueando @kamilah_santos

Slide 91

Slide 91 text

15 de Agosto de 2020, Brasil My contacts Example

Slide 92

Slide 92 text

15 de Agosto de 2020, Brasil https://tech.io/playgrounds/929/reactive-programming-with-reactor-3/transform https://www.callicoder.com/reactive-rest-apis-spring-webflux-reactive-mongo/ http://reactivex.io/languages.html https://www.journaldev.com/20723/java-9-reactive-streams https://projectreactor.io/ http://www.trieu.xyz/2019/04/netty-cookbook.html https://dzone.com/articles/build-a-simple-netty-application-with-and-without https://www.baeldung.com/netty https://developer.okta.com/blog/2018/09/21/reactive-programming-with-spring https://speakerdeck.com/olehdokuka/get-reactive-with-project-reactor-and-spring-5 https://speakerdeck.com/kamilahsantos/2020-d0013e50-afdf-4e9c-b411-7f22d2f3d64c https://speakerdeck.com/kamilahsantos/tdc-floripa-melhorando-a-performance-e-legibilidade-de-aplicacoes-java-c om-spring-web-flux https://www.baeldung.com/spring-webflux https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html https://docs.spring.io/spring-framework/docs/5.0.0.BUILD-SNAPSHOT/spring-framework-reference/html/web-react ive.html @kailah_santos