December 14, 2023
1. Reactive Mircroservice의 Reactive # Spring cloud # Reactive systems의 핵심 가치 # Responsive(응답성) # 요구사항 문제를 신속하게 탐지하고 효과적으로 대처 신속하고 일관성 있는 응답 시간 제공 신뢰할 수 있는 상한선을 설정하여 일관된 서비스 품질을 제공 결과 가능한 한 즉각적으로 응답 사용자의 편의성과 유용성의 기초 오류 처리를 단순화 일반 사용자에게 신뢰를 조성하고, 새로운 상호작용 촉진 Resilient(복원력) # 요구사항 복제, 봉쇄, 격리, 위임에 의해 실현 장애는 각각의 구성 요소에 포함 (봉쇄) 구성 요소들은 서로 분리 (격리) 복구 프로세스는 다른(외부의) 구성 요소에 위임 (위임) 필요한 경우 복제를 통해 고가용성이 보장 (복제) 결과 장애에 직면하더라도 응답성을 유지 시스템이 부분적으로 고장이 나더라도, 전체 시스템 을 위험하게 하지 않고 복구 할 수 있도록 보장 구성 요소의 클라이언트는 장애를 처리하는데에 압박을 받지 않습니다 Elastic(유연성) # 요구사항 경쟁하는 지점이나 중앙 집중적인 병목 현상이 존재하지 않도록 설계 구성 요소를 샤딩하거나 복제하여 입력을 분산 실시간 성능을 측정하는 도구를 제공 응답성 있고 예측 가능한 규모 확장 알고리즘을 지원 결과 작업량이 변화하더라도 응답성을 유지 입력 속도의 변화에 따라 이러한 입력에 할당된 자원을 증가시키거나 감소 상품 및 소프트웨어 플랫폼에 비용 효율이 높은 방식으로 유연성을 제공 Message Driven(메시지 기반) # 비동기 통신: 구성 요소는 서로 비동기적으로 메시지를 주고 받으며, 독립적인 실행을 보장한다.
...
December 14, 2023
2. Reactive Mircroservice의 Microservice # Monolithic 아키텍쳐 # 모든 컴퍼넌트가 하나의 서버 내에 존재 단순성: 코드 저장소가 하나로 존재하는 경우가 많아서 관리 포인트가 줄어든다 일관성: 각각의 서비스는 하나의 기술 스택으로 제공되기 때문에 접근성이 높다 높은 효율: 서비스 사이에 네트워크 통신이 없기 때문에 네트워크 지연이나 데이터 직렬화에 의한 오버헤드가 없다 Monolithic 아키텍쳐의 단점 # 확장성의 한계: 모든 서비스가 하나의 서버로 구성되어 있기 때문에 특정 서비스가 부하를 받더라도 서버 전체를 늘려야 한다 장애의 전파: 서비스 중 한 곳에서 문제가 발생하면 시스템 전체에 영향을 줄 수 있다 배포의 단일화: 하나의 서비스를 변경하더라도 전체 시스템을 다시 배포해야 한다 기술의 정체: 모든 서비스가 하나의 코드베이스에 결합되어 있어서 새로운 기술을 도입하거나 아키텍쳐의 변경이 전체에 큰 영향을 줄 수 있다 유지보수의 어려움: 모든 구성요소가 직접 연결 되어 있기 때문에 작은 부분의 수정이 전체에 영향을 미칠 수 있다 Microservice 아키텍쳐 # 이러한 단점을 극복하기 위해 서비스와 저장 소, 데이터베이스 등을 분리 독립적인 배포: 각 서비스는 독립적으로 배포 유연한 확장: 각 서비스는 각각 탄력적으로 확장 가능.
...
December 14, 2023
1. Redis 소개 # Redis instance # 여러 client가 하나의 redis 서버로 요청 전달 단일 redis 서버에 문제가 발생하면 장애 -> 모든 client에서 접속 불가 Redis replication # master와 replica로 구성 master에 데이터가 업데이트 -> replica 동기화 replica : 읽기만 가능 replica에 문제 발생 -> 여러 node에 data가 복제되었기 때문에 복구 가능 master에 문제 발생 -> 개발자가 직접 replica 중 하나를 master로 변경 Redis sentinel # master에 문제 발생 -> replica들이 master를 선출 이전 master가 복구 된 경우, replica로 전환되어 새로운 master를 바라보게된다.
...
December 14, 2023
2. Lettuce # 구조 # Reactor 기반으로 Reactive API 지원 Reactive streams API 지원 동기 API, 비동기 API 모두 지원 Netty 기반으로 높은 성능과 확장성 제공 일반 TCP 통신 뿐만 아니라 epoll, kqueue 기반의 multiplexing I/O 지원 주요 컴포넌트 # RedisClient : Redis의 연결 정보를 포함하는 객체 Netty의 Channel, EventLoopGroup 등을 포함하기 때문에 가능한한 재사용 RedisConnecction 생성 StatefulRedisConnection : Redis 서버 Connection 여러 쓰레드가 동시에 접근해도 안전 동기, 비동기, Reactive command를 제공 RedisReactiveCommand : Redis API와 관련된 reactive command 제공 RedisReactiveCommand 획득 # RedisClient.
...
December 14, 2023
3. ReactiveRedisTemplate # ReactiveRedisTemplate # ReactiveRedisTemplate은 Spring data redis reactive의 추상화 클래스 ReactiveRedisConnectionFactory를 통해서 RedisConnection을 주입 ReactiveRedisConnectionFactory # ReactiveRedisConnectionFactory는 RedisConnection을 제공 LettuceConnectionFactory와 JedisConnectionFactory 구현체 RedisTemplate bean # RedisReactiveAutoConfiguration를 통해서 자동으로 ReactiveRedisTemplate bean 생성 JdkSerializationRedisSerializer는 ObjectOutputStream을 이용하여 key와 value로 주어지는 object를 binary로 변환 key, value에 대해서 String만 지원하는 ReactiveStringRedisTemplate bean도 등록 ReactiveRedisOperations # ReactiveRedisConnection에 직접 접근할 수 있는 execute, executeInSession 메소드 pub/sub 메소드 key와 관련된 메소드 스크립트 메소드 operations 접근 메소드 pub/sub # convertAndSend: destination 채널로 message를 전달하고 메시지를 받은 클라이언트의 숫자를 반환 listenToChannel: channels에 주어진 채널들을 listen하고 메시지를 Flux 형태로 전달 key 관련 # hasKey: EXISTS.
...
December 14, 2023
4. ReactiveOperations # ReactiveValueOperations 실행 # set으로 특정 key에 value를 추가 setIfAbsent로 key에 값이 없을때만 설정 get으로 key의 value를 조회 multiGet으로 여러 key에 접근 increment로 특정 key의 value를 증가 ReactiveListOperations # size: LLEN. list의 크기를 반환 leftPush: LPUSH. list의 head에 값을 추가 rightPush: RPUSH. list의 tail에 값을 추가 set: LSET. 특정한 index에 값을 설정 remove: LREM. list에서 value를 count 숫자만큼 제거 leftPop: LPOP. list의 head에서 값을 제거하고 반환 rightPop: RPOP.
...