전체 글
-
WriteConflict 해결 노트Backend/MongoDB 2025. 2. 16. 17:36
원인 발생특정 서비스에서 MongoDB를 사용하고 있고, 테스트중에 WriteConflict가 발견되었다. 원인은 다음과 같다.A 기능에서 k document를 조회 및 업데이트B 기능에서도 k document를 조회 및 업데이트 각 A,B 기능이 독립적으로 또는 순차적으로 흐를것이라고 판단했었는데, 다음과 같은 상황을 고려하지 못했다. Kafka를 통해 타 서비스의 이벤트를 받고 A,B의 기능이 실행되는데, 서버가 재시작 또는 배포로 인해 시작되는 순간 Kafka에 연결되면서 Rebalancing이 된다. 이때 각 Topic의 Partition에 A,B의 기능이 실행되는 Topic A, Topic B가 같이 쌓였다면, Rebalancing이 완료되고, Polling을 해오는 순간 2개가 연달아 서비스에..
-
Event Driven Architecture 적용해보기Architecture 2025. 1. 12. 17:36
최근에 회사에서 이벤트 기반 아키텍처를 손을 봐야 하는 경우가 생겼습니다.그래서 여러 잘된 곳을 참고하여 아래와 같은 도식표를 그리고 적용해 봤습니다. 위 도식표는 발행을 보장하기 위한 Transaction Outbox Pattern을 이용했습니다. 흐름어떤 기능에 요청이 들어와서 실행을 하고 이벤트를 방출 한다. 이때, 이벤트를 방출하는 Listener는 @TransactionEventListner(phase = Transaction.AFTER_COMMIT) 애노테이션을 갖고 Listen하고 있다. 그러므로 해당 기능이 실패하면 이벤트가 발행하지 않음을 보장할 수 있다.@TransactionEventListner(phase = Transaction.AFTER_COMMIT) 애노테이션으로 Listen한 ..
-
TestFixture를 잘 사용해보기Backend/Test 2024. 12. 27. 23:31
TestFixture ?TestFixture는 Test에 사용되는 Mocking되어지는 객체입니다. Wikipedia - 테스트 실행에 필요한 시스템 상태와 입력 데이터를 설정하는데 사용됨 기존에 사용했던 방법Spring boot project에서는 /src/java, /src/test 두 개의 폴더가 존재해 test와 관련된 내용은 /src/test 에 모아놨다. 그리고 TestFixture 또한 여기 폴더에 두었다. 그렇다 보니 test폴더에는 테스트 코드와 테스트를 위한 테스트 픽스처가 한 곳에 있어 보기가 안 좋았고, 이를 다른 모듈에서 (멀티 모듈로 사용하고 있었다.) 공유가 된다면, 테스트 코드까지 공유가 되어 "더 좋은 방법이 없을까?" 라는 고민이 있었다. 찾다보니 Gradle에서 Test..
-
AsyncStorage 활용하기Backend/Nodejs 2022. 12. 24. 00:41
안녕하세요. 오늘은 Nodejs의 AsyncStorage를 소개하고, 어떻게 활용하였는지에 대해 얘기해보려고합니다. 1. AsyncStorage 소개 nodejs 공식 홈페이지에는 다음과 같이 설명을 하고 있습니다. AsyncStorage는 state(상태)를 연결하고 callback과 promise chain에 state를 전파하는데 사용됩니다. 웹 request, 기타 비동기 작업의 lifetime에 데이터를 저장할 수 있습니다. 다른 언어의 thread local storage와 유사합니다. nodejs의 비동기 작업에서 일관성이 유지되는 저장소(AsyncStorage)를 생성하여 독립적인 storage context 가질 수 있습니다. 여러 인스턴스에서 서로의 데이터를 접근할 수 없습니다. 이 뜻..
-
GitActions에서 Environment secrets 사용해보기Devops/CICD 2022. 9. 13. 09:37
gitactions에서 secret ket를 주입하는 방법은 settings -> Secrets-> Actions에서 Repository secret key를 추가하면 됩니다. 하지만, 개발환경별로 주입하려면 Secret Key이름에 환경이 들어가서 ci/cd의 yml파일이 지저분해집니다. 언젠가부터 github에 Environments가 settings에 생기면서 Deployment branch role을 지정해서 특정 환경에서만 주입할 수 있는 기능이 생겼습니다. 즉, 환경변수 네이밍이 기존에 DB_HOST_DEV, DB_HOST_STAGE.. 이런식이 였다면, DB_HOST하나로 환경별로 사용할 수 있게 됩니다. 위 사진을 보시면 dev라는 Environments에 DB_HOST가 있는것을 볼 수 ..
-
AWS Service DiscoveryDevops/Terraform 2022. 8. 30. 00:38
elastic container service (ecs)를 사용하다가 슬슬 내부 통신이 필요할 때가 와서 관련 서비스 (consul, aws cloud map)등을 조사하다가 aws cloud map을 사용하기로 결정을 했습니다. 그 이유는 현재 사용중인 ecs는 eks 또는 k8s로 변경할 예정이다. headless service로 간단하게 거쳐갈 솔루션이 필요하다. 이다. 하지만, 사용해보니 몇 가지 단점이 보였습니다. route 53에 private hosting을 하기에 DNS 레코드 변경, 삭제되면 지연시간이 발생한다. terraform으로 프로비저닝 할때, ecs가 destroy 후 apply가 된다. 사용하게될 Private DNS Service Discovery에 대해서 간단하게 설명을 드..
-
Terraform에서 tagging하기Devops/Terraform 2022. 4. 9. 20:17
이번에 회사에서 태깅 정책을 정하게 되어서 기존에 프로비저닝했던 모듈에 태깅을 붙이게 되었습니다. 하지만, 하나의 aws서비스를 프로비저닝하는 코드에는 여러 모듈이 엮여있어서 태깅을 하나하나 추가하는데 매우 귀찮음을 느꼈습니다. 그러던 와중!! default_tags을 볼 수 있었습니다. default_tags란 provider block에서 사용할 수 있는데 프로비저닝하는 모든 resource에 공통된 태깅을 붙여주는 속성입니다. provider "aws" { region = "ap-northeast-2" default_tags { tags = { TAG1 = "tag1" TAG2 = "tag2" } } } resource "aws_alb" "default" { name = var.name intern..
-
[go] " ... " 에 대해Backend/GO 2019. 12. 13. 14:48
Discord github을 보다가 golang에서 제공하는 net/http 라이브러리를 튜닝하여 fasthttp를 만들어서 사용한다는 것을 봤다. 어떻게 fasthttp를 만들었으며, 어떤 특징이 있나 보던 중 Tricks with []byte buffers discordapp/fasthttp Fast HTTP package for Go. Tuned for high performance. Zero memory allocations in hot paths. Up to 10x faster than net/http - discordapp/fasthttp github.com 이 부분에서 dst = append(src, "foobar"...) 인 부분을 보고 ...에 대해 자세히 조사가 하고 싶어져 이 글을 작..