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:
Como lidar com mensagens de e-mailQuais 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 jstack
comando, procurei "Email" nas informações e descobri:
Isso é fácil, basta pesquisar palavras-chave como "Encadeamento de caixa de correio de envio de Java bloqueado" e deve haver uma solução.
soluçãoPor 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
Pressione e segure para ler o código a seguir para obter