resumo:
Arquitetura, distribuída, fila de log e o próprio título é uma função de coleção de log, mas um redis é adicionado no meio para fazer uma fila de mensagens. Por que preciso de uma fila de mensagens? Quando fatores como "produção" e "consumo" aparecem no sistema são inconsistentes, é necessária uma fila de mensagens para atuar como uma camada abstrata para preencher as diferenças entre as duas partes.
Arquitetura, distribuída, fila de log e o próprio título é uma função de coleção de log, mas um redis é adicionado no meio para fazer uma fila de mensagens.
Por que preciso de uma fila de mensagens?
Quando fatores como "produção" e "consumo" aparecem no sistema são inconsistentes, é necessária uma fila de mensagens para atuar como uma camada abstrata para preencher as diferenças entre as duas partes.
Por exemplo, o email comum e o SMS enviando em nosso sistema grava essas funções que não requerem resposta oportuna à fila, solicita solicita de forma assíncrona e reduz o tempo de resposta.
Como alcançá -lo?
Existem muitos produtos maduros da fila de mensagens JMS no mercado, mas com base na atual situação de arquitetura e implantação do projeto, usamos o Redis como fila de mensagens.
Por que usar Redis?
A estrutura de dados da lista em Redis possui as características de "filas duplas", e Redis tem a capacidade de persistir dados, portanto, o Redis é muito seguro e confiável para implementar filas distribuídas.
É semelhante à "fila" no JMS, exceto que a funcionalidade e a confiabilidade (transacionalidade) não são tão rigorosas quanto o JMS. O próprio Redis possui alto desempenho e design distribuído "conveniente" (réplicas, sharding), que pode fornecer uma boa base para a implementação de "filas distribuídas".
Lado do provedor
O projeto usa um plug-in de terceiros Redis Spring-Data-Redis. Se você não tiver certeza de como usá -lo, pesquise no Google ou no Baidu.
Redis.Properties:
#Redis Center Redis.Host = 192.168.1.180Redis.port = 6379redis.password = 123456Redis.maxidle = 100 redis.maxactive = 300 redis.maxwait = 1000 redis.testonbororro
Configuração Redis:
<!-Redis Configuration-> <bean id = "jedispoolConfig" /> <bean id = "jedisconnectionFactory"> <propriedade name = "hostName" value = "$ {Redis.host}" /> <propriedade name = "port" = "$ {Redis.port}" /> <ween Name = " name = "timeout" value = "$ {redis.timeout}" /> <propriedade name = "poolconfig" ref = "jedispoolconfig" /> <name name = "usepool" value = "true" /> < /bean> <bean id = "redistemplate"> <nome da propriedade = "conexão") Configuração do log secional (pseudocode):
/*** Log do sistema, classe de processamento de faceta* Criador Xiaoqi 2012* Tempo de criação 15 de janeiro de 2018*/@componente@scope@AspectPublic Classe syslogaspect {@AUTOWIRED PRIVADO REDISTEMPLATE <String, String> Redistemplate; // As anotações são baseadas na API Swagger, e você também pode definir @pointcut (" @anotação (io.swagger.annotações.apioperation)") public void logPointCut () {} @around ("logPointCut ()") public objeto (prosseguir o ponto de popa)) Throwsable; // Escreva mensagens de log no canal de seustyle_log redistemplate.convertandSend ("itstyle_log", "Data de log, processe por você mesmo"); resultado de retorno; }}Lado do consumidor
Configuração Redis:
<!-Redis Configuration-> <bean id = "jedispoolConfig" /> <bean id = "jedisconnectionFactory"> <propriedade name = "hostName" value = "$ {Redis.host}" /> <propriedade name = "port" = "$ {Redis.port}" /> <ween Name = " name = "timeout" value = "$ {redis.timeout}" /> <propriedade name = "poolconfig" ref = "jedispoolconfig" /> <propriedade name = "usepool" value = "true" /> < /bean> <bean id = "Redistemplate" p: conexão-fábrica <propriedade name = "hashKeySerializer"> <bean/> </property> </bean> <!-ouvindo a classe de implementação-> <bean id = "ouvinte"/> <bean id = "stringSerializer"/> <Redis: o lentr-container Factory = "JEDISCONCONCONCIONAL"/> <! -> <Redis: ouvinte ref = "ouvinte" serializer = "stringredisserializer" method = "handleLog" tópico = "itstyle_log"/> </redis: ouvinte-container>Interface de escuta:
Public Interface MessageGelegAtelistener {public void HandleLog (mensagem serializável);}Implementação de escuta:
public class MessageGelegAtelistenerImpl implementa MessAgedElegAtelistener {@Override public void HandleLog (mensagem serializável) {if (message == null) {System.out.println ("null"); } else {// Processar dados de log}}}Q&A
【Pergunta 1】 Por que usar Redis?
Na verdade, já existem explicações acima, embora existam muitos produtos muito estáveis no mercado, como Kafka, RabbitMQ e RocketMQ que você pode pensar. No entanto, como o próprio projeto usa o Redis como cache distribuído, o Redis é selecionado com base no princípio de economizar problemas e viabilidade.
[Pergunta 2] Como armazenar dados de log?
Em princípio, não é recomendável armazená -lo em bancos de dados relacionais, como o MySQL. Afinal, o número de logs gerados é enorme, por isso é recomendável armazená-lo em bancos de dados não relacionais, como o Elasticsearch.
[Pergunta 3] Como a coleta de logs seccionais é implementada?
O log da seção precisa introduzir pacotes JAR relacionados à primavera, e a configuração faz com que o Spring adote um proxy do CGLIB.
Código fonte do projeto de código aberto (referência): https://gitee.com/52itstyle/spring-boot-mail
Resumir
O exposto acima está a fila de log distribuída Redis para a arquitetura do projeto Javaweb apresentada a você pelo editor. Espero que seja útil para você. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a você a tempo. Muito obrigado pelo seu apoio ao site wulin.com!