분류 전체보기 (340) 썸네일형 리스트형 [끄적끄적] 코루틴 실패전이 트러블 슈팅 (feat. 구조화된 동시성) 최근 개발을 하던도중 코루틴동작 방식을 잘못 이해하고 사용해서 문제가 발생했었는데요.까먹지 않고자 정리를 해보았습니다.문제상황비동기보다는 멀티스레드를 편하게 사용하려고 코루틴을 사용하고 있는데요.이때, 아래 예시 코드와 같이 첫번째 async가 실패하면 두번째 async로 fallback 하는 로직이 있었습니다.runBlocking { val async1 = async { ... } val async2 = async { ... } val result = runCatching { async1.await() }.onSuccess { // log }.recoverCatching { async2... [끄적끄적] 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 참여자들의 각 트랜잭션은 이미 커밋 되었으므로, 데이터 변경이 외부에 노출되고, 다른 트랜잭션에서는 변경된, 하지만 롤백될지도 모르는.. 이전 1 2 3 4 ··· 43 다음