Pra que serve a programação reativa? – paradigmas programação-reativa

Pergunta:


Eu já li O que é Reactive Programming (Programação Reativa)?. A resposta parece boa, mas é teórica. Entendi o que é, mas com aquilo não sei o que fazer.

Onde deve ser usada?

Tem um exemplo simples?

Qual é o mecanismo concreto usado para isto funcionar? Concreto até onde pode ser, entendo que em programação tudo é abstração a não ser os elétrons excitados 🙂

Só funciona entre agentes locais ou um deles pode ser remoto? É por causa da internet?

Só funciona se for algo “inteligente, interligada em paralelo, não linear? Se for, o que é esse inteligente?

Aparentemente tem que ter robustez para ser classificada assim? Precisa rodar em vários servidores? Ou é uma opção?

É um paradigma? É um framework? Posso usar em .NET?

Autor da pergunta Maniero

Resposta :

Muitas pessoas misturam os termos e conceitos de programação reativa e de sistemas reativos, talvez devido ao Reactive Manifesto. Em janeiro de 2017, a Lightbend publicou um whitepaper (em inglês) que explica os dois conceitos e suas diferenças chave.

Esta resposta se baseia nos conceitos da programação reativa.


Onde deve ser usada?

Pode ser utilizada em vários lugares. Desde uma consulta a um banco de dados “local”, passando por monitorar o ponteiro em uma tela, até sistemas distribuídos que lidam com um número grande de requisições por segundo.


Tem um exemplo simples?

Observando o movimento do mouse no Silverlight:

var mouseMove = Observable.FromEventPattern<MouseEventArgs>(this, "MouseMove");
mouseMove.ObserveOnDispatcher()
         .Subscribe(args => Debug.WriteLine(args.EventArgs.GetPosition(this)));

fonte


Qual é o mecanismo concreto usado para isto funcionar? Concreto até
onde pode ser, entendo que em programação tudo é abstração a não ser
os elétrons excitados 🙂

Um dos mecanismos utilizados é o Observer Pattern do GOF.


Só funciona entre agentes locais ou um deles pode ser remoto? É por causa da internet?

Parte da premissa da programação reativa é decompor um problema em passos pequenos que podem ser executados de forma assíncrona e não bloqueante. Esse problema pode estar dividido entre agentes locais e remotos.

A Internet pode ser considerada como um fator que leve à adoção da programação reativa, já que a consulta a sistemas remotos é uma operação bloqueante que pode afetar a escalabilidade do seu sistema.


Aparentemente tem que ter robustez para ser classificada assim?
Precisa rodar em vários servidores? Ou é uma opção?

Não. A programação reativa está em alta no mundo dos aplicativos Android, por exemplo. Muitos desenvolvedores estão adotando este paradigma pelas facilidades que ela acaba trazendo e também pelas características da plataforma.


É um paradigma? É um framework? Posso usar em .NET?

É um paradigma. E existem bibliotecas e toolkits que implementam esse paradigma. Um exemplo para .NET são as Reactive Extensions.

Pra que serve a programação reativa?

A programação reativa vem nos salvar em situações onde o fluxo normal seria parado por um erro inserir a descrição da imagem aqui ou por um tempo de resposta demorado devido a quantidade de núcleos estáticos entre outras especificações envolvidas nos seus pilares. Resumindo, para entender para que serve, é necessário entender seus pilares.

inserir a descrição da imagem aqui

Aqui tem um bom resumo deles.

Resiliente: Reage às falhas; aplicações reagem e se recuperam de
falhas de software, hardware e de conectividade;

Ou seja, na ocorrência de uma falha, a aplicação teria a inteligência de realizar uma ação sem a interversão do usuário. Um cenário seria a chamada de um serviço remoto: imagine que em uma determinada chamada a esse serviço não responda, logo uma exceção de time out será lançada em um cenário normal. Já na programação reativa, uma ação seria tomada para que de alguma forma a falha seja corrigida, por exemplo: aguarde x minutos e tente novamente.

Message Driven; Uma arquitetura orientada por mensagens é a base das aplicações reativas. Um aplicativo orientado por mensagem pode ser conduzido por eventos, com base em ator ou uma combinação dos dois.

