CQRSCommand Query Responsibility Segregation, 명령-조회 책임 분리로 명령(Command)과 조회(Query)의 책임을 분리하는 아키텍처 패턴이다. 이전의 전통적인 CRUD(Create/Read/Update/Delete) 모델에서는 모든 작업이 동일한 하나의 데이터 모델/저장소를 이용했다.CQRS에서는 쓰기와 읽기 작업을 분리해서 각 작업만을 수행하는 DB를 이용해 성능과 확장성을 챙긴 아키텍처를 구축하게 된다. CQRS 구성읽기와 쓰기 작업을 모델별로 분리했기에 아래와 같이 구성된다.Command 모델데이터를 변경(Create, Update, Delete)하는 작업을 수행하는 모델Query 모델데이터를 조회(Query)하기 위한 모델, 오직 조회 작업만 수행한다.이벤..
Application 서비스를 운영하면 버그 패치나 기능 추가, 성능 개선 등으로 새 버전으로 업데이트하는 경우가 빈번하게 발생한다. 특히나 MSA 같은 환경에서는 개별 서비스들의 독립적인 배포가 잦기에 수많은 업데이트와 배포를 거치게 되며 좀 더 효율적인 배포 전략을 세워야한다.이러한 업데이트에서는 '사용자 경험의 연속성'이 중요한 요소가 되는데, 업데이트 과정에 있어서 사용자가 백엔드 단에서 업데이트가 벌어지고 있다는 등의 사실을 인지하지 못한 채로 서비스를 끊임없이 이용할 수 있어야하기 때문이다.이러한 요구를 충족시키기 위해 이른바 '무중단' 업데이트가 중요시 되는데, 이번에는 대표적인 Application 무중단 배포 전략 3가지를 간단한 실습과 함께 알아보도록 한다. Rolling Update기..
Lease공유 리소스를 lock하고, 연결된 노드들 간의 활동을 조정하기 위한, 특정 pod가 일정 기간 동안 리더임을 선언하는 객체여러개의 pod 중에서 하나의 pod만 주어진 시간 동안 대표가 되어서 활동할 수 있도록 하는 객체이다.lease API는 `coordination.k8s.io` API 그룹에 존재하며, 대표적으로 아래와 같은 feature를 갖는다.holderIdentity : 현재 lease의 대표 idleaseDurationSeconds : lease의 지속시간renewTime : 마지막 lease 갱신 시각 쿠버네티스 클러스터에는 기본적으로 `kube-node-lease`라는 네임스페이스가 기본적으로 존재하는데, 이 네임스페이스에는 클러스터에 연결된 모든 노드들의 상태(`.statu..
서비스나 파이프라인을 구성하면 Lambda나 SQS 등등 클라우드 서비스를 여러개 사용해서 워크플로우를 구성하게 된다.하지만, 구성이 커지면 이러한 워크플로우의 구성요소들 간의 로직이 복잡해지게 된다.AWS 서비스들을 통해 워크플로우를 간단하게 구성하고 시각화시켜 흐름을 파악할 수 있는 Step function에 대해 알아보도록 한다. Step FunctionAWS 서비스들을 한데 묶어 일련의 작업 파이프라인을 생성할 수 있는 서비스Workflow Studio를 통해 작업들을 직접 배치하고 시각적으로 확인할 수 있다는 특징이 있다. Step function은 '상태 머신[State Machine]'이라는 개념으로 워크플로우를 구성한다. [상태 머신 == 워크플로우]그리고 상태 머신의 각 단계는 ASL..
kubernetes에서 파드는 일반적으로 Deployment나 ReplicaSet과 함께 지속적으로 수행되도록하는 목적을 가지고 있다.하지만, 단순히 일회성을 가지고 수행되는 작업들도 존재한다.예를 들면, 로그 데이터 처리나 데이터 백업같은 데이터 처리 작업이나 외부 API를 통해 데이터 수집이나 동기화 작업과 같은 배치 작업들이 있을 수 있다. 이러한 작업들도 Kubernetes 클러스터 내에서 실행될 수 있다. 바로 이번에 알아볼 Job과 CronJob이 여기에 해당된다. Job일회성 작업을 수행하는 리소스Job은 파드를 통해서 작업을 수행하고, 지정된 작업이 성공적으로 종료될때까지 수행을 반복한다. 아래와 같이 Job은 실행할 내용을 Pod template에 담아서 생성하게 된다.apiVersion..
동일한 쿠버네티스 리소스를 개발, 운영, 테스트 등의 여러 환경에 배포하다보면, 각 환경별로 몇몇 설정값을 다르게 해야할 경우가 있다.예를 들어, 환경별로 환경변수의 내용이나 설정 값들이 달라지거나, 사용할 이미지의 버전이 다르거나... 이러한 상황에서 각 리소스들의 Yaml을 전부 따로 만들어서 수정해주게 되면, 일부만 변경된 리소스 파일이 생겨나기에 관리에 비효율적이게 된다.Kustomize를 통해 이러한 상황에서 리소스에서 필요한 부분만을 변경해서 사용할 수 있다. Kustomize쿠버네티스 리소스의 설정을 직접 변경하지 않고, 필드를 재정의해서 새로운 리소스로 생성할 수 있는 CLI 도구Kustomize는 객체지향 프로그래밍에서 사용했던것과 같이 '상속'의 개념을 통해 리소스들의 필드를 재정의해서..
객체를 다루다보면, 특정 객체를 복사해서 사용하는 경우가 종종 있다.보통 이 과정에서는 단순하게 아래처럼 사용하고는 한다.num = 150num2 = numprint(num2) # 150 DFS와 백트래킹 관련 알고리즘 문제를 풀던 중 입력된 field(이중 list)를 복사해두어서 백트래킹 과정에서 사용했었다.이 과정에서 단순하게 복사를 해서 사용했고, 의도대로 백트래킹 로직이 돌지 않았다는 것을 확인했다.그리고 원인 파악에서 복사한 이중 list에 대한 원본이 계속 수정되고 있다는 것을 알게 되었다. 이 과정에서 Python의 얕은 복사와 깊은 복사에 대해 알게 되었고, 이를 정리하고자 한다. 얕은 복사(Shallow Copy)새 객체를 생성하지만 원본에 포함된 객체에 대한 참조를 유지하는 방식..
HTTPSHTTPS는 HTTP 프로토콜상에 SSL 레이어를 추가한 통신 프로토콜로, 암호화된 HTTP 통신 프로토콜이다.서버와 클라이언트 간의 통신에서 중간에 악성 행위자로 하여금 데이터가 가로채어지거나 변조되지 않도록 하는 데이터의 전송과정에서의 보안 요소로, 기밀성과 무결성을 보장한다. SSL 인증서SSL/TLS 프로토콜을 이용해 다른 시스템에 암호화된 안전한 연결을 수행할 수 있도록 하는 디지털 객체SSL 인증서는 주로 웹 서비스와 사용자 간에 신뢰할 수 있는 통신을 위해 사용된다. SSL 인증서는 제3 인증기관(CA)이 발급해주며, 브라우저의 URL 좌측에서 HTTPS로 연결된 사이트에 대한 SSL 연결과 그 인증서 내용을 확인할 수 있다. 근래 거의 대부분의 웹 사이트에는 HTTPS를 사용해..