New Relic for Java inclui um conjunto de métodos API para instrumentação personalizada de atividade assíncrona. Isto é mais útil para a atividade do instrumento assíncrono em frameworks não suportados, mas você também pode usar a API para adicionar instrumentação a frameworks suportados. Este documento explica como ocorre a atividade assíncrona e como funciona o monitor assíncrono do New Relic.
Operações assíncronas
Com um modelo de programação synchronous , as tarefas de programação geralmente são executadas em uma ordem específica. Uma tarefa deve ser concluída antes do início da próxima tarefa e cada tarefa bloqueia a conclusão da próxima tarefa.
Asynchronous a programação usa um modelo sem bloqueio, para que as tarefas possam ser executadas em paralelo. As tarefas executadas de forma assíncrona são completamente independentes umas das outras em sua execução e inicialização. Como o código assíncrono não é executado em uma ordem específica, todo o poder de processamento do servidor pode ser usado com mais eficiência e as taxas de transferência do aplicativo aumentam.
Troca assíncrona e de thread
Para aplicativos que usam processamento assíncrono, thread-switching ocorre quando um programa ou tarefa alterna de um thread para outro. Compreender essas intercalações assíncronas pode ajudá-lo a decidir quais métodos devem ser instrumentados.
Aqui está um exemplo de método com um controlador que faz solicitações externas em paralelo. Essas solicitações são executadas de forma assíncrona, de modo que cada solicitação é executada independentemente uma da outra e getScoreAsync()
retorna imediatamente após ser chamada. Isso permite que o encadeamento solicitante continue fazendo solicitações enquanto getScoreAsync()
faz uma chamada externa e envia uma resposta.
@ResponseBody@RequestMapping("getScores", method = RequestMethod.Get produces = "text/plain")public String getCreditScores(@RequestParam(name = "uids") uids) { return Arrays.stream(uids.split(",")) .parallel() .map(Integer::valueOf) .map(uid -> getScoreAsync(uid)) .collect(Collectors.toList());}
Algumas dessas solicitações terminarão antes de outras. Alguns podem até terminar depois que o thread solicitante passar para outras tarefas:
Na interface , na visualização em trace de detalhes do rastreamento, a interface exibe a atividade assíncrona como sobreposta no eixo x horizontal.
Assíncrono e tempo de resposta
Response time é definido como a duração de uma transação na perspectiva do solicitante. Para aplicativos assíncronos, o tempo de resposta costuma ser menor que o tempo total de transação. Isso ocorre porque os métodos não precisam esperar a conclusão de todos os métodos anteriores antes de retornar. Como as tarefas podem ser adiadas, o aplicativo pode aproveitar seus recursos limitados e processar as coisas mais rapidamente.
A linha do tempo de resposta do gráfico fornece mais insights sobre o comportamento percebido e a velocidade do seu aplicativo do que o tempo total de transação da web:
one.newrelic.com > All capabilities > APM & services > (select an app) > Summary: na página APM Summary , a atividade assíncrona em um aplicativo Java pode fazer com que o tempo de resposta (a linha azul) seja menor que o tempo total de transação. Isso ocorre porque os métodos não precisam esperar a conclusão de todos os métodos anteriores antes de retornar.
Instrumentação personalizada com API assíncrona
Para implementar instrumentação personalizada de trabalho assíncrono, consulte o guia da API assíncrona do agente Java. Para obter informações gerais sobre como usar a API do agente Java, consulte Guia da API do agente Java.