본문 바로가기

전체 글

(339)
[끄적끄적] Saga에서 Exception을 Json으로 변환하다가 발생한 에러와 해결 최근 진행하고 있는 프로젝트 Gitanimals에서는 분산된 트랜잭션 간의 데이터 정합성을 맞추기 위해 redis-stream을 이용해 Saga를 구현하고 있습니다. 이때, Saga 중간에 예외가 발생하면 Saga를 호출했던 클라이언트가 예외에 따라 적절한 처리를 해주기 위해서 예외 인스턴스를 직렬화해서 저장해야 했습니다. (아래 사진 참고) 그런데 이때 예외가 발생해서 롤백은 잘 되었는데 클라이언트는 Timeout Exception 예외를 받은 적이 조금 있었어요. 처음에는 네트워크 이슈라 생각하고 넘겼었는데, 특정 상황에서 잦게 발생하기 시작해서 예외를 파악해 보기 시작했습니다.setAccess 가 안된다?!Timeout Exception이 발생한 상황은 대부분 Saga안에서 JwtException ..
[끄적끄적] 44만 SAGA 를 처리하며 얻은 인사이트 안녕하세요, 제가 하고 있는 사이드 프로젝트 깃 애니몰즈 에서는 유저간의 거래, 쿠폰 사용, 포인트 지급 등등 많은 영역에 걸쳐서 SAGA를 사용하고 있는데요. SAGA를 처음 사용할때는 여러가지 문제가 발생했었지만, 최근에는 꽤나 안정화 된것 같아서 SAGA 를 사용하면서 얻은 인사이트를 정리하고자 합니다. 사용하는 SAGA 프레임워크는 아래와 같습니다.  GitHub - devxb/Netx: Saga framework / Supports redis stream and blocking, reactive.Saga framework / Supports redis stream and blocking, reactive. - devxb/Netxgithub.com 사이드에서 SAGA를 하는 이유SAGA를 사이드 ..
[회고] 꾸준히 유지되는 사이드가 되기 위해서 안녕하세요. 저는 지금까지 7-8개의 사이드프로젝트를 해왔었는데요. 사이드를 할 때마다 모종의 이유로 동기를 잃고 흐지부지 되어서 그만하게 되더라고요.이렇게 계속해서 사이드를 그만두다 보니까, 사이드 프로젝트는 단순히 단기간에 기술이나 가설을 실험하는 것 이상으로 갈 수 없고, 빠르게 끝나는게 당연한것이라고 생각하고 있었습니다.그런데, 최근에 하고 있는 깃 애니몰즈 라는 프로젝트는 7개월 가량 운영을 하고 있는데도 동기도 잃지 않으면서, 할수록 재밌어지는 프로젝트이더라고요? 어떻게 해서 사이드 프로젝트가 이렇게 될 수 있을까 고민을 하다가 얻은 나름의 인사이트를 회고해보려고 합니다.동기 사이드 프로젝트를 접게 되는 가장 큰 이유 중 하나는 구성원들이 동기를 잃기 때문이라고 생각해요.저 같은 경우 프로젝트..
[회고] 주니어 개발자 되기 까지 aka. 삶의지도 안녕하세요.2024년은 제가 개발을 시작하고 항상 꿈꿔왔던 많은 사용자가 사용하는 서비스 (깃 애니몰즈) 와 원하는 회사 취업이라는 선물을 받게 된 뜻깊은 해인데요. 관련해서 회고를 작성해야겠다고 생각하고 있었는데, 이번에 글또 지원을 결심하게 되어서 삶의 지도를 회고에 녹여서 작성 해보려고 합니다. 2020 - 깃허브를 꾸미는게 좋아서 시작한 개발개발을 하기 전에 저는 알고리즘을 풀던 학생이었어요.그 당시에 백준에 있는 알고리즘을 풀고, 깃허브에 올려놓는 활동을 하고 있었는데, 같이 알고리즘을 푸는 친구가 깃허브에 백준의 티어를 올려놓은 모습을 보게 되었고 이 모습이 너무 신기했습니다.  깃허브에 백준 티어를 올리는 법을 찾아보면서 깃허브를 꾸미는 활동에 재미를 붙이게 되었고,"많은 사람이 사용하는 서..
[끄적끄적] 효율적인 키 분배 및 리밸런싱 방식 최근 진행중인 프로젝트는 내부적으로 redis-stream을 사용하고 있는데요, redis-stream은 key하나에 스트림 하나가 들어가므로 stream을 하나만 사용하면 redis cluster를 사용할 수 없습니다. 따라서, 클라이언트에서 로드밸런싱을 구현해줘야 하는데요, 노드 하나당 레디스 하나가 매핑된다고 가정하면, 레디스 클러스터 노드가 추가되거나 삭제될때 각 요청을 어느 노드로 보낼지 식별해서 로드밸런싱을 해줘야 합니다. 생각이 여기까지 오니까 "키 재분배 방식을 어떻게 하면 효율적으로 할 수 있을까?" 에 대해서 궁금해졌고 공부한 내용을 정리하고자 글을 작성하기로 했습니다.모듈러 연산키 재분배를 위해서 사용할 수 있는 가장 쉬운 방법은 모듈러 연산 방식 입니다. 5개의 노드가 있고 키가 백..
[Redis] Redis-stream 메모리 누수와 XGROUP의 동작원리 최근 진행하고 있는 프로젝트 Gitanimals에서는 분산된 트랜잭션간의 데이터 정합성을 맞추기위해 redis-stream을 이용해 Saga를 구현하고 있습니다. 메시지 스트림 구현체로 redis-stream을 사용하면서, 내부적으로 redis-stream의 Group을 사용하고 있는데, redis-stream의 Group에 대해서 자세히 설명하고 있는글이 없더라구요. Group의 내부동작을 모른채 사용하면 메모리 누수로까지 이어질 수 있는만큼 중요한 부분이라 생각하기 때문에, 제가 정리하고자 마음을 먹고 글을 작성하게 되었습니다. Redis-stream 개요공식문서에 따르면, redis-stream은 append-only log 와 같이 동작하는 자료구조이지만, 몇가지 기능을 추가로 제공해서 appen..
[끄적끄적] 주문 Saga Isolation 부족 해결하기 Saga는 트랜잭션의 ACID특징중 Isolation을 보장하지 못하는것으로 알려져 있습니다.실제로, Isolation이 부족하기 때문에 여러 문제가 발생할 수 있는데요.이번 글 에서는 Isolation이 보장되지 않으면 발생할 수 있는 문제와, DAU 1500명 가량의 Gitanimals 의 주문 시스템에서는 어떤방식으로 해결했는지 작성해보도록 하겠습니다. Isolation이 보장되지 않으면 발생할 수 있는 문제Saga는 각 참여자들이 독립적으로 데이터를 커밋하고 Saga가 실패했을때 롤백 메시지를 받아 롤백을 진행합니다.따라서, 전체 Saga가 끝나지 않았을때 Saga 참여자들의 각 트랜잭션은 이미 커밋 되었으므로, 데이터 변경이 외부에 노출되고, 다른 트랜잭션에서는 변경된, 하지만 롤백될지도 모르는..
[끄적끄적] 결제 중복 롤백 방지하기 현재 진행중인 프로젝트에서는 분산환경에서 데이터 정합성을 맞추기 위해, 유저의 결제로직이 중간에 실패할경우, 보상트랜잭션을 발행하도록 구성되어 있는데요. 이때, 보상트랜잭션 처리중 메시지가 유실되면 해당 메시지를 일정 시간후에 재처리 하게 됩니다. 주문의 상태를 "FAILED" 처럼 바꾸는 멱등한 API의 경우 메시지를 재처리해도 문제가 되지 않습니다. 그러나, "유저가 결제한 포인트를 복구" 하는것과 같이 멱등하지 않은 API는 유저에게 포인트가 중복해서 더해질 수 있으므로 재처리 과정중 멱등성을 보장해줘야 합니다. 실제로, 주문 - 결제 로직을 spike test 해보면, 아래 사진과 같이 (서버 다운 등의 이유로) 유실된 메시지를 재처리하게 되어서, 유저가 원래 갖고있던 1000 포인트 보다 더 많..