Processos Síncronos e Assíncronos
Você sabe a diferença entre um processamento síncrono e assíncrono? É bem importante ter essa distinção antes de seguir nossa leitura. Vamos lá:
Imagine a situação onde temos dois processos: A e B. Cada um deles possui sua própria linha do tempo em termos de execução. Agora, na linha do tempo, o processo A chama o processo B, e o comportamento será dado em função do seu tipo:
- Processo Síncrono: O processo A chama o processo B. Neste caso o processo A aguarda o processo B terminar para continuar sua execução.
- Processo Assíncrono: O processo A chama o processo B e continua executando, desta forma A e B seguem paralelos (a linha do tempo não é interrompida). Quando o processo B terminar, notifica o processo A disso.
A imagem abaixo representa em termos gráficos essa execução:
Quando usar processos Síncronos e processos Assíncronos?
Um processo dito Síncrono deve ser usando nas seguintes situações:
- Tarefas rápidas: atividades simples que não vão bloquear o fluxo do sistema por muito tempo como uma validação, ou cálculo rápido ou até algo que utilize caches.
- Operações ordenadas: quando há a necessidade de iniciar um processo apenas quando outro termine, um fluxo num wizard por exemplo.
- Consistência prévia: quando necessitamos de uma informação validada antes se seguir a diante com outro processo, uma validação de formulário ou até mesmo a validação de um CPF/CNPJ.
Já os processos Assíncronos devem ser utilizados nos seguintes casos:
- Tarefas pesadas/Tarefas que bloqueiam fluxo da aplicação: os processos que consomem recursos e são demorados, uma emissão de NF ou o processamento de e-social são exemplos de processos que demoram.
- Evitar congelar a interface: qualquer processamento que traga uma experiência de tempo negativo deve ser levado para processamento assíncrono. Você gostaria de esperar 30 segundos, 1 minuto, 5 minutos ou até mais que isso olhando para uma tela parada? Se sua resposta foi não, esse é um forte candidato a ser um processo assíncrono.
- Executar tarefas em paralelo: tarefas independentes que podem ser quebradas em processos menores (tickets), desta forma ganhando vazão processando muito mais informação em menos tempo (cuidado apenas com os limites de hardware).
Percepções e Métricas
É importante destacar que a percepção de performance pelo usuário é mais importante que a própria performance do sistema, mas como isso é explicado? Temos 3 tipos de respostas para processos:
- Processos síncronos, mas que o usuário espera uma resposta imediata – fluxo de navegação de telas.
- Processos assíncronos, mas que o usuário espera que sejam rápidos – emissão de folha de pagamento, apesar se der um relatório, o usuário espera agilidade na execução.
- Processos assíncronos, mas que o usuário não espera imediatismo – cuidado com as divisões de processos, pois um processo em background pode competir com outros processos disparados pelo sistema ou até mesmo outros usuários, o que pode impactar muito no tempo de execução do processo.
Já quanto as métricas, alguns números que devemos observar para a carga de uma página:
Tempo | Sentimento |
de 0s a 0.1s | Perfeito |
de 0.1s a 1.0s | Aceitável |
de 1.0s a 10s | Problemático |
mais de 10s | Inviável |
É importante dar um feedback visual para o usuário quando os tempos estão na casa de 1.0s, devemos sempre evitar deixar o usuário no “escuro” sem notificações.
O que a Benner oferece para processamento paralelo?
Uma das ferramentas oferecidas é o BTL – Business Tasks Library, que é um conjunto de componentes para disparo de tarefas mais longas e pesadas com disparo em segundo plano, provendo: controle, performance e escalabilidade (tanto horizontal quanto vertical, mas muito mais focado em escalabilidade horizontal).
Vale destacar as novas implementações do BTL:
- WithPriority: para definir as prioridades dos processos, inclusive criando processos que podem furar a fila usando esse parâmetro.
- WithoutProgressBar: feedback visual para o usuário, mostrando os status da situação do processo.
Além disso, é importante ficar atendo à granularidade dos processos, para que os provideres não fiquem alocados com um processo imenso, utilize sempre a estratégia de quebrar em tickets menores os processos grandes. Atenção, pois muita granularidade também pode ser um problema, já que a inicialização pode consumir processamento. Tente buscar o cálculo que seja mais equilibrado.
Outra ferramenta importante da tecnologia para processamento paralelo é o Benner Tasks Worker, ele é o serviço que monitora a fila de processos do BTL e distribui as tarefas para serem executadas nos provideres. A fila pode ser tanto através do banco de dados quanto serviços de mensageria.
O Worker pode ser inicializado pelo BServer (podendo ser personalizado através do ServerManager, sem necessidade de configuração), entretanto oferece a desvantagem de não ser flexível e escalável. Outra forma de configurar Worker é fazer a instalação como um serviço do Windows. Nesta abordagem, temos a vantagem de flexibilização dos processamentos, como chamada remota e até priorização dos processos e filas.
Uma dica para detecção de eventuais problemas, podemos habilitar o log de depuração, visualizar o Event Viewer ou o Worker Sniffer.
Para saber mais
Temos uma vasta gama de materiais sobre o assunto na Wiki:
Além disso, em nossa trilha de treinamento da tecnologia temos uma série de vídeos falando BTL, o primeiro vídeo da série é:
E para complementar, temos um BE.TECH gravado pelos nossos especialistas Danilo Pereira da Silva e Matheus Silva Ribeiro, o vídeo é esse:
Espero que tenha gostado, te vejo no próximo post, um abraço,
Danton C. Franco Junior
#TimeTec