요약:
아키텍처, 분산, 로그 큐 및 제목 자체는 로그 컬렉션 기능이지만 중간에 Redis가 추가되어 메시지 대기열을 만듭니다. 메시지 대기열이 필요한 이유는 무엇입니까? 시스템에 "생산"및 "소비"와 같은 요인이 일치하지 않으면 두 당사자 간의 차이를 연결하기 위해 추상층 역할을하는 메시지 큐가 필요합니다.
아키텍처, 분산, 로그 큐 및 제목 자체는 로그 컬렉션 기능이지만 중간에 Redis가 추가되어 메시지 대기열을 만듭니다.
메시지 대기열이 필요한 이유는 무엇입니까?
시스템에 "생산"및 "소비"와 같은 요인이 일치하지 않으면 두 당사자 간의 차이를 연결하기 위해 추상층 역할을하는 메시지 큐가 필요합니다.
예를 들어, 우리 시스템에서 전송하는 일반적인 이메일 및 SMS는 큐에 적시에 응답이 필요하지 않은 이러한 기능을 작성하고 프로세스 요청을 비동기 적으로 요청하며 응답 시간을 줄입니다.
그것을 달성하는 방법?
시장에는 많은 성숙한 JMS 메시지 큐 미들웨어 제품이 있지만 현재 프로젝트 아키텍처 및 배포 상황을 기반으로 Redis를 메시지 큐로 사용합니다.
왜 Redis를 사용합니까?
Redis의 목록 데이터 구조는 "이중 엔드 큐"의 특성을 가지고 있으며 Redis는 데이터를 지속 할 수있는 기능이 있으므로 Redis는 분산 큐를 구현하기에 매우 안전하고 신뢰할 수 있습니다.
기능과 신뢰성 (트랜잭션)이 JMS만큼 엄격하지 않다는 점을 제외하고는 JMS의 "큐"와 유사합니다. Redis 자체는 고성능 및 "편리한"분산 디자인 (복제본, 샤딩)을 보유하고있어 "분산 대기열"을 구현하기위한 좋은 기초를 제공 할 수 있습니다.
제공자 측
이 프로젝트는 타사 Redis 플러그인 스프링-다타 레디스를 사용합니다. 사용 방법이 확실하지 않으면 Google 또는 Baidu를 알려주십시오.
redis.properties :
#Redis 구성 센터 redis.host = 192.168.1.180redis.port = 6379redis.password = 123456redis.maxidle = 100 redis.maxactive = 300 redis.maxwait = 1000 redis.testonborpe = true redis.timeout = 100000
Redis 구성 :
<!-redis configuration-> <bean id = "jedispoolconfig" /> <bean id = "jedisconnectionfactory"> <property name = "hostname"value = "$ {redis.host}" /> <property name = "port"value = "$ {redis.port}" /> <속성 이름 = "property name ="property name = "valess" value = "$ {redis.timeout}" /> <속성 이름 = "poolconfig"ref = "jedispoolconfig" /<property name = "usepool"value = "true" /> < /bean> <bean id = "redistemplate"> <property name = "ConnectionCactory"ref = "jedisconnectionfactory" /> < /bean> 단면 로그 구성 (Pseudocode) :
/*** 시스템 로그, 패싯 프로세싱 클래스* Creator XIAOQI 2012* 제작 시간 2018 년 1 월 15 일*/@component@scope@scope@scope syslogaspect {@autowired private redistemplate <string, String> redistemplate; // 주석은 Swagger API를 기반으로하며 @pointcut ( " @annotation (io.swagger.annotations.apioperation)") public void logpointcut () {} @around ( "logpointCut ()") {object result = point.proceate (proceedingjoinpoint point) {object result = point.proceate (proceedingjoinpoint point) {객체 주로 포인트 포인트 (proceedingjoinpoint point)를 주변에 공개 객체 ( "logpointCut ()")를 정의 할 수도 있습니다. // ITSSTYLE_LOG 채널에 로그 메시지를 쓰기 redistemplate.convertAndSend ( "itstyle_log", "로그 데이터, 직접 처리"); 반환 결과; }}소비자 측
Redis 구성 :
<!-redis configuration-> <bean id = "jedispoolconfig" /> <bean id = "jedisconnectionfactory"> <property name = "hostname"value = "$ {redis.host}" /> <property name = "port"value = "$ {redis.port}" /> <속성 이름 = "property name ="property name = "valess" value = "$ {redis.timeout}" /> <속성 이름 = "poolconfig"ref = "jedispoolconfig" /> <property name = "usepool"value = "true" /> < /bean> <bean id = "redistemplate"p : connection-factory-ref = "jedisconnectionfactory"> <keysserializer "> < /property>. 이름 = "hashkeyserializer"> <bean/> </property> </bean> <!-구현 클래스 듣기-> <bean id = "청취자"/> <bean id = "stringRedisserializer"/> <redis : 리스너-함유자 연결-팩토리 = "JediscOnteContainer"> <!-주제는 모니터를 나타내는 채널을 나타냅니다. <redis : 리스너 ref = "Listener"Serializer = "StringRedisserializer"메소드 = "handlelog"topic = "itstyle_log"/</redis : Listener-Container>듣기 인터페이스 :
public Interface MessagedEgatEListener {public void handlelog (Serializable Message);}듣기 구현 :
public class messagedegatelistenerimpl은 messagedegatelistener {@override public void handlelog (serializable message) {if (message == null) {system.out.println ( "null"); } else {// 프로세스 로그 데이터}}}Q & A
【질문 1】 왜 Redis를 사용합니까?
실제로, Kafka, RabbitMQ 및 RocketMQ와 같이 시장에 많은 안정적인 제품이 있지만, 위의 설명이 이미 있습니다. 그러나 프로젝트 자체는 Redis를 분산 캐시로 사용하므로 Redis는 문제와 타당성을 절약하는 원칙에 따라 선택됩니다.
[질문 2] 로그 데이터를 저장하는 방법?
원칙적으로 MySQL과 같은 관계형 데이터베이스에 저장하는 것이 좋습니다. 결국 생성 된 로그 수는 엄청나이므로 Elasticsearch와 같은 비 관계형 데이터베이스에 저장하는 것이 좋습니다.
[질문 3] 단면 로그 모음은 어떻게 구현됩니까?
섹션 로그는 스프링 아세트 관련 JAR 패키지를 도입해야하며 구성으로 인해 Spring이 CGLIB 프록시를 채택하게합니다.
오픈 소스 프로젝트 소스 코드 (참조) : https://gitee.com/52itstyle/spring-boot-mail
요약
위는 편집자가 소개 한 Javaweb 프로젝트 아키텍처를위한 Redis 분산 로그 큐입니다. 나는 그것이 당신에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!