1. 분산락의 필요성과 레디스의 분산락(RedLock) [ 분산락의 필요성 ] 분산 환경에서는 서로 다른 클라이언트가 공유 리소스를 사용하는 경우가 많이 있다. 기본적으로 레디스(Redis)는 싱글 스레드로 동작하기 때문에, 단일 레디스 노드를 구축해 사용해도 동시성 문제가 발생하지 않는다. 따라서 리소스에 대해 값을 설정하여, 값이 설정된 경우에는 다른 리소스의 접근을 차단할 수 있다. 이를 잠금이라고 표현할 것이며, 이를 위해 다음과 같은 명령을 사용할 수 있다. // key, value를 저장하는데 NotExists일 경우에만 저장하고, 30초(30000ms) 동안 유지해줘 SET key value NX PX 30000 리소스에 대한 잠금을 해제하는 것은 다음의 명령으로 가능하다. DEL key 하..
이번에는 서비스 메시(Service Mesh)가 무엇인지 알아보고, 서비스 메시가 갖는 문제와 이를 해결하기 위한 쿠버네티스(Kubernetes)의 SidecarContainers에 대해 알아보도록 하겠습니다. 1. 서비스 메시(Service Mesh)의 등장 [ MSA와 함께 부각되는 인프라 문제들 ] 기존의 모놀로식(Monolithic)에서 마이크로서비스 아키텍처(MicroService Architecture)로 전환하면서 많은 변화가 생겼다. 특히 기존에는 겪지 않았던 인프라와 관련된 문제(특히 네트워크)들이 더욱 중요해졌다. Client-side load balancing: 호출 가능한 엔드포인트 목록을 클라이언트에게 주고, 직접 결정하도록 함 Service discovery: 정상 상태인 서비스..
이번에는 유지보수하기 좋은 멀티 모듈 구조를 설계하는 기준과 그에 따른 고려사항에 대해 알아보도록 하겠습니다. 아래의 내용은 절대적인 기준이 아니며, 상황에 따라 달라질 수 있음을 참고 부탁드립니다. 또한 해당 내용은 인프콘 2023에서 발표한 내용이니, 인프콘 영상을 통해서도 참고 하실 수 있습니다. 발표자료는 여기서 확인하실 수 있고, 예시로 설계된 구조는 깃허브에서 확인하실 수 있습니다. 1. 멀티 모듈 설계하기, 모듈을 나누는 기준 시스템에 독립적인 공통 코드 분리하기 서로 다른 수준(속도)의 공통 코드 분리하기 서로 다른 기능의 모듈 분리하기 서로 다른 액터의 모듈 분리하기 [ 시스템에 독립적인 공통 코드 분리하기 ] 가장 먼저 공통 코드를 분리시킬 수 있고, 공통 코드는 “시스템 종속성”을 기..
이번에는 Gradle(그레이들)이 제공하는 Java 플러그인과 implementation와 api의 차이에 대해 알아보도록 하겠습니다. 1. Gradle Java 플러그인, Java-Library 플러그인 [ Java 플러그인이란? ] Gradle(그레이들)에서 Java 프로젝트를 빌드하려면 기본적으로 java 플러그인이 필요하다. java 플러그인을 통해 컴파일, 테스트, jar 파일 생성 등의 작업들(tasks)이 수행 가능하다. plugins { id 'java' } Java 플러그인이 제공하는 작업들은 아래의 그림에 나와있다. 자세한 내용은 공식 문서를 참고하도록 하자. 자바로 작성된 프로그램은 먼저 Java 파일들을 컴파일하여 바이트 코드(.class)로 만들어내고, 이를 JVM이 읽어들인다. ..
아래의 내용은 Nginx 설정을 정리한 부분입니다. 관련 코드는 깃허브에 올려두었고, 가능한 모든 부분에 주석을 남겨두었으니, 상황에 맞게 수정해서 사용하시면 됩니다. 1. Nginx 예시/샘플 설정 공유 [ Nginx 설정 파일들 ] 실무에서 사용되는 Nginx 설정은 꽤나 복잡한데, 이를 아래와 같이 분리하였습니다. mime.types: Nginx 서버에서 처리할 MIME 타입 모음 upstream.conf: upstream(서버 그룹)을 모아둔 설정 파일 header.conf: 요청을 다른 서버로 프록시할 때, 전달해주는 헤더 설정 파일 ssl.conf: SSL과 관련된 설정 파일, SSL 인증서 파일을 경로로 참조함 ssl-server.conf: SSL 요청(443 포트)로 들어오는 요청과 관련된..