주요 주제
- 주문 시스템의 독특한 특징과 고민
- 시스템의 장애와 대응 방안
- 어플리케이션 샤딩과 데이터 분산 저장 방식의 효과적인 구현 방안
- 대용량 데이터 조회 성능 개선 방안 모색
- 주문 시스템의 도메인 라이프 사이클 분석 및 개선
- 어플리케이션 샤딩 적용을 위한 데이터 정리 및 단일화
요약
배달의 민족 주문 시스템
- 배달의 민족 주문 시스템을 만들면서 여러 시행착오를 겪었고 그 안에서 굉장히 많이 성장을 해왔음
- 그 경험했던 시행착오들을 여러분들에게 공유드리고 싶어서 이 자리에 서게 되었음
- 배달의 민족 주문 시스템이 어떤 고민을 하면서 만들고 있는지, 성장 통제를 어떻게 극복해 나가면서 시스템이 진화해 나가는지를 말씀드리는 것임
음식 주문 시스템의 특징
- 주문 시스템은 다른 커머스 도메인과 다르게 독특한 특징을 가지고 있음
- 커머스 도메인의 특성과 음식 주문이라는 독특한 도메인의 특성을 고민하면서 시스템을 개발해 나가고 있음
- 마이크로 서비스 아키텍처를 추구하면서 어떻게 하면 시스템들 간에 잘 정리가 되면서 통신을 할 수 있을지 그런 부분을 고민하면서 개발하고 있음
- 대규모 트랜잭션을 안정적으로 처리하기 위해 많은 고민을 하면서 개발하고 있음
대용량 데이터의 조회 성능 개선
- 시스템이 장애가 나게 되면 전체 시스템에 장애가 이어지면서 베딩 서비스 자체가 유통이 되는 크리티컬한 이슈를 가지고 있음
- 대용량 데이터에 대해서 조회 성능이 계속 나빠지는 부분을 어떻게 해소해 나가는지 말씀드릴 것임
- 대규모 트렌드 션 계속 주문 수가 증가하면서 쓰기 처리 장비가 공간 쓰기 처리나 하계치에 도달하는 이슈가 많아짐
- msa로 아키텍처를 전환해 나가다 보니 무분별한 이벤트 발행으로 유실되는 이벤트도 많아지고 서비스의 흐름을 파악하기 어려워지는 아키텍처가 자성을 높아지게 되는데 이런 부분을 어떻게 개선해 나갔는지까지 소개해 드리면서 발표를 마무리해보도록 하겠음
주문 도메인 라이프 사이클
- 주문 인터널 api 서버는 주문 내역이나 기타 주문 정보가 필요한 서비스들에 주문 정보를 조회할 수 있는 데이터를 제공해 주는 ai 서버임
- 주문 내역 상세를 보여주기 위해서는 많은 정보가 필요함
- 주문 내역 상세를 보여주기 위한 api 리스턴스가 우측에 보이는 제이슨 스탭인데 방대한 양의 데이터를 조회해서 보여줘야 함
- 정규화를 해서 해결하기로 함
- 주문 도메인의 생명줄은 주문 생성, 접수 완료, 취소라는 크게 주문 도메인 라이프 사이클을 가지고 있음
- 주문 도메인 라이프 사이클 안에서만 도메인의 변경이 발생함
- 도메인 이벤트가 발행되게 되면 주문 이벤트 처리기 애플리케이션에서 데이터를 동기화해서 데이터 동기화를 이루어낼 수 있음
샤딩 전략
- 분산 처리에서 유통을 분산시켜보자고 설계를 하게 됨
- 오로라 장비는 엔진이 샤딩을 지원하지 않는 엔진이어서 해결이 될 수 없었음
- 어플리케이션 사진을 구현하기 위해서는 데이터를 저장할 때 어떤 카드의 데이터를 저장할지 결정하는 차진 전략에 대한 고민이 필요했고 두 번째로는 저장된 데이터를 어떻게 조회해 와서 시간 순서대로 잘 나열해서 제공해 드릴 수 있을지 데이터를 다시 애그리게이터 하는데 어떻게 해야 될지 하는 크게 두 가지 기능이 필요했음
- 샤딩 전략을 어떤 걸 사용할까 고민을 해봤는데 리서칭한 전략은 크게 세 가지였음
- 키 베이스드 샤딩은 해시 펑션을 통해서 데이터를 고르게 균등하게 내보낼 수 있는 장점이 있음
- 레인지 베이스 샤딩은 특정 값의 렌즈를 통해서 샤드를 결정하면 되기 때문에 구현이 매우 간단하다는 장점을 가지고 있음
주문 시스템의 특징
- 주문 시스템의 특징은 배달의 민족 서비스 특성상 음식 주문이 제대로 일어나지 않으면 대 서비스 자체가 장애라고 예측하는 고객분들이 많은 특징을 가지고 있음
- 주문 시스템은 정책상 최대 30일까지만 주문 취소가 가능해서 데이터의 변경이 최대 30일까지만 가능하며, 음식 주문의 특성상 대부분의 주문은 하루 내에 배달 완료가 돼서 처리가 되기 때문에 데이터가 완결되는 시간은 대체로 하루 내에 스냅샵 형태로 데이터가 바뀜
- 저희는 단일 장애 포인트를 피해서 최대한 시스템에 장애가 가지 않게끔 하자라는 전략을 취함
- 동적 데이터는 길어야 30일 대부분은 하루 내에 완결이 되기 때문에 스타드의 추가는 많이 일어나지 않아도 될 것이며, 차드의 추가가 일어난다 해도 최대 30일이 지나면 대리권은 결국에는 균등하게 붕괴될 것이다라는 결론을 내리게 됨
어플리케이션 샤딩
- 샵의 디터 키는 샵의 키가 어느 샷으로 가라는 걸 매핑해 놓은 매핑 클래스임
- 서비스 레이에서 사드가 어떤 차드로 반환하기로 결정하였고 이를 스레드 로퍼에 저장하는 것까지 해서 에스펙트 j의 동작은 무리되게 됨
- 에스트래픽 라우팅 데이터 소스에서 디디터밍 커런트 로버피라는 메소드를 오버라이즈 해서 미리 저장해놨던 사드 보도기를 3d 오터에서 가져오게 되고 이를 통해서 데이터 소스를 결정하게끔 구현을 해놓게 되었음
- 어플리케이션 샤딩을 적용하면서 쓰기 오천이 증가하는 부분에 대해서 똑같은 ha 구성을 앰버에 가져가면서 스케일 아웃으로 데이터를 고르게 분산시켜서 저장을 하면서 요청을 분산시키며 대응이 가능한 구조를 갖추겠음
도메인 로직과 서비스 로직의 분리
- 어플리케이션 이벤트를 통해 도메인 로직과 서비스 로직을 분리하는 것이 어려움
- 이를 해결하기 위해 내부 데이터와 외부 데이터를 정리함
이벤트 발행 실패 시 서비스의 일관성
- 이벤트 처리의 주체를 단일화함으로써 서비스 로직을 한 곳에서 관리하고자 하는 니즈가 더 컸음
- 도메인 로직과 서비스 로직 모두 실패했을 때 서비스의 일관성을 가져갈 수 있음
- 도메인 로직이 수행돼도 핸드실 커니 때 이후에 이벤트 발행이 실패될 경우에는 도메인 로직은 성공했지만 서비스 로직은 실패하면서 서비스의 일관성을 합치는 경험을 줄 수 있음
- 이벤트 발행이 실패가 되더라도 트랜잭션 커밋이 되면서 아웃바우스 ntt의 데이터 페이보드가 저장이 돼 있었기 때문에 이벤트 유
발생했을 때 다시금 이 아홉마팬티를 통해서 재발행이 가능하게 설계가 가능하게 됨
---------
추천시스템
주요 주제
- 추천 시스템 팀의 구성과 업무 수행 방식
- 데이터 전달 방식과 의존성 관리
- 실시간 데이터 추천 서비스를 위한 필요 사항과 구현 방법
다음 할 일
- 데이터 수집 및 처리 방법 검토
요약
추천 시스템 팀의 성장
- 추천 시스템 팀이 대외적인 공간에서 기술적인 내용을 공유하고 소개하는 것은 처음임
- 추천 시스템 팀이 어떻게 성장했는지 공유하고 배운 교훈들을 공유할 것임
추천 시스템 팀의 고객
- 추천 시스템 팀은 추천이라는 단 하나의 목적을 위해 만들어진 목적 조직임
- 데이터 사이언티스트와 데이터 엔지니어 그리고 dpm 이렇게 세 직군으로 구성되어 있음
- 추천 시스템 팀의 데이터 엔지니어에게는 두 부류의 고객이 있음
- 첫 번째 고객은 데이터 사이언티스트임
추천 시스템의 개발 과정
- 추천 시스템 팀의 데이터 엔지니어는 머신러닝 코드도 보고, api 서버도 개발하고, 데이터 파이 파일도 만들고, 추천과 관련된 모든 업무를 수행하고 있음
- 추천 서비스가 실제로 어떤 과정을 통해 만들어지는지 함께 살펴봄
- 추천 머신러닝 하면 빠지지 않고 등장하는 그림임
- 데이터를 가져와서 저처리하고 모델을 학습하고 평가하고 배포한 다음에 피드백을 받아서 끊임없이 개선하는 과정임
- 머신러닝 서비스를 개발하기 위해서는 필요함
- 학습과 예측을 어떻게 구성하느냐에 따라서 전체적인 시스템의 모습이 달라짐
오프라인 추첨 방식
- 오프라인 추첨 방식은 미리 추첨 결과를 뽑아서 저장해 놓는 방식을 오프라인 추첨 오프라인 예측 방식이라고 부르고 있음
- 학습 후 온라인 예측 방식은 사용자가 장바구니에 어떤 상품을 담았을 때 그 상품과 함께 어울릴 만한 상품을 추천해 주는 서비스임
- 온라인 예측을 위해서는 모델뿐만 아니라 모델에 함께 전달할 피처 데이터도 필요함
데이터베이스의 의존성
- 데이터를 데이터베이스에 올려줌으로써 추천을 전달할 수 있음
- 데이터 전달 방식은 두 가지 의존성을 불러옴
- api를 통해 주고받자 그리고 꼭 필요한 정보만 주고받자는 정책도 의존성을 줄이는 데 매우 큰 영향을 미쳤음
에어플로우의 단점
- 에어플로우에서 모델 학습 테스크를 수행하면 gpu 서버에 베이 콘다 가상 환경에서 활성 파일이 실행되는 시기였음
- 에어플로우에 ssh 오퍼레이터를 사용해서 gpu 서버로 명령어를 날림
- 에어플로우의 단점은 학습 안정성이 떨어지고 의존성 관리가 어렵다는 것임
- 데이터센터의 쿠버네티스 환경을 구축해서 학습 환경을 컨테이너 기반으로 전환함
코네틱스 환경의 실시간 서비스
- 하이퍼 파라미터 튜닝, 벡터 서시, 대용량 데이터 분산 처리 등 새로운 서비스가 보이면 빠르게 셋업해서 테스트해보는 게 중요함
- 코네틱스 환경에서 사용하기 쉬운 형태로 제공이 됨
- 실시간이라는 단어를 잘 살펴볼 필요가 있는데 다 같은 실시간이 아니기 때문임
실시간 데이터 수집
- 장바구니에 담은 상품 등을 추천 서비스에 녹여내면 완전히 새로운 서비스를 만들어낼 수 있음
- 실시간성 데이터를 추천 서비스에 잘 녹여내기 위해서는 실시간 정보를 함께 전달받는 것이 가장 간단한 방법임
- 실시간 데이터를 얻기 위해서 추가로 뭔가를 개발할 필요가 없음
- 모델 혹은 서비스의 요구 사항이 바뀔 수 있음
- 실시간 데이터를 수집하고 전달한다는 것 자체가 앞쪽 서버에게 부담이 될 수 있음
데이터 플랫폼 팀의 ups
- 데이터 플랫폼 팀의 ups에 올라탈까 아니면 우리가 직접 셋업해서 사용할까 두 가지 선택지가 있는데 여러분들이라면 어떤 선택을 할 것 같으신지 물어봄
- 데이터 플랫폼 팀도 일이 바쁘신데 우리의 요구 사항을 다 맞춰주실 수 있을까 또는 새벽에 갑자기 문제가 생기면 데이터 플랫폼 팀에서 빠르게 대응을 해 주실 수 있을까 걱정이 됨
sql 자동 포맷팅
- 목표가 명확해야 함
- sql 자동 포맷팅 또는 api를 빠르게 구현하는 것이 목표임
- 목표를 해결하기 위해 돌진하는 것이 중요함
'TIL' 카테고리의 다른 글
TIL 비전공자 부트캠프 출신 취업 후 7개월 후기 20231027 (1) | 2023.10.27 |
---|---|
TIL 카카오 로그인 API, 닉네임 변경, 탈퇴 구현하기 220315 (1) | 2023.03.15 |
TIL 오랜만에 aws ec2 220314 (0) | 2023.03.15 |
TIL 회원가입 로그인 구현하기 230312 (0) | 2023.03.12 |
TIL 프로그래머스 내기 시작 230308 (0) | 2023.03.08 |