Uma configuração necessária quando o Java envia e-mail!

Prefácio

Apenas uma cabeça calva pode se tornar mais forte.

O texto foi incluído no meu repositório GitHub, bem-vindo ao Star: https://github.com/ZhongFuCheng3y/3y

Encontrei um problema ao enviar e-mails online, registre-o.

Primeiro, fale sobre o fundo

Um dia, Xiao Wang me deu um feedback: "Obrigado por verificar o status de envio do e-mail online, descobri que o envio falhou."

Fui ao DB para verificar a situação de envio de e-mail recente e disse: "Parece normal e não há nenhuma situação anormal online. Talvez o e-mail tenha se acumulado no redis e ainda não tenha sido consumido."

select * from email order by id desc limit 100

Deixe-me primeiro falar sobre como envio e-mails aproximadamente:

image.png Como lidar com mensagens de e-mail

Quais são os benefícios de fazer isso? Pense no Redis como uma fila de mensagens e lance todas as solicitações no Redis, o que pode reduzir os picos . A máquina A / B / C do thread em determinados intervalos para levar uma mensagem ao Redis pull e, em seguida, chama a interface de transmissão da mensagem.

E irei fornecer uma função na página para o lado comercial para verificar se várias mensagens foram enviadas com sucesso. Como o envio de emails é uma operação assíncrona , os ex-colegas buscam o tempo real ao escrever .

  • A lógica atual é: se o push para o Redis for bem-sucedido e não houver mensagens acumuladas no Redis (indicando que a máquina A / B / C pode processar o e-mail a tempo), o e-mail é considerado enviado com sucesso.

PS: (Se não houver nenhum problema no sistema, esta implementação está OK. Porque a quantidade de e-mail enviada geralmente não é muito grande (o Redis não acumula mensagens), e a taxa de sucesso de envio de e-mail também é bastante alta .

Voltando à pergunta, por causa do histórico acima, imaginei se este e-mail ainda estava empilhado no Redis quando Xiao Wang verificou os resultados, então ele simplesmente retornou diretamente e falhou. Com certeza, verifiquei o Redis e ainda havia 200 e-mails sem notícias.

Então perguntei a Xiao Wang: “Quantos e-mails você enviou?” Xiao Wang disse: “500 em 20 minutos, menos de 1qps”. Pensei por um momento: "Então teremos quatro máquinas e, logicamente, não haverá tantas pilhas acumuladas."

Então, fui até o servidor online para olhar o registro de consumo e descobri que apenas uma máquina estava consumindo dados do Redis. Fui verificar o log de erros novamente para ver se havia muitas mensagens de erro, mas nenhum log de erros foi encontrado ...

Portanto, verifiquei as informações de monitoramento da máquina e não encontrei nada de incomum. Portanto, a pergunta é: por que há apenas uma máquina consumindo mensagens do Redis? Os logs e informações de monitoramento das outras três máquinas estão normais.

Dois, resolva

Com base nas informações do log e da máquina, não consegui dizer o que estava errado. Nesse momento, pensei em um comando em Java:jstack

O comando jstack é usado principalmente para visualizar a pilha de chamadas de um encadeamento Java e pode ser usado para analisar problemas de encadeamento (como conflito).

jstack uso detalhado e tutorial:

https://www.cnblogs.com/kongzhongqijing/articles/3630264.html

Então, executei um jstackcomando, procurei "Email" nas informações e descobri:

image.png E-mail bloqueado

Isso é fácil, basta pesquisar palavras-chave como "Encadeamento de caixa de correio de envio de Java bloqueado" e deve haver uma solução.

image.png solução

Por fim, verificou-se que o tempo limite não foi configurado no momento do envio de e-mail , o que fez com que alguns threads fossem bloqueados no envio de e-mail (o motivo específico é desconhecido)

  • mail.smtp.connectiontimeout : limite de tempo de conexão, em milissegundos. É o tempo necessário para estabelecer uma conexão com o servidor de e-mail. O padrão é ilimitado.

  • mail.smtp.timeout : tempo limite para recebimento de e-mail, em milissegundos. Trata-se do período de tempo em que o e-mail é recebido. O padrão é ilimitado.

  • mail.smtp.writetimeout : limite de tempo para envio de e-mail, em milissegundos. Quanto ao tempo de envio do conteúdo ao enviar o e-mail. O padrão também é ilimitado.

Navegação de artigos da conta oficial : navegação de todos os artigos da conta oficial

image.png


Mais de 200 artigos técnicos originais , recursos de vídeo massivos, perguntas de entrevista com mapas cerebrais requintados

Pressione e segure para ler o código a seguir para obter 


Acho que você gosta

Origin blog.51cto.com/15082392/2590350
Recomendado
Clasificación