Um sistema baseado em eventos é baseado em eventos que são monitorados por zero ou mais observadores. Isso é diferente da programação não reativa, porque o chamador não precisa bloquear a espera de uma resposta da rotina invocada. Os eventos não são direcionados para um endereço específico, mas sim são vistos (ou ouvidos).

A concorrência baseada em ator é uma extensão da arquitetura de passagem de mensagens, onde as mensagens são direcionadas para um destinatário, que passa a ser um ator. As mensagens podem atravessar limites de thread ou serem passadas para a caixa de correio de outro ator em um servidor físico diferente. Isso permite a elasticidade – escalando a demanda – à medida que os atores podem ser distribuídos pela rede, ainda assim se comunicam entre si como se todos estivessem compartilhando a mesma JVM.

A principal diferença entre mensagens e eventos é que as mensagens são direcionadas enquanto os eventos acontecem . As mensagens têm um destino claro, enquanto os eventos podem ser observados por zero ou mais observadores .

Responsivo: Um sistema responsivo é rápido para reagir a todos os usuários (sob condições boas ou não) para garantir uma experiência ricas e “tempo real” de usuário consistentemente positiva.

A rapidez e a experiência positiva do usuário em várias condições, como a falha de um sistema externo ou uma onda de tráfego, depende dos dois traços de uma aplicação Reativa: resiliência e escalabilidade . Uma arquitetura orientada por mensagens fornece a base geral para um sistema responsivo.

Por que uma arquitetura orientada por mensagens é tão importante para a capacidade de resposta?

O mundo é assíncrono. Aqui está um exemplo: você está prestes a preparar um café, mas você percebe que está sem creme e açúcar.

Uma possível abordagem seria:

  • Comece a preparar o café.
  • Vá para a loja enquanto o café está se preparando.
  • Compre creme e o açúcar.
  • Volte para casa.
  • Beba café imediatamente.
  • Aproveite a vida.

Outra possível abordagem:

  • Vá para a loja.
  • Compre creme e açúcar.
  • Volte para casa.
  • Comece a preparar o café.
  • Observe com paciência o café à medida que ele é feito.
  • Experimente o café.
  • Aproveite a vida.

Como você pode ver claramente, uma arquitetura orientada por mensagem fornece um limite assíncrono que o desacoplará da hora e do espaço .

Elástico: Reage à demanda/carga: aplicações podem fazer uso de múltiplos núcleos e múltiplos servidores;

Um sistema escalável é facilmente atualizado sob demanda para garantir a capacidade de resposta em várias condições de carga.

O Akka. Net aborda muito bem esses assuntos em uma forma de autor, onde, no caso de um aumento espontâneo de acesso a um servidor, seu gerenciamento é quase de forma automática ou em caso de alguma falha em um dos autores uma decisão e tomada pelo autor que fez a chamada.

Aqui tem uma boa demostração do uso de autor do akka.

Agora as perguntas.

Onde deve ser usada?

O cenário mais utilizado que tenho visto é em aplicação com grandes volumes de chamadas e de mudanças repentinas de acessos, mas nada impede de ser usada em qualquer outro sistema.

Tem um exemplo simples?

No site do akka.net é abordado vários conceitos de como implementar.

Qual é o mecanismo concreto usado para isto funcionar? Concreto até
onde pode ser, entendo que em programação tudo é abstração a não ser
os elétrons excitados 🙂

Conforme mencionado na outra resposta. Um dos mecanismos é o Observer, o stream do Akka.net e o Polling, levam a mesma abordagem, embora mesmo assim não vejo a abordagem completa.

No akka.net um dos conceito usado é o de autores onde um acompanhamento sobre as atividades de uma aplicação e monitorada por um supervisor, cada subordinado repassar a seu supervisor o que esta acontecendo a si, na ocorrência de de uma falha uma resposta e repassada para o supervisor e uma ação é tomada de acordo com a falha.

Só funciona entre agentes locais ou um deles pode ser remoto? É por
causa da internet?

Engloba os dois cenários, tanto pode ser aplicado em agente locais como remoto, (É por causa da internet), muitas mudanças ocorrem pela bendita internet (save internet) e umas delas é sim programação reativa.

