[MSA] SAGA pattern
2022. 12. 19. 13:44
개발/Spring
지난번 MSA 포스팅에 사용한 Outbox pattern글에 이어 SAGA pattern을 작성하려한다. MSA : Outbox Pattern MSA 아키텍처? 마이크로서비스아키텍처에 대한 화두가 널리 퍼진지 한 8년정도 된 것 같다. 대학교 1학년 때(2014년도)에 쿠버네티스에 대해 알게되어 도커컨테이너에 대해 공부했었던 기억이 있 flowlog.tistory.com Saga패턴 Saga 패턴은 간단히 말해 이벤트에 대한 보상트랜잭션을 발행할 수 있는 것이다. 가장 흔한 예로 주문서비스가 있는데, 재고-주문-결제 라는 하위 이벤트가 존재하게 된다. 이 때, 기존 프로세스라면 재고->주문->결제를 정상적으로 수행하는데 만약 결제에서 잔액부족의 이유로 결제취소가 이루어진다면 해당 주문건에 대한 트랜잭션 ..
[Springboot] 대용량 Select Query OOM 방지를 위한 스트림
2022. 12. 13. 00:12
개발/Spring
서론 대량의 select 쿼리를 날릴 때 대부분의 개발자들은 Memory 요소를 파악하지 못하는 것 같다. 이번에도 몇십만건의 데이터를 한번에 load 해서 front에 뿌리는 프로세스에서 was가 후두둑 죽어가는게 아닌가. 이전 프로젝트에서도 배치개발을 하던 과장급 프리랜서가 있었는데, 운영에 올리자마자 터지고 난리도 아니였다. 그들의 답변은 항상 '개발환경에선 잘된다, 단지 데이터가 많을 뿐 -> 인프라문제다.' 제발 메모리 이슈좀 알아서 해결해라!!!!!!!!!!!! 테스트 목적 '직접'해보자 Q. 수십~수백만 건의 데이터를 어떻게 사용자에게 보여줄 것인가??? 검색해보니 제일먼저 Mybatis fetchSize 조정이 있었다.(default 10) - 만약 1000개의 데이터를 select 한다면..
[Trouble Shooting] Spring HeapDump 설정 및 분석
2022. 12. 12. 21:39
엔지니어링/기타
신규 구축 프로젝트 중 erp application 서비스가 자꾸 죽는다고, .. 환경은 쿠버네티스 기반인데 OOM 떨어지게 개발해놓고 '나'한테 전화가 쏟아진다. 인프라 명목을 단정짓기위해 분석을 시작하고 팩트로 조져보자! dump 경로 및 gc로그 설정 먼저 heapdump 옵션과 gc log 설정을 하여 모니터링 하기 위해 deployment yaml 에 설정을 추가해주었다. spec: template: containers: - args: - -XX:+HeapDumpOnOutOfMemoryError - -XX:HeapDumpPath=/덤프파일경로/ - -XX:+PrintGCDetails - -verbose:gc - -Xloggc:/가비지컬렉터로그경로/gc.log:time,level,tags - -j..
[Gradle] build Error - validity check failed
2022. 12. 10. 23:08
엔지니어링/기타
얼마전에 NCP(Naver Cloud Platform) 프로젝트 중 개발사에서 Gradle 기반의 springMVC 이미지를 빌드 에러가 난다고 연락이 왔다. PKIX path validation failed: java.security.cert.CertPathValidatorException: validity check failed 개발사 말로는 local 환경에서는 정상적으로 라이브러리를 가져올 수 있으나, Naver 빌드시 보안상 오류가 아니냐고 해서 확인 요청이 온 것이다. 결과적으로는 라이브러리 사이트에서 tls 인증서가 만료가 된 상황이였다. 오픈이 1주일도 안남은 상태에서 정신없다보니 그런거라 생각하며.. 필자도 1시간동안 찾아 해멘 끝에 이 것을 찾을 수 있었다. 보통 개발자들이 로컬환경에서..
[AzureDevops] CI-CD Pipeline 구축 테스트
2022. 12. 6. 21:08
엔지니어링/CI-CD
11월 3주간 Github Actions 과 AzureDevops 두 개의 CI-CD Pipeline 구축테스트를 진행하였고 Rest API 호출 방법까지 케이스를 정리해보았다. AzureDevops 도 GHES와 같이 Private 용도의 Server를 제공하며, 별도의 Self-Hosted Runner를 이용할 수있다. AzureDevops URL은 dev.azure.com/{Organization}/{Project} 로 들어갈 수 있다. 기초적인 파이프라인 생성방법 Pipelines 메뉴에 들어가 repository, 배포위치 등을 손쉽게 선택하여 파이프라인의 뼈대를 쉽게 생성할 수 있다. 사용자의 구독에 운영중인 자원들을 손쉽게 선택할 수 있다. 필자는 AKS 에 배포할 것으로 Deploy to ..
[AzureDevops] Image Tag Not working to Pipeline Create
2022. 12. 5. 14:06
엔지니어링/CI-CD
휴... azureDevops Pipeline 사용 중 이미지버전(Tag)를 변수로 받아와서 배포하는 시나리오에서 자꾸 태그를 가져오지 못하는 현상이 생겼다... 대체 왜이럴까!!!!!!!!!! 계속 찾던 와중에... 발견해버렸따.... azure Devops 에서 pipeline을 생성할 때 데이터를 구독에서 연결되어 있는 자원을 선택할 수 있는데 Image Name 부분에 '-' 가 들어간 경우 실제 pipeline.yml 에서 '-'가 삭제되는 현상.... 이렇게 spring-app 이미지이름을 지정했는데 실제 pipeline.yml 에 선언된 변수는 - 가 자동으로 제거됨;;;
[Github Actions] CI-CD Pipeline 구축 테스트
2022. 12. 3. 23:29
엔지니어링/CI-CD
11월 3주간 Github Actions과 AzureDevop Pipeline 을 테스트 해보았고 Rest API 호출 테스트까지 케이스를 정리해보려 한다. 추가로 Github Enterprise (일명 GHES) 도 구축하여 이것저것 사용해 보았는데 Actions 사용을 위해 별도의 Runner를 기동하는 Host가 필요했고, 기존 Github Marketplace 에서 사용하던 라이브러리를 못 쓰게되어 모든 것을 shell script 로 작성해야했다. (GHES는 폐쇄망 기준으로 만들어져 깃헙 마켓플레이스를 사용하려면 GHES서버, 러너서버 모두 아웃바운드 트래픽을 열어주어야 한다고함) 자 그럼 그동안 했던 내용을 정리해보자. 파일 위치 기본적으로 레파지토리 최상위 경로기준 /.github/work..
[NKS] velero 백업 및 복원하기
2022. 11. 7. 16:03
엔지니어링/NCP
네이버 쿠버네티스 서비스에서 velero를 통한 클러스터 백업&복원을 가이드하고 있다. velero 는 vmware-tanzu에서 업데이트하고 있는 github 링크를 통해 사용하면 된다. 1. VELERO 셋업 1-1. velero 다운로드 22년 11월 7일 기준으로 현재 1.8.1 버전이 최신이다. github 에서 다운로드 받고 압축을 푼뒤 실행할 수 있는 폴더로 이동시켜주자. $ wget https://github.com/vmware-tanzu/velero/releases/download/v1.8.1/velero-v1.8.1-linux-amd64.tar.gz $ tar -xvzf velero-v1.8.1-linux-amd64.tar.gz $ sudo mv velero-v1.8.1-linux-am..
[MSA] Outbox Pattern
2022. 11. 4. 13:58
개발/Spring
MSA 아키텍처? 마이크로서비스아키텍처에 대한 화두가 널리 퍼진지 한 8년정도 된 것 같다. 대학교 1학년 때(2014년도)에 쿠버네티스에 대해 알게되어 도커컨테이너에 대해 공부했었던 기억이 있는데, 인프라(infrastructure)영역은 쿠버네티스, 오픈시프트(redhat), 탄주(vmware) 등의 오케스트레이터를 통해 널리 사용하고 있는 것 같다. 그럼 이제 어플리케이션영역이 마이크로서비스화 되어야한다. 필자는 작년 한 해동안 마이데이터 제공자 API 프로젝트를 openshift 기반 환경에서 진행하였는데, redhat 기반이라 해당 플랫폼에서 제공하는 3scale(API G/W), rhsso(인증), Fuse, Jboss 를 사용하여 컨테이너를 운용했다. 하지만 마이데이터 제공자는 단순히 Rea..
[JAVA] 간단한 .java 파일을 실행 가능한 .jar 파일로 만들고 도커 이미지로 쿠버네티스 cronjob 생성하기
2022. 11. 3. 13:35
개발/JAVA
어제 간단한 특정시간이 지난 뒤 프로세스가 종료되는 자바파일을 구현해야하는 상황이 생겼다. 그래서 jar 파일을 만들고 Dockerfile을 작성한 뒤 Docker image를 생성하고, 쿠버네티스 cronjob 에서 가져오는 것 까지해보았다. 먼저 .jar 파일은 그동안 maven, gradle을 통해 자동으로 쭈루룩 만들어줬었는데, 그냥 test.java main 메소드 하나 있는 것을 컴파일하여 나온 .class 파일과 매니패스트파일을 합치는 작업을 해주면 된다. 근데 이때 매니패스트 지정하는데에 시행착오를 겪었다.. (문자열 끝에 엔터가 필요하다고...) test.java 가장먼저 개발을 할 test.java 를 만들자. 간단히 Thread를 통해 3초의 대기를 준 뒤 프로세스가 종료되게 하였다...
[Springboot] Fabric8 kubernetes 리소스 컨트롤하기
2022. 10. 26. 23:59
개발/Spring
스프링부트에서 쿠버네티스 리소스를 컨트롤하기 위해 제공되는 라이브러리가 2개 있다. 하나는 kubernetes에서 제공하는 것이고 또 하나는 Fabric8 에서 제공하는 라이브러리이다. 이 두개의 차이는 이 링크에서 아주 잘 설명하고 있다. 위 링크에서 대충 보자면 kubernetes는 객체를 선언하고 하는 작업들이 많고 Fabric8은 웹소켓을 이용한다는 것이다. (소스 구현부도 Fabric이 편해보임..) 이제 간단히 k8s 리소스를 가져와보자. Pom.xml k8s / ocp 라이브러리가 따로 존재한다.(필자의 현재 코드는 k8s용) io.fabric8 kubernetes-client 6.1.1 io.fabric8 openshift-client 6.1.1 Controller 간단히 GET /k8s/..
[Spring Cloud] Zipkin(집킨) 분산 추적 해보기
2022. 10. 26. 23:43
개발/Spring
Zipkin(집킨)은 스프링클라우드에서 제공하는 분산추적 서비스이다. Zipkin(집킨)서버와 sleuth(슬루스)가 있으며 집킨서버는 데이터를 보관 및 웹대시보드를 제공하며, 슬루스는 로그 데이터들을 잘 처리하여 집킨에 보내는 역할이다. 집킨서버의 데이터 저장소는 - 인메모리 - mysql - 카산드라 - elasticSearch 로 설정할 수 있으며 별다른 설정이 없을 경우 인메모리(WAS)에 저장하게 된다. Zipkin 구동 간단히 도커를 통해 기동하며 port는 default 9411 을 사용한다. docker run -d -p 9411:9411 openzipkin/zipkin Pom.xml zipkin 사용을 위한 라이브러리 추가 위에서 설명했듯이 슬루스란 친구를 통해 데이터를 zipkin서버에..
[Springboot] Sse(Server Send Event) 단방향 통신을 이용해 tail -f 기능 구현
2022. 10. 26. 23:27
개발/Spring
난 이걸 왜 쓰게되었나? OCP 웹콘솔에 보면 pod의 log를 지속적으로 호출하는 페이지가 있는데, 말 그대로 서버가 클라이언트 쪽에 로그를 일방적으로 보내는 방식인거 같았고, 이걸 구현해보고 싶다는 생각이 들어 통신모듈을 찾아보다가 SSE(Server Send Event)라는 라이브러리를 알게되어 찾아보니 보통 접속중인 사용자에게 push 알림을 보내는 용도, 스포츠 중계서비스에 이용할 수 있다. 필자는 리눅스에서 로그 파일을 볼 때 이용하는 tail -f 기능으로 활용해보려한다. 단방향 통신을 위한 모듈 SeeEmitter 클래스는 2015년(Spring Framework 4.2)부터 사용할 수 있게 되었다. Internet Exporer를 제외한 모든 브라우저를 지원한다. HTTP/1.1 프로토콜..
[Kubernetes] docker Desktop Kubernetes PV 붙이기
2022. 10. 26. 16:04
엔지니어링/Kubernetes
도커데스크톱으로 쿠버네티스를 올리고 pv를 붙이려면 hostpath로 하면 된다. 참고로 hostpath는 node의 storeage를 사용하는 것으로, 도커데스크톱은 pc 위에 1개의 노드풀로 올라가 있기 때문에 사용할 수 있다. 필자는 C:/kubernetes/storage/ 경로를 스토리지로 사용하고 샘플 pod에 toolbox 폴더라는 pv를 붙였다. 먼저 deployment.yaml 에 volume을 작성하자. 경로는 /run/desktop/mnt/host/c/ 뒤에 작성하면 된다. apiVersion: apps/v1 kind: Deployment metadata: name: toolbox-deployment spec: selector: matchLabels: app: toolbox replic..
[Kubernetes] nginx-ingress로 들어온 path를 삭제하고 백엔드에 전달하기
2022. 10. 26. 15:41
엔지니어링/Kubernetes
쿠버네티스 ingress 설정 중 path에 따라 서비스를 연결시켜주는 방법 metadata>annotaions 안에 rewrite 를 넣어주고 nginx.ingress.kubernetes.io/rewrite-target: /$2 spec>rules>http>paths 안에 아래와 같이 적용하면 된다. path: /외부접근패스(/|$)(.*) 이렇게하면 사용자가 도메인/외부접근패스 로 들어올 경우 nginx 에 / 로 설정된다. "GET / HTTP/1.1" 200 도메인/외부접근패스/패스1/패스2 로 들어온다면 nginx 에 /패스1/패스2 로 전달된다. "GET /패스1/패스2 HTTP/1.1" 200