전체 글
Happy Hacking!
-
사내에서 책 마이크로서비스 아키텍처 구축 스터디를 하고 있습니다. 이 책에서 나온 쇼피파이의 사례를 조금 더 찾아보고 사내에서 공유했는데 이때 자료를 올려봅니다 https://m.yes24.com/Goods/Detail/119319406 개요 쇼피파이는 이커머스 기업중 하나인데, 우리가 참고하기 좋은 구조겠다 싶어서 간단하게 요약도 해보고 참고 자료들도 일부 가져와 봤습니다. 각잡고 번역한 것도 아니고 영어 실력이 조악해서 틀릴 수 있으니 양해 바랍니다… 쇼피파이는 당시 직원 수가 4천 명이고, 판매자 수가 80만 명에 달하는 규모의 회사인데, Ruby on Rails로 구성되어 있습니다. (지금은 직원 수 9천명 조금 넘는 정도 되네요) (이때 당시 기록을 보니까 개발자는 한 1천명 정도 되는 규모였던..
쇼피파이 모듈식 모노리스 전환 사례사내에서 책 마이크로서비스 아키텍처 구축 스터디를 하고 있습니다. 이 책에서 나온 쇼피파이의 사례를 조금 더 찾아보고 사내에서 공유했는데 이때 자료를 올려봅니다 https://m.yes24.com/Goods/Detail/119319406 개요 쇼피파이는 이커머스 기업중 하나인데, 우리가 참고하기 좋은 구조겠다 싶어서 간단하게 요약도 해보고 참고 자료들도 일부 가져와 봤습니다. 각잡고 번역한 것도 아니고 영어 실력이 조악해서 틀릴 수 있으니 양해 바랍니다… 쇼피파이는 당시 직원 수가 4천 명이고, 판매자 수가 80만 명에 달하는 규모의 회사인데, Ruby on Rails로 구성되어 있습니다. (지금은 직원 수 9천명 조금 넘는 정도 되네요) (이때 당시 기록을 보니까 개발자는 한 1천명 정도 되는 규모였던..
2024.03.30 -
개요 사내에서는 enum을 관리할 때 대부분 숫자코드를 사용한다. 처음에는 생쿼리를 볼때 뭘 의미하는지 몰라서 불편했는데, 순서가 있는 경우 꽤 편하다는 걸 느꼈고, 어떤 점들에서 좋은지 내 생각들을 적어보았다. (틀릴 수 있음 + 의견 환영) 쿼리를 볼때 헷갈리진 않나요? int로 관리할 때 이게 최대 단점인 것 같다. 쿼리만 봐서는 어떤 상태를 의미하는지 파악하기 어렵다. 그런데 한 편으로는 중요한 값들은 어차피 외우고 있기도 하고 (ex. order_item.processing_status=4 => 배송 완료) 애플리케이션에서 코드를 찾아보면 되니까 지금은 크게 불편한 점을 못느끼고 있다. 그리고 쿼리를 볼때 말고 칠때라면, 어차피 애플리케이션에서 어떤 값이 들어있는지 찾아봐야 한다. (ex. "배..
순서가 있는 상태면 varchar 말고 int를 쓰자개요 사내에서는 enum을 관리할 때 대부분 숫자코드를 사용한다. 처음에는 생쿼리를 볼때 뭘 의미하는지 몰라서 불편했는데, 순서가 있는 경우 꽤 편하다는 걸 느꼈고, 어떤 점들에서 좋은지 내 생각들을 적어보았다. (틀릴 수 있음 + 의견 환영) 쿼리를 볼때 헷갈리진 않나요? int로 관리할 때 이게 최대 단점인 것 같다. 쿼리만 봐서는 어떤 상태를 의미하는지 파악하기 어렵다. 그런데 한 편으로는 중요한 값들은 어차피 외우고 있기도 하고 (ex. order_item.processing_status=4 => 배송 완료) 애플리케이션에서 코드를 찾아보면 되니까 지금은 크게 불편한 점을 못느끼고 있다. 그리고 쿼리를 볼때 말고 칠때라면, 어차피 애플리케이션에서 어떤 값이 들어있는지 찾아봐야 한다. (ex. "배..
2024.03.20 -
개요 어제 코딩하다가 값을 잘못 심어서 버그를 만들었다. 덕분에 값이 이상하게 들어가고 있는데 어디서 들어가고 있는지 몰라서 좀 헤맨게 있는데 그걸 좀 풀어볼까 한다. 바로 default param에 함수 호출을 집어넣었더니, 호출할 때마다 같은 값을 반환하는 것이었다 이것과 관련해서 (원리를 잘 설명한 건 아니지만) 꽤 잘 설명한 케이스가 있는데 궁금하면 읽어보는 게 좋다 https://docs.python-guide.org/writing/gotchas/ Common Gotchas — The Hitchhiker's Guide to Python docs.python-guide.org 아무튼 저렇게 같은 값을 반환하는 이유는, default param에 들어가는 값은 함수 정의시 평가되기 때문이다. 즉, ..
Python default param 평가 시점과 내 생각개요 어제 코딩하다가 값을 잘못 심어서 버그를 만들었다. 덕분에 값이 이상하게 들어가고 있는데 어디서 들어가고 있는지 몰라서 좀 헤맨게 있는데 그걸 좀 풀어볼까 한다. 바로 default param에 함수 호출을 집어넣었더니, 호출할 때마다 같은 값을 반환하는 것이었다 이것과 관련해서 (원리를 잘 설명한 건 아니지만) 꽤 잘 설명한 케이스가 있는데 궁금하면 읽어보는 게 좋다 https://docs.python-guide.org/writing/gotchas/ Common Gotchas — The Hitchhiker's Guide to Python docs.python-guide.org 아무튼 저렇게 같은 값을 반환하는 이유는, default param에 들어가는 값은 함수 정의시 평가되기 때문이다. 즉, ..
2024.03.15 -
개요 며칠 전에 DB 부하로 인해 사내에서 작지 않은 장애가 났었다. write DB에서 CPU가 갑자기 높게 치더니 기어이 장애가 발생했다. 다행히 팀원 분들이 재빠르게 대처해 주셔서 곧바로 해결되었다. 그런데 생각해 보니 DB CPU가 언제 많이 쓰이는지 제대로 알지 못하고 있었다. IO에만 신경쓰고, CPU는 뭐 filesort할 때나 쓰이지 않을까 생각하고 있었는데 이번 일을 보니 꼭 그러한 건 아닌 것 같다. 따라서 이번 기회에 CPU가 언제 높게 치는지 몇가지 조사해 보았다. 1. 레코드 잠금 경합 트랜잭션 간 lock 경합이 발생할 때를 말한다. lock 경합을 확인할 때는 information_schema.innodb_lock_waits 테이블을 사용한다. 다음 쿼리는 block된 트랜잭션..
MySQL에서 CPU가 높게 칠때개요 며칠 전에 DB 부하로 인해 사내에서 작지 않은 장애가 났었다. write DB에서 CPU가 갑자기 높게 치더니 기어이 장애가 발생했다. 다행히 팀원 분들이 재빠르게 대처해 주셔서 곧바로 해결되었다. 그런데 생각해 보니 DB CPU가 언제 많이 쓰이는지 제대로 알지 못하고 있었다. IO에만 신경쓰고, CPU는 뭐 filesort할 때나 쓰이지 않을까 생각하고 있었는데 이번 일을 보니 꼭 그러한 건 아닌 것 같다. 따라서 이번 기회에 CPU가 언제 높게 치는지 몇가지 조사해 보았다. 1. 레코드 잠금 경합 트랜잭션 간 lock 경합이 발생할 때를 말한다. lock 경합을 확인할 때는 information_schema.innodb_lock_waits 테이블을 사용한다. 다음 쿼리는 block된 트랜잭션..
2024.03.15 -
개요 view에서 request 단위로 transaction.atomic()을 걸고 bulk_create와 그 후 생성한 obj를 find했으나 조회할 수 없는 현상이 있었다. @transaction.atomic() some_view(): svc1.create() svc2.bulk_create() svc3.retrieve() 이런 느낌의 view였는데, svc3에서 svc1에서 생성한 obj는 조회가 됐었으나, svc2에서 생성한 objs는 조회할 수 없었다. 본문 내가 기대했던 건, svc1이든 svc2든 같은 물리 트랜잭션 내에 존재하기 때문에 svc3에서 둘다 모두 조회되는 것이었다. 그럼에도 불구하고 svc1에서 생성된 것만 조회된다는 것은 무언가 문제가 있어 보였다. 여기서 조사했던 건 bulk..
django bulk_create시 같은 트랜잭션에서 created objects 조회할 수 없는 현상개요 view에서 request 단위로 transaction.atomic()을 걸고 bulk_create와 그 후 생성한 obj를 find했으나 조회할 수 없는 현상이 있었다. @transaction.atomic() some_view(): svc1.create() svc2.bulk_create() svc3.retrieve() 이런 느낌의 view였는데, svc3에서 svc1에서 생성한 obj는 조회가 됐었으나, svc2에서 생성한 objs는 조회할 수 없었다. 본문 내가 기대했던 건, svc1이든 svc2든 같은 물리 트랜잭션 내에 존재하기 때문에 svc3에서 둘다 모두 조회되는 것이었다. 그럼에도 불구하고 svc1에서 생성된 것만 조회된다는 것은 무언가 문제가 있어 보였다. 여기서 조사했던 건 bulk..
2024.03.09 -
용어들 몰&몰 : 오프라인 매장을 온라인으로 그대로 들여오는 구조 고객 관여도가 낮은 제품 : 고객이 온라인으로 주문해도 품질을 믿을 수 있는 제품. 반품할 가능성이 적다. GMV : Gross Merchandise Volume : 특정 기간동안 거래된 상품 총 금액. 실제 이익보다 거래된 상품의 판매가나 실결제 금액 총액으로 산정하는 경우가 많다 오픈 마켓 : 입점이 오픈되어 있어 롱테일에 가장 적합한 형태 리테일 : 생산자 / 도매업자가 아닌 측에서 낱개로 파는 일 롱테일 : 80%의 사소한 다수가 20%의 핵심 소수보다 뛰어난 가치를 창출한다는 이론. 역 파레토의 법칙 객단가(AOV) : 고객 1인당 평균 지불하는 금액. 보편적으로 매출액 / 고객 수. 해당 이커머스 판매하는 핵심 상품 가격대 / ..
이커머스 관련 지식 용어들용어들 몰&몰 : 오프라인 매장을 온라인으로 그대로 들여오는 구조 고객 관여도가 낮은 제품 : 고객이 온라인으로 주문해도 품질을 믿을 수 있는 제품. 반품할 가능성이 적다. GMV : Gross Merchandise Volume : 특정 기간동안 거래된 상품 총 금액. 실제 이익보다 거래된 상품의 판매가나 실결제 금액 총액으로 산정하는 경우가 많다 오픈 마켓 : 입점이 오픈되어 있어 롱테일에 가장 적합한 형태 리테일 : 생산자 / 도매업자가 아닌 측에서 낱개로 파는 일 롱테일 : 80%의 사소한 다수가 20%의 핵심 소수보다 뛰어난 가치를 창출한다는 이론. 역 파레토의 법칙 객단가(AOV) : 고객 1인당 평균 지불하는 금액. 보편적으로 매출액 / 고객 수. 해당 이커머스 판매하는 핵심 상품 가격대 / ..
2024.03.02