Aparentemente tem que ter robustez para ser classificada assim?
Precisa rodar em vários servidores? Ou é uma opção?

Não, poder ser uma aplicação simples.

É um paradigma? É um framework? Posso usar em .NET?

São padrões que podem ser implementados com .NET sim, como falado anteriormente sobre as bibliotecas POLLY.NET, AKKA.NET. o akka pode ser usando em c#, Java entre outras.

Resumindo;
Programação reativa, permitem aplicações mais disponíveis, mais rápidas e mais confiáveis, capazes de se auto recuperarem e se gerenciarem.

Com a ajuda de ferramentas como o Akka, Polly, WebSockets, DynamoDB, EC2, Autoscaling e Serviços de Mensagens (SQS, SNS, SWF). Podemos construir aplicações reativas com esforço relativamente baixo.

A resposta foi elaborada sem focar muito nos pilares da programação reactiva, deixei uma secção dedicada para explicar como cada um dos pilares se mapeia a cada um dos pontos da minha resposta

Definição de reativo

Antes de explicar o que é programação reativa creio que vale a pena explicar qual é o significado de reativo na infopedia

Que reage.

Ou seja, algo que acontece em consequência de um acontecimento/evento anterior

Programação reativa

Se o conceito de programação reativa existe, então também existe o conceito de programação não reativa. Vou demonstrar os dois com o seguinte código:

//Programção não reativa

console.log(prompt('Introduza um texto'));

//programação reactiva

function userInput(msg, action){
  action(prompt(msg));
}

userInput('Introduza um texto', console.log);

Existe um diferença subtil nos excertos de código. O primeiro pode ser descrito da seguinte forma:

Abre uma janela para o utilizador introduzir texto O utilizador
introduz texto O texto que o utilizador introduziu é escrito na consola

Enquanto o segundo pode ser descrito da seguinte forma

Quando o utilizador escrever o texto na janela, escreva o texto na consola

Com este exemplo você chega á conclusão que sempre que usa callbacks você está a programar reativamente.

Você não tem mais uma linha de fluxo de instruções continua no seu código. Em vez disso você vai usar e abusar dos callbacks para estabelecer o que acontece quando determinada operação for concluída.

Programação reativa com eventos

Se alguma vez já trabalhou com user interface então é quase certo que você já tenha usado programação reativa.

Por exemplo, quando você adiciona um handler para um evento de um botão você está a estipular o que acontece quando o utilizador clica no botão.

Este é um exemplo particular do uso de callbacks discutido anteriormente.

Aliás esta prática é tão conhecida que existe um paradigma próprio para esta forma de programar. Ela é conhecida como Programação orientada a eventos

Programação reativa e operações de longa duração

Outro sitio onde é comum ver o uso de programação reativa é em operações de longa duração, especialmente se estas tiverem um interface assíncrona. Um dos mais conhecidos entre programadores são os pedidos AJAX.

Deixo aqui um exemplo semelhante a uma das perguntas referidas.

var now = performance.now();
var request = new XMLHttpRequest();

request.onreadystatechange = function A() {
  if (request.readyState == 4 && request.status == 200) {
    console.log("API SE " + ~~(performance.now() - now) + "ms");
  }
}

request.open('GET', 'https://api.stackexchange.com/2.2/answers?order=desc&sort=activity&site=stackoverflow', true);
request.send();

Mais uma vez aparecem os callbacks, você especifica qual o código que quer executar quando o pedido for satisfeito pelo servidor e a resposta chegar ao seu programa.

Programação reativa TUDO EM 1

Se você chegou até aqui deve estar pensando que afinal de contas já programou reativamete e sim praticamente todos nós já o fizemos.

A novidade agora está nas frameworks que lhe tentam proporcionar APIs genéricas para programar reativamente. Mais em particular a framework Reactive, disponível em várias plataformas

Esta framework juntas 3 funcionalidades numa única API.

  • Eventos
  • Dados
  • Processamento assíncrono e ou paralelo

Se me é permitido eu gostava de fazer um paralelo á linguagem C# e plataforma .NET. Básicamente a framework junta eventos com Task e com o IEnumerable com os respetivos métodos Linq e mais uns extra.

