본문 바로가기

전체 글144

[DB] Bulk 조회를 통한 성능 개선(24초 -> 3초) 1. 문제 상황회사에서 신규 프로젝트 운영을 위해서 python으로 백오피스를 구현하고 있습니다.리스트로 이루어진 데이터가 입력으로 오면, 이 데이터를 mongoDB에서 조회해서 가공한 후에 지도에 출력하는 프로젝트 입니다. 문제는 성능이 나오지 않았습니다.42개의 데이터를 조회 및 처리하는 데에 5초나 걸렸습니다. 2. 원인mongoDB가 해외에 위치해 있습니다. 그러다보니 query를 날리고 응답을 받는데에 시간이 오래 걸릴 것이라고 생각했습니다.특히 이런 IO 작업을 싱글 쓰레드로 처리하다 보니 속도가 느려졌다고 생각했었습니다. 3.  해결그래서 싱글 쓰레드로 동작하던 것을 멀티 쓰레드로 변경했습니다.python의 GIL이 있지만, mongoDB에서 데이터를 가져오는 IO 작업 부분을 멀티 쓰레드로.. 2024. 9. 5.
[Webflux] 대용량 데이터 처리 heap 사용량 이슈 회사에서 일을 하다가 마주친 이슈입니다.  1. 문제 상황데이터를 외부에서 수집해서 서비스에 맞게 파싱 후, 저희 db와 redis에 넣는 작업을 했었습니다.데이터 자체는 크지 않았지만, 서비스에 맞게 사용하기 위해 가공한 후의 데이터가 많았습니다. 여기서 문제는 가공하고 mongoDB와 redis에 넣을 때 힙을 약 5기가 정도로 많이 사용하고 있었습니다. 그래서 왜 이렇게 많이 힙을 사용하는 지 알아봤습니다.  2. 원인 파악flatMap을 이용해서 데이터를 처리하고 있었습니다. void test() { List data = new ArrayList(); Flux.just(data) .flatMap(fetchData -> { //.. 2024. 8. 3.
[GCP] VPC (VM instance + cloud sql) 설정 최근에 CMC라는 동아리를 하면서 새로운 프로젝트를 진행하고 있습니다. 이 과정에서 삽질 때문에 시간을 너무 많이 써서.... 해당 내용을 기록해두려고 합니다. 원래는 GKE를 이용해서 배포를 하려 했었는데, 계속 서비스가 정상적으로 동작하지 않아서 vm instance를 이용해서 배포는 해둔 상태입니다.   1. 문제우선 서버 세팅은 vpc 를 통해서 priavte subnet(10.0.1.0/24)이랑 public subnet(10.0.2.0/24)을 만들었습니다.그리고 cloud sql을 private subnet에 등록하려고 했지만, 이처럼 비공개 서비스 액세스라는 것을 만들라고 해서 이를 이용해서 만들었습니다.이는 10.0.3.0/24 범위를 가지고 있습니다. 여기서 문제가 10.0.3.0/24.. 2024. 7. 21.
[Go] 리소스 상태 유지 책 클라우드 네이티브 go를 참고했습니다.https://github.com/cloud-native-go/examples (코드)  분산 클라우드 네이티브의 도전 과제 중 하나는 '상태를 어떻게 유지할 것인가' 입니다. 1. 트랜잭션 로그 파일에 상태 저장. 리소스가 변경될 때마다 파일 기반의 트랜잭션 로그를 이용하여 기록. 트랜잭션 로그는 서비스가 트랜잭션을 다시 수행하여 원래의 상태를 쉽게 만들 수 있도록 함.2. 외부 데이터베이스에 상태 저장. 트랜잭션 로그 저장을 외부 db에 함. 1. 트랜잭션 로그트랜잭션 로그는 변경사항의 기록을 유지하는 로그 파일.서비스에 문제 생기거나, 재시작 될 경우 트랜잭션을 다시 수행해서 복원할 수 있게 해줍니다. 트랜잭션 로그는 이벤트를 오래된 것부터 최신 순으로 읽어.. 2024. 7. 9.
[GO] Rest API 구현 https://github.com/cloud-native-go/examples 로 공부한 내용입니다. 1. net/http를 이용한 Rest API package mainimport ( "log" "net/http")func helloGoHandler(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Hello net/http!\n"))}func main() { http.HandleFunc("/", helloGoHandler) // 2번째 인자는 multiplexor. nil인 경우 DefaultServeMux 이용 //ListenAndServe는 에러가 발생한 경우에만 반환. //log.Fatal은 에러가 발생할 경우, 에러메시지 반환하고 종료.. 2024. 7. 6.
[Go] 동시성 패턴 future k8s 및 go 관련해서 사내 스터디를 진행 중입니다.future 에 관해 스터디를 했었습니다. 책 저자는 future는 비동기 프로세스에 의해 생성되는 값에 플레이스홀더를 제공하는 연산자라고 합니다.(문맥에 따라 다른 의미가 될 수 있다고 항의하지 말라고 합니다.) 자바에서는 future를 통해 다른 작업을 하다가, 값이 필요해지면 get()을 해서 기다릴 수 있습니다.아래 코드도 비슷하게 동작합니다.slow future를 호출해서 본 작업을 실행하고, Result()를 호출하면, 결과가 올 때 까지 기다립니다. package mainimport ( "context" "fmt" "sync" "time")type Future interface { Result() (string, error)}type In.. 2024. 6. 29.