Em particular esta framework tem um cuidado especial no que toca ao tratamento de eventos. Mesmo com um número reduzido de eventos é possível você necessitar de diversas formas de os processar, nomeadamente em relação á ordem dos eventos e á eventual possibilidade de existência de falhas.

A API fornece-lhe já um conjunto bastante satisfatório de possibilidades mas haverá casos onde você deverá ter um cuidado extra para saber se realmente os eventos estão a acontecer na ordem que você deseja, pelo menos foi essa a minha experiência. Você pode dar uma olhada nos diagramas da framework, deixo aqui um:

inserir a descrição da imagem aqui

Eu gostava de deixar aqui dois exemplos de utilização desta framework em C# que já me foram úteis em ambiente profissional e são relativamente simples de entender.

Observador de ficheiros numa diretoria

public IObservable<FileSystemEventArgs> Watch(string path, bool includeExistingFiles = false)
{
    var watcher = new FileSystemWatcher(path, "*.*");
    watcher.IncludeSubdirectories = true;


    var observable = Observable.FromEventPattern(watcher, "Created")
        .Merge(Observable.FromEventPattern(watcher, "Deleted"))
        .Merge(Observable.FromEventPattern(watcher, "Changed"))
        .Merge(Observable.FromEventPattern(watcher, "Renamed"))
        .Select(a => a.EventArgs as FileSystemEventArgs);
    if (includeExistingFiles)
    {
        var currentFiles = Directory.EnumerateFiles(path, "*.*", SearchOption.AllDirectories)
            .Select(f => new FileSystemEventArgs(WatcherChangeTypes.Created, Path.GetDirectoryName(f), Path.GetFileName(f)));
        observable = observable.Merge(currentFiles.ToObservable());
    }
    watcher.EnableRaisingEvents = true;
    return observable;
}

Executando um processo e retornando um observable

public IObservable<EventArgs> ExecuteProcess(string path, string parameters)
{
    var process = new Process() {
        StartInfo = new ProcessStartInfo(path, parameters)
        {
            UseShellExecute = false,
            CreateNoWindow = true,
        },
        EnableRaisingEvents = true
    };
    var observable = Observable.FromEventPattern(process, "Exited")
        .Select(a => (EventArgs)a.EventArgs);

    process.Start();
    return observable;
}

Programação reativa conclusão.

Eu não sei onde o @Yonathan foi buscar os pilares da programação reactiva, mas não obstante parecem-me ser totalmente válidos:

  • Elástico: Reage à demanda/carga: aplicações podem fazer uso de múltiplos núcleos e múltiplos servidores;
  • Resiliente: Reage às falhas; aplicações reagem e se recuperam de falhas de software, hardware e de conectividade;
  • Message Driven: Reage aos eventos (event driven): em vez de compor aplicações por múltiplas threads síncronas, sistemas
    são compostos de gerenciadores de eventos assíncronos e não
    bloqueantes;
  • Responsivo: Reage aos usuários: aplicações que oferecem interações ricas e “tempo real” com usuários.

Se acompanhou a resposta até agora sabe que tudo isso é verdade.

É message driven porque você diz quando fazer.

É responsivo porque só faz a operação está completa (não bloqueia)

É resilitente. Pelo menos o Reactive tem uma extensao, que lhe permite tentar executar determanido evento um número de vezes.

É elástico. Pelo menos na framework .net decide por voce quantas threads a framework deverá usar.

Respondendo a outras perguntas suas

É um paradigma?

A wikipedia diz que sim, ênfase meu.

In computing, reactive programming is an asynchronous programming
paradigm

Gostava só de adicionar que para além do programação orientada a eventos já mencionada por mim, a programação reativa traz elementos novos suficientes para ser considerado um paradigma diferente. Lembre-se das tres funcionalidades que mencionei: Eventos, Dados, Processamento assíncrono e ou paralelo

Só funciona entre agentes locais ou um deles pode ser remoto? É por
causa da internet?

Não é por causa da internet mas sim porque alguém determinou que havia um problema para resolver. Que eu saiba não havia nada até agora que lhe permitisse juntar estas três funcionalidades duma forma elegante e fácil de manusear.

Aparentemente tem que ter robustez para ser classificada assim?
Precisa rodar em vários servidores? Ou é uma opção?

Se prestou atenção á minha resposta eu não dei muito atenção a robustez e muito menos falei em vários servidores.

Apenas mencionei que pode ser possível, com a framework reactive, tentar executar determinada operação novamente, se ela falhar.

A programação reativa pode ou no ser usada em ambientes distribuídos, a robustez vai depender de como o seu sistema distribuído estiver implementado bem como todos os serviços que participam nele.

Fonte

Related Posts:

Qual a diferença entre AppCompatActivity e Activity? – android android-activity
Pergunta: Qual a diferença da AppCompatActivity para Activity ? A partir de qual versão a AppCompatActivity foi adicionada ao Android? Autor da pergunta Luhhh A diferença reside ...
Como abreviar palavras em PHP? – php string
Pergunta: Possuo informações comuns como nome de pessoas e endereços, e preciso que elas contenham no máximo 30 caracteres sem cortar palavras. Exemplo: 'Avenida Natalino João Brescansin' ...
Qual é a finalidade de um parêntese vazio numa declaração Lambda? – c# expressões-lambda característica-linguagem
Pergunta: Criei um exemplo de uma declaração Lambda sem argumentos, entretanto, estou com duvidas referente a omissão do parêntese vazio () na declaração. Veja o exemplo: class ...
Boas práticas para URI em API RESTful – api rest restful
Pergunta: Estou com dúvida em relação às URIs de alguns recursos da api que estou desenvolvendo. Tenho os recursos projetos e atividades com relação 1-N, ...
Dúvidas sobre a integração do MySQL com Java – java mysql netbeans
Pergunta: Estou criando um sistema no NetBeans, utilizando a linguagem Java e o banco de dados MySQL. Escrevi o seguinte código para realizar a conexão ...
Qual é a finalidade da pasta Model do framework Inphinit? – php inphinit
Pergunta: No Inphinit micro-framework existe a pasta Model que fica dentro da pasta application, e nela é onde ficam as classes, mas eu estou muito ...
Uso do ‘@’ em variáveis – javascript typescript coffeescript
Pergunta: Vejo em algumas linguagens que compilam para javascript, como TypeScript e CoffeeScript, o uso do @ em variáveis, como também, casos em que o ...
Qual tamanho máximo um arquivo JSON pode ter? – json arquivo
Pergunta: Vou dar um exemplo para conseguir explicar minha duvida: Preciso recuperar informação de imagens vindas de uma API, esse banco de imagens me retorna JSON's ...
O que é Teste de Regressão? – terminologia engenharia-de-software testes
Pergunta: Na matéria de Teste de Software o professor abordou um termo chamado Teste de Regressão, isto dentro da disciplina de teste de software. Sendo ...
O que é um construtor da linguagem? – php característica-linguagem
Pergunta: Em PHP, já li e ouvi várias vezes a respeito dos Construtores da Linguagem. Os casos que sempre ouvi falar deles foi em casos ...
Função intrínseca para converter numérico para string – cobol
Pergunta: Estou a tentar saber se existe alguma função intrínseca do COBOL para converter um data numérico para string sem precisar usar a cláusula REDEFINES: ( ...
Porque usar implements? – java android
Pergunta: Qual a diferença entre usar btn.setOnClickListener(new OnClickListener() { e public class MainActivity extends Activity implements OnClickListener{ Estive fazendo um curso de Android e meu professor falou que ...
O que é XHTML e quando deve ser usado? – html xml xhtml
Pergunta: O que eu sei é que o XHTML precisa ser XML válido. Isso implica, por exemplo, que todas as tags precisam ser fechadas. Por ...
Uma placa aceleradora de vídeo pode melhorar o desempenho não-gráfico? [fechada] – desempenho
Pergunta: Para desenvolver em Ruby on Rails, eu utilizo aqui uma máquina virtual do VirtualBox com Ubuntu Server 14.04 sem interface gráfica instalada. Recentemente descobri uma ...
Concat() VS Union() – c# .net
Pergunta: Qual a diferença entre Concat() e Union() ? Quando usar Concat() e quando usar Union() ? Somente pode ser usado em list ? ...

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *