- 72
- 244 087
당근테크
South Korea
เข้าร่วมเมื่อ 19 ส.ค. 2020
당근의 팀원 모두는 사업가이자 사용자의 마음을 읽어내는 사람들이에요. 동네의 가치를 발견하고, 커뮤니티에 속한 모든 주체의 삶에 긍정적 영향을 줄 수 있는 서비스를 만들어요. 문제를 발견하고 가설을 검증하는 끊임 없는 시행착오 속에서, 회사와 우리는 함께 성장하고 있어요.
Kafka 뉴비의 마이그레이션, 산 넘고 물 건너 | 2024 당근 테크 밋업
어느 날, 카프카 뉴비가 마주한 회사 전체 카프카 마이그레이션 도전! 레거시 카프카에서 신규 카프카로 클러스터의 장소투명성을 유지하면서 점진적 마이그레이션을 진행할 수 있을까!?
사용자와 운영자, 모두가 행복한 마이그레이션을 수행한 경험에 대해 소개해요.
🥕 영상을 보고 당근에 관심이 생기셨다면 채용 공고를 확인해보세요! about.daangn.com/jobs/
사용자와 운영자, 모두가 행복한 마이그레이션을 수행한 경험에 대해 소개해요.
🥕 영상을 보고 당근에 관심이 생기셨다면 채용 공고를 확인해보세요! about.daangn.com/jobs/
มุมมอง: 751
วีดีโอ
빠르게 변하는 운영 도메인에서 살아남는 코드 만들기 | 2024 당근 테크 밋업
มุมมอง 1.3K2 หลายเดือนก่อน
당근은 중고거래를 넘어 커뮤니티, 알바 등 다양한 ‘당신 근처의’ 서비스로 빠르게 확장해 나가고 있어요. 서비스가 빠르게 확장되는 만큼, 사용자가 당근을 안전하고 편리하게 이용할 수 있도록 지원하는 운영 환경도 빠르게 대응할 수 있어야 하죠. 당근의 운영개발팀은 빠른 대응을 위해 언제나 확장성, 생산성 그리고 설정 가능성을 염두에 두고 개발에 임하고 있어요. 이 세션에서는 실제 당근의 문의 처리 도구를 개선하는 과정에서 역할 분리, 메타 프로그래밍, 규칙 기반 UI 생성, 설정 분리와 같은 다양한 기법을 활용해 빠른 대응이 가능한 시스템을 어떻게 구축했는지 공유하고자 해요. 이와 함께, 이러한 기법을 실제로 적용할 때 유의해야 할 점에 대해서도 다뤄요. 반복되는 비슷한 코드 작업에 지치신 분, 더 효율...
당근 추천 알고리즘 - 홈피드 후보모델 파헤치기 | 2024 당근 테크 밋업
มุมมอง 7862 หลายเดือนก่อน
“매일 당근에 새로 생성되는 중고거래 게시글 X만 개. 어떤 글을 추천할까?” 당근의 후보모델을 소개해요. 후보모델 학습부터 서빙까지 어떻게 지역성과 범용성을 갖추었는지 궁금하지 않으신가요? 당근 추천의 핵심 컴포넌트인 후보 모델 파이프라인은 7개 이상의 타입의 글에 대해 하루에 1,000번 이상 실행되는 확장성을 갖추고 있어요. 이 파이프라인과 함께 당근의 지역성을 기반으로 후보모델의 성능을 높이기 위해 적용한 다양한 Negative Sampling Strategy를 설명해요. 🥕 영상을 보고 당근에 관심이 생기셨다면 채용 공고를 확인해보세요! about.daangn.com/jobs/
당근알바 초기 엔지니어링 전략: 빠르게, 빠르게, 더 빠르게 | 2024 당근 테크 밋업
มุมมอง 8892 หลายเดือนก่อน
당근알바의 초기 엔지니어링 전략을 소개해요. 새로운 제품이 겪는 Cold Start 문제를 해결하는 과정에서 어떤 엔지니어링을 했는지, 생산성과 사용자에게 전달된 가치 측면에서 소개해요. 또한 초기 엔지니어링 전략이 팀과 제품에 어떠한 영향을 미쳤는지 공유해요. 🥕 영상을 보고 당근에 관심이 생기셨다면 채용 공고를 확인해보세요! about.daangn.com/jobs/
GraphQL Schema 기반으로 협업하고 생산성 높이기 | 2024 당근 테크 밋업
มุมมอง 1.6K2 หลายเดือนก่อน
처음 당근알바를 만들 때, GraphQL을 도입하며 고려했던 요소는 “웹뷰의 네이티브 같은 빠릿빠릿한 사용자 경험”, “빠른 개발 및 배포 사이클” 그리고 “웹 서비스로의 확장 가능성”이었어요. 4년이 지난 지금 이러한 결정을 되돌아보며, 사용자 경험과 생산성을 최우선으로 하는 팀에게 GraphQL Schema 기반 협업이 어떤 의미가 있는지 공유해요. 🥕 영상을 보고 당근에 관심이 생기셨다면 채용 공고를 확인해보세요! about.daangn.com/jobs/
잃어버린 시간, 인프라 자동화로 되찾다 | 2024 당근 테크 밋업
มุมมอง 1.4K2 หลายเดือนก่อน
다들 한 번쯤 하루 종일 운영 업무만 하다 퇴근하신 적 있지 않으신가요? 당근에서도 처음에는 운영 업무를 수동으로 처리했지만, 점차 늘어나는 업무에 고생하고 있었어요. 당근 인터널 프로덕트 팀에서는 이런 문제를 엔지니어링으로 해결하고자 했는데요. 인프라 자동화에 관심 있으신 분들께 이 경험을 들려드릴게요. 🥕 영상을 보고 당근에 관심이 생기셨다면 채용 공고를 확인해보세요! about.daangn.com/jobs/
영상 플랫폼 운행 시작합니다 | 2024 당근 테크 밋업
มุมมอง 8212 หลายเดือนก่อน
“영상 플랫폼 운행 시작합니다. 목적지까지 편안하게 모십니다!” 아키텍처에 대해 하나도 모르던 개발자가 영상 플랫폼에 헥사고날 아키텍처를 적용해, 팀 동료는 물론 플랫폼 이용자인 서비스 개발자의 개발 경험(Development Experience, DX)을 향상시킨 이야기를 공유해요. 헥사고날 아키텍처가 무엇인지, 영상 플랫폼에 이를 도입한 이유와 장점 그리고 어려움을 어떻게 극복하고 있는지 궁금하신 분들은 많이 찾아와주세요! 🥕 영상을 보고 당근에 관심이 생기셨다면 채용 공고를 확인해보세요! about.daangn.com/jobs/
내 타입스크립트 코드가 이렇게 느릴 리 없어! | 2024 당근 테크 밋업
มุมมอง 2.5K2 หลายเดือนก่อน
타입스크립트로 개발하면서 점점 느려지는 코드 추론 속도 때문에 고민했던 적 있으신가요? 시간이 지남에 따라 코드베이스가 커졌으니 자연스러운 수순이라고 생각할 수 있어요. 그런데 혹시 잘못 작성한 타입 때문에 타입 추론이 느려지고 있었다면요? 이 세션에서는 잘못된 타입이 타입스크립트 추론 속도를 어떻게 저하시키는지 살펴보고, 타입 추론의 병목 지점을 진단하고 해결할 수 있는 방법을 소개해요. 🥕 영상을 보고 당근에 관심이 생기셨다면 채용 공고를 확인해보세요! about.daangn.com/jobs/
프론트엔드에게 배포플랫폼이란 - nothing or everything | 2024 당근 테크 밋업
มุมมอง 1.1K2 หลายเดือนก่อน
프론트엔드 개발자에게 배포는 조금 각별해요. 프로덕션에 유일무이하게 동작하는 스냅샷이라는 점에서는 버저닝 엔드포인트가 살아 있는 API 배포와 달라요. 최신 버전이 에버그린 상태여야 한다는 점에서는 안정적인 버전으로 고정할 수 있는 라이브러리 배포와 달라요. 프론트엔드 개발자로서 배포 플랫폼을 제작하는 경험은 더 각별했어요. 프로젝트 배포를 통해 최종 사용자에게 페이지를 전달하기 위해, 정말 많은 기술적 고민과 배경이 필요했기 때문이에요. 이 많은 고민과 배경이 플랫폼 제작에 필요한 백엔드/인프라 지식보다도 (의외로) 프론트엔드 개발자에게 친숙한 지식들이라는 사실을 전달하고, 배포 플랫폼을 만들며 겪은 경험을 토대로 프론트엔드 개발자가 나아갈 방향에 대해 공유해요. 🥕 영상을 보고 당근에 관심이 생기셨...
중고거래 시멘틱서치 도입기: 꽁꽁 얼어붙은 키워드 위로 벡터가 걸어다닙니다 | 2024 당근 테크 밋업
มุมมอง 4302 หลายเดือนก่อน
중고거래 시멘틱서치 도입기: 꽁꽁 얼어붙은 키워드 위로 벡터가 걸어다닙니다 | 2024 당근 테크 밋업
웹/웹뷰 코드 합치면 개발 2배 빨라지는 거 아니었어요? | 2024 당근 테크 밋업
มุมมอง 1.3K2 หลายเดือนก่อน
웹/웹뷰 코드 합치면 개발 2배 빨라지는 거 아니었어요? | 2024 당근 테크 밋업
당근의 회원 시스템을 마이크로서비스로 분리하기 | 2024 당근 테크 밋업
มุมมอง 6772 หลายเดือนก่อน
당근의 회원 시스템을 마이크로서비스로 분리하기 | 2024 당근 테크 밋업
당근 채팅 시스템은 어떻게 만들까? | 2024 당근 테크 밋업
มุมมอง 9K2 หลายเดือนก่อน
당근 채팅 시스템이 탄생한 과정을 소개해요. 당근의 수많은 사용자들이 실시간으로 메시지를 주고받는 방법과 이를 효율적으로 저장하는 방식이 궁금하지 않으신가요? 이 세션에서는 먼저 메시지 전달의 기본 원리를 살펴본 후, 서버가 2대일 때 발생하는 메시지 동기화 방법과 서버 간 비동기 처리 방식을 설명해요. 저장 측면에서는 필요한 기능, 스키마 설계, 스케일 업, 인덱싱, 쿼리 최적화, 캐싱 기법 등 다양한 주제를 다루어요. 또한 리플리케이션과 샤딩, 채팅 데이터의 분할 방법 및 저장소 마이그레이션 경험을 쉽게 이야기하려 해요. 🥕 영상을 보고 당근에 관심이 생기셨다면 채용 공고를 확인해보세요! about.daangn.com/jobs/
우리 동네 어디까지 좁아지는 거예요? 자연경계로 좁혀보는 우리 동네 | 2024 당근 테크 밋업
มุมมอง 3662 หลายเดือนก่อน
이 세션에서는 당근마켓에서 좁은 지역 내 연결을 강화하기 위해 행정구역 경계보다 더 좁은 영역으로 분할하는 기술을 소개해요. 기존의 사례들은 다양한 공간 분할 기술을 사용하고 있지만, 대부분의 기술은 공간적 맥락을 고려하지 않고 일정한 간격으로 분할하거나 사용자나 관리자가 직접 데이터를 생성하고 관리하도록 요구해요. 이러한 방법들 때문에 사용자들이 분할된 공간을 어색하게 느끼거나 익숙하지 않은 지역을 설정하는 데 어려움을 겪을 수 있어요. 이에 우리는 공간적 맥락을 고려하면서도 인위적인 개입이 최소화된 자연스러운 영역 분할 방법을 실험하고 있어요. 이를 위해 다양한 자연 경계 데이터를 바탕으로 GIS 공간 분석 기술을 적용하여 영역을 더 좁게 분할하도록 구현했어요. 본 세션에서는 이 과정에서 직면한 기...
ㅎㅖ어져서 팝니ㄷr ☆: LLM과 임베딩 유사도로 빠르게 패턴을 바꾸는 업자 잡아내기 | 2024 당근 테크 밋업
มุมมอง 2K2 หลายเดือนก่อน
“여친이랑 혜어져서… 받은거…. 정리합니다 ㅠㅠ!!…”, “☆ㅍㅖ업정리☆ 눈물을 머금고… 아쉽지만 싸게 던져요ㅠ”와 같은 중고거래 게시글을 본 적 있으신가요? 비정상 기기, 위변조된 APK 등 부적절한 방법을 사용하는 어뷰저들의 게시글이에요. 이들은 실시간으로 게시글 작성 패턴을 바꾸며 탐지를 회피해요. 한 시간 전에는 이별했다며 등장하고, 한 시간 후에는 눈물을 흘린다며 판매를 시도하죠. 이 게시글들은 사람이 보기에 공통점이 있지만 supervised learning으로 학습된 모델은 공통점을 캐치하기 어려워하고, 판매 물품에 대해 큰 편향(bias)을 보였어요. 또한 제목 생성기, 이미지 세탁기 등 매크로 프로그램을 사용하는 어뷰저의 속도를 supervised learning으로 따라가기에도 한계가...
지역 기반으로 중고거래 검색을 샤딩하라 | 2024 당근 테크 밋업
มุมมอง 3702 หลายเดือนก่อน
대용량, 대규모 데이터를 다룰 때 샤딩(sharding)은 필수적으로 고려해야 하는 요소예요. 하지만 샤딩을 잘 적용하기란 결코 쉬운 일이 아니에요. 저희 검색플랫폼팀은 대규모의 중고거래 게시글을 샤딩하면서 지역 기반이라는 서비스 특성까지 고려해야 했고, 이를 프로덕션에 적용하여 좋은 결과를 만들어냈어요. 이 세션은 지역 기반 샤딩 적용 과정을 소개하면서, 검색에 대한 배경지식 없이도 성능 개선과 비용 개선을 위해 샤딩을 적용하려고 검토 중인 분들께 좋은 인사이트가 되길 바라요. 🥕 영상을 보고 당근에 관심이 생기셨다면 채용 공고를 확인해보세요! about.daangn.com/jobs/
수십억 개 연결이 존재하는 당근 그래프에서 GNN 학습하기 | 2024 당근 테크 밋업
มุมมอง 2852 หลายเดือนก่อน
이 세션에서는 중고거래, 당근알바, 모임 등 당근의 다양한 서비스를 하나의 거대한 그래프 구조로 정의하고, 이를 Graph Neural Network로 학습하여 실제 피드 추천에 적용한 과정을 소개해요. 이 과정에서 겪은 기술적인 문제들이 있었는데요. 그중에서 수십억 개의 연결을 가진 그래프를 효율적으로 처리하기 위해 TensorFlow-GNN을 도입해서 분산 처리를 진행한 과정과 핀터레스트에서 발표한 PinSage 방법론을 당근의 그래프 정의에 맞게 적용했던 과정을 설명할 거예요. 마지막으로 학습된 모델을 피드 추천에 이용하는 과정도 함께 소개해요. 🥕 영상을 보고 당근에 관심이 생기셨다면 채용 공고를 확인해보세요! about.daangn.com/jobs/
지표 통합과 탐색: KarrotMetrics와 Explorer로 가치 있는 의사결정하기 | 2024 당근 테크 밋업
มุมมอง 2662 หลายเดือนก่อน
“@data 데이터팀분들께. 이 지표의 정의가 뭔가요? 지표의 이름은 같은데 대시보드마다 값이 달라요. 확인 부탁드려요!”라는 질문을 받아본 적이 있으실까요? 동일한 질문, 매일 해결하기 힘드셨죠? 이런 여러분을 위해 당근의 데이터 가치화팀이 준비했어요. 데이터 가치화팀에서는 지표의 신뢰성, 통일성을 위해 하나의 중앙화된 저장소에 지표를 관리할 수 있도록 ‘KarrotMetrics’를 구축했어요. 그리고 이 지표들을 한 곳에서 볼 수 있도록 ‘KarrotMetrics Explorer’를 만들어 구성원들이 한 곳에서 바로 지표를 확인할 수 있었어요. 이 세션에서는 지표 통합 과정에서 탐색 과정까지 데이터 가치화팀이 어떻게 문제를 해결해 갔는지 소개하고자 해요. 🥕 영상을 보고 당근에 관심이 생기셨다면 채...
멈춰버린 세계: 네트워크 통신 불가를 해결하기 위한 여정(feat. Istio) | 2024 당근 테크 밋업
มุมมอง 6782 หลายเดือนก่อน
멈춰버린 세계: 네트워크 통신 불가를 해결하기 위한 여정(feat. Istio) | 2024 당근 테크 밋업
추천 서빙 시스템 아키텍처: 높은 생산성을 위한 아키텍쳐 및 ML Flywheel | 2024 당근 테크 밋업
มุมมอง 6382 หลายเดือนก่อน
추천 서빙 시스템 아키텍처: 높은 생산성을 위한 아키텍쳐 및 ML Flywheel | 2024 당근 테크 밋업
프레임워크부터 플랫폼까지: 당근 웹뷰 플랫폼 | 2024 당근 테크 밋업
มุมมอง 1.8K2 หลายเดือนก่อน
프레임워크부터 플랫폼까지: 당근 웹뷰 플랫폼 | 2024 당근 테크 밋업
MongoDB On Kubernetes | 2024 당근 테크 밋업
มุมมอง 3922 หลายเดือนก่อน
MongoDB On Kubernetes | 2024 당근 테크 밋업
아이콘, 브랜딩 에셋까지 디자인시스템으로 | 2024 당근 테크 밋업
มุมมอง 1.1K2 หลายเดือนก่อน
아이콘, 브랜딩 에셋까지 디자인시스템으로 | 2024 당근 테크 밋업
우리는 Customer Service에 ML을 잘못 적용하고 있었다! | 당근 ML 밋업 1회
มุมมอง 2K7 หลายเดือนก่อน
우리는 Customer Service에 ML을 잘못 적용하고 있었다! | 당근 ML 밋업 1회
좋은 내용 잘 보고 갑니다! 유용한 팁이네요
32:28 고루틴을 사용해서 서버들과 데이터베이스에 접근하는 과정은 논블로킹으로 처리하셨나요?
전문판매업자들이 정말 '전문' 적이네요. 고생이 많으십니다. 아시는 분은 보드게임을 좋아하셔서 보드게임을 많이 사고 파세요. 그런데 전문판매업자로 인식되어서 영구 정지를 당하셨더라구요. 그래서 그분은 이제 당근을 아예 못쓰고 계세요. 이미 고민 중이시겠지만 False Positive 에 대해 기술적으로, CS 적으로 개선이 되었으면 좋겠습니다. 발표 잘 들었습니다
시간이 지나긴 했는데, zero shot with auto generated prompt few-shot with auto generated prompt로 해보신 적이 있으실까요?
GraphQL에서 에러는 어떤 식으로 관리되었나요?
2:21 오우…!!!!!
23:37 고분..!! 고군…분투한
연봉 1억 드리면 이직 하나요?
유익하고 멋있어요👍
컨슈머 같은 경우에는 queue의 메시지를 구독하고 key-value 스토어를 조회한 다음에 메시지를 전달받을 상대방이 온라인인 경우에 chat server로 메시지를 전달해달라는 요청을 보내고 그렇지 않으면 알림 서버에서 전달하여 push 하는 방식인 것인가요? 이 땐 그냥 API 호출을 수행하나요?
말씀하신 방식이 맞습니다. 11:12 에서 미접속 유저에대한 푸시 설명을 하고있어요. > 이 땐 그냥 API 호출을 수행하나요? 그냥 API 호출이 무엇을 의미하는지 잘 모르겠지만, 푸시알림을 담당하는 서비스가 있고 채팅서버는 이쪽으로 gRPC 요청을 보내는 방식이에요. 푸시 알림 담당 서비스는 Android는 FCM, iOS는 APNS을 통해 알림을 모바일 디바이스로 보내고 있어요. 이 때 채팅서버에서 받은 데이터를 적절히 조합해 모바일로 보내기 위한 페이로드를 OS별로 만들어서 보내야해요. 여기에는 title, subtitle, body, badge count, profile image 등이 해당돼요.
@@Andrewkwon-ec7rk 답변 정말 감사드립니다. 추가적인 질문을 드려도 될까요? 1. 컨슈머는 분리된 서버인가요? 만약 그렇다면 채팅 서버와의 웹소켓 세션관리 등을 관리하고 요청과 세션 정보를 토대로 채팅 메시지를 처리할거 같은데, 채팅서버에서 이를 처리해도 되지 않은지 궁금합니다. 2. 그리고 컨슈머가 채팅서버로 메시지를 전달할 때 서버 IP기반으로 Rest API를 호출하나요? 3. 쿠버네티스 환경이라면, 동적으로 늘어나는 파드의 IP(채팅서버의 IP)를 어떻게 불러오셨는지 궁금합니다.
1. 컨슈머는 분리된 컴포넌트로 따로 pod로 띄우고 있어요. 컨슈머에서는 웹소켓 세션관리는 따로 하지 않고 유저가 어느 서버에 접속되어있는지 key value store에서 확인만 해요. 2. 컨슈머가 채팅서버로 전달할때는 key value store에서 조회한 유저가 붙어있는 서버의 IP 기반으로 gRPC 연결을 맺고 요청을 해요. 3. 동적으로 pod가 늘어나도 pod의 IP를 key value store에서 조회해서 알게되는 방식이기 때문에 미리 IP들을 알아내서 연결을 맺을 필요는 없어요. 처음 서버가 연결될때는 커넥션을 맺겠지만 이후 요청은 맺어진 커넥션에서 요청하는 정도일거에요. 추가로) pod의 DNS를 보고 현재 pod가 유효한 pod인지 lookup 하는 단계를 거쳐요, 이 때 유효하지 않은 pod라고 판단이 되면 key value store에 저장된 해당 값을 삭제해서 보정해요. 만약 미리 연결이 필요한 상황이라면 headless service를 이용해 IP를 가져올수 있을거에요.
위에 대한 내용은 7:18, 9:37에서 설명하고 있어요.
@@Andrewkwon-ec7rk 답변 정말 감사드립니다!
좋은 내용 감사합니다 🎉
내용이 좋네요
강의 잘 들었습니다! GPT-4o와 GPT-4o-mini의 성능 차이는 어느 정도였을까요?
발표 너무 잘 들었어요. Nextjs가 Vercel이랑 어떤 부분에서 강결합이 있는지 궁금해요! Nextjs의 특정 기능을 쓰려면 Vercel을 무조건 써야하나요? 평소 Nextjs를 자연스레 사용하고 있어서 궁금했어요!
너무 좋네요! 잘 들었습니다~
좋은 인사이트가 되었습니다! 수많은 노고가 느껴지는... ! 좋은 영상 감사합니다 👍혹시 Wire proxy는 어떤 프레임워크를 활용하시나요?
zero shot with auto generated prompt는 결국 few shot prompt 로직을 2 stage화 시킨 것과 거의 등가인 것이라고 생각되어지는데요 (이 부분이 틀린 것 같다면 의견 나눠보고싶습니다!) 그러면 기존 few shot이 가지고 있었던 문제인 "주어진 example 이외의 것은 잘 추론하지 못한다" 라는 것을 shot들을 추상화하는 stage를 추가하여 "주어진 example 이외의 전문판매업자 샘플에 대해서도 잘 추론해냈다" 라는 사실도 정량적으로 보여줬으면 더 좋았을 것 같다는 개인 의견입니다! 재밌게 잘 들었습니다!
친절한 네트워킹과 멋진 발표였습니다..!🤗
0:45 2년 뒤에 보러 왔습니다
23:42 분에 언급된 도구가 무엇일까요?
좋은 강의 잘들었습니다!!
좋은 기술이 공유되는 문화를 만들려고 하시는것에 감사합니다~
웹뷰처리는 토스가 진짜 끝내줍니다. 당근팀도 그거를 참고해보시길.
60hz 아이폰(14pro)에서는 버벅거림과 애니메이션등이 너무 웹뷰같아서 "뭐야 당근 웹뷰쓰나...?" 하고 찾다가 이 영상보러 왔네요. ㅋㅋ..
궁금함점이 있어서 댓글남깁니다 ! Map을 이용해서 동적으로 처리하는것보다 메타프로그래밍이 가지는 이점을 알수있을까요 ?? 감사합니다
목소리가 너무 좋아요
댓글에 궁금해하는 ’흑마술‘ 아마 가상인풋 방식 사용했을 듯 싶네요. 인풋 위치가 상단에 있으면 뷰포트를 밀어내지 않는 걸 활용하는 건데요. 사용자 눈에 보이지 않는 실제 인풋을 뷰포트 상단에 배치하고, 사용자에게 보여지고 조작할 수 있는 인풋은 단순히 숨겨놓은 인풋을 조작하는 용도로 구현하면 됩니다
input을 조종하는 조종기를 만든셈이네요. 재밌네요.
flex gap 눈물
예시에서 나오는 서버 1,2 등 여러대가 나오는데 여기서 서버들은 동일한 작업을 처리하는 서버의 인스턴스들인건가요?
넵 맞아요. 데이터베이스에 메시지 저장요청을 하고, 클라이언트와 웹소켓 연결을 맺고, 릴레이 요청을 처리하는 등의 작업을 해요
@@Andrewkwon-ec7rk 감사합니다!
꿀 정보 공유 감사합니다.
30:07 채팅방에 채팅을 입력할 때마다, display_idx 를 업데이트 해주게 되면, 엄청나게 인원이 많은 채팅방의 경우는 30:42 처럼 DB 부하가 많이 발생할 수 밖에 없는것 같거든요. 근데, 이 display_idx 값을 굳이 DB 에 저장한 이유가 있는건지 궁금합니다. 클라이언트 상에서, 로컬 단에서 정렬해주면 상관없을거 같고, 마지막 채팅 메시지 정보에 대한 값만 있으면, 이 display_idx 값을 DB 에 저장할 필요는 없다고 생각이 들어서요. 물론 채팅 데이터를 한번에 불러와야 하는 문제가 있을 수 있긴 하지만, 채팅중이었던 클라이언트 라면, 로컬에 저장되어있는 채팅 데이터를 기반으로 서버에 정보를 요청을 해서, 업데이트가 필요한 채팅방 정보만 불러와도 될 것 같다는 생각이 들었거든요. 또는 불필요한 오래된 채팅 데이터를 삭제하는 형태로도 활용 할 수 있을 것 같아 효율적이지 않나 하는 생각이 들어서 궁금하네용. 32:44 추가로, 여기서 살펴보면, 각 고루틴이 요청한 정보에 대한 값을 최종적으로 핸들러가 모두 정리해서 한 번에 클라이언트로 보내는 것 같은데, 트래픽이 많이 몰렸을 때는 이 핸들러에 대한 부하가 걸릴 것 같습니다. 그와 관련한 이슈는 특별히 없었는지 궁금합니다. 결국 고루틴 4개를 태운다고 해도, 각 고루틴 중 하나가 딜레이 되어서 늘어지게 되면, 관리하는 핸들러도 똑같이 지연이 될거고, 딜레이 되는 와중에 몇몇 데이터는 불러왔지만, 마지막 딜레이 된 고루틴 하나 때문에 계속 대기하면서, 여러 핸들러들이 대기하고 있는 상황이 발생 할 것 같아서요.
1. 예를들어 클라이언트가 최근 메시지가 발생한 채팅방 10개를 알고 싶을 때, 서버에서 display_idx를 기준으로 ORDER BY 처리하지 않는다면 모든(또는 많은) 채팅방 데이터를 조회해서 클라이언트에 내려줘야 해요. 클라이언트는 내려받은 데이터를 기반으로 정렬해야 하기 때문에 그렇게되면 DB 리소스 낭비와 네트워크 비용 증가로 이어질 수 있어요. 따라서 display_idx를 업데이트하면서 서버가 필요한 데이터만 클라이언트에 내려주는 것이 업데이트 비용이 들더라도 DB와 네트워크 리소스를 절약하기 위한 트레이드오프적 선택이었다고 보시면 될 것 같습니다. 2. 일단, 핸들러에서 여러 개의 고루틴을 통해 작업을 처리해도 핸들러에 부하가 크게 발생하지않는 이유는 병렬로 리소스를 로드하는 작업들이 cpu bounded task가 아닌 대부분 DB나 네트웍을타는 io bounded task들이기 때문에, 핸들러 자체에 쉽게 부하가 발생하지는 않아요. 그리고 하나가 딜레이되서 문제가되는 경우에는, 개별적으로 최적화된 타임아웃을 설정해서 가장 느린 리소스가 전체 핸들러를 지연시키지 않도록 설계할 수 있어요. 추가적으로 그 리소스를 제외하고(null처리) 나머지 데이터만 반환하는 방법도 존재합니다. 좋은 질문 감사합니다.
생생한 이슈와 해결 에필로그까지 너무 깔끔한 내용 잘봤습니다! 😮
열정과 전문성이 느껴지네요. 구독신청하고 갑니다.
Remix랑 nextjs를 사용할 때 안맞는 부분이 어떤건지 궁금하네요 예시같은게 있나요?
목소리 좋아요^^ 꿀성대 👍
"플렉~스"
좋은 자료 공유 감사합니다.
개인적으로 당근을 모티브 삼아 학교의 공유장터를 만들어서 운영중입니다 진짜.. 앞으로 겪을 어려운 과정을 미리 다 알려주셨네요 수학익힘책 답지보고 푸는 느낌이랄까.. 감사합니다
인프런에 비슷한 내용의 강의가 있습니다 ㅋㅋ
발표 너무 재밌게 잘 봤습니다 ㅎㅎ
좋은 정보 감사합니다.
많은 유저를 배치로 처리할때 pub/sub이 불리한 이유는 무엇이었는지 구체적으로 설명 하실수 있을까요? 겉으로 봐서는 pub 또한 배치로 하고 각자의 subscriber가 메시지를 들고 가는 형식이면 될 것 같아서요
좋은 질문입니다.! 시간관계상 Pub/Sub을 사용하지 않은 이유를 짧게 말씀드렸는데요. 조금더 자세히 말씀드려볼게요. 먼저 Pub/Sub을 사용하게되면 어떤 토픽으로 구독을 해야할지 고민해봐야하는데요. 1. 채팅방 아이디 구독 2. 단일토픽 구독 3. 유저 아이디 구독 4. 서버 인덱스 구독 네가지 정도 생각해 볼수 있어요 첫번째 채팅방 아이디로 구독하는 방식은 유저가 서버1로 접속할때 서버1은 해당 유저의 모든 채팅방 아이디를 가져와서 구독해야하는 상황인데 모든유저가 접속할때마다 유저의 모든 채팅방을 가져오는게 부담이고 토픽수가 너무많아지는 상황이라 성능이슈 문제도 있어서 적합하지 않다고 보았구요. 두번째로 단일 토픽을 구독하는 방식은 메시지가 발생할때마다 모든 채팅서버가 해당 메시지를 처리해야하는 상황이 오고, 이때 접속한 유저가 있다면 해당 서버에서 처리하면되지만 미접속 유저들에게 푸시를 보낼때는 어떤 서버에서 책임지고 푸시를 보내게 할지 설정하기가 어렵다고 판단했어요. 세번째로 유저아이디 기반으로 구독하는 방식은 예를들어 100명 채팅방에서 메시지를 발송한다면 각각의 유저 아이디를 기반으로 100번 이벤트를 발행해야 하고 구독하는 쪽에서 해당유저에게 보낼 메시지이벤트 비즈니스로직을 처리해야하는데요, 이때 배치를 사용해 효율적으로 서비스들에게 요청을 하지 못하고 단건으로 요청하게 되서 비효율적이 될거라고 판단했어요. 이벤트를 발행하기전에 먼저 서비스에 호출해서 데이터를 먼저 패치하는 방법이 있는데 이러면 Pub 메시지가 비대해져서 비효율적이 될거라고 생각했어요. 또한 유저아이디 기반 구독방식의 경우 미접속 유저를 체크하기가 어려워요. Pub/Sub을 사용하는 이점은 유저의 세션정보를 레디스에 따로 저장하지 않는 장점이 있는데 구독은 유저가 접속할때만 될거라 어느 유저가 미접속했는지 판단하는 단계가 또 필요하게 될거라고 보았어요. 네번째로 statefulset으로 생성한 서버 인덱스를 구독하는 방식을 사용할 수 있을텐데요, 유저id를 서버 대수로 샤딩해서 유저 아이디만 보더라도 어느 서버에 붙을지 미리 규칙을 정한뒤 100명 채팅방에 메시지가 발송되면 샤딩기준으로 유저아이디를 묶어서 이벤트를 발행하는 방법이에요. 이 방법을 적용하려면 현재 deployment로 되어있는 서버를 statefulset으로 변경해야하고 웹소켓 서버 앞단에서 유저 아이디 기반으로 서버에 배정하는 프록시 서버를 추가 구현해야하는 상황이에요. 이건 이후에 추가 개선안으로 생각해보고 있는데 릴레이 시스템을 전반적으로 많이 변경해야하는 상황이라 부담이 되어 선택하지 않았어요. AS-IS 구조는 메시지큐로 이벤트를 발행하는 구조였기에 최소한의 수정으로 효율을 낼수있는 방안을 적용하여 개선했다고 보시면 됩니다. 제가 Pub/Sub을 많이 다뤄보지는 않아서, 만약 유저아이디 기반으로 배치를 효율적으로 처리할수있는 방법이 있다면 알려주시면 감사해요~
GPT에 물어보니 PUBSUB NUMSUB [user ids…] 을 사용하면 구독 개수를 확인할 수 있다고하네요. 메시지 요청에 위 연산을 추가하면 0인 값들을 모아서 미접속유저로 판단하고 푸시를 보낼수 있겠군요.
@@Andrewkwon-ec7rk publish를 배치성으로 할수 있지 않나 나이브하게 생각했는데, 제 기억이 틀렸었군요:) Stateful 이용한 구현 또한 오프라인인 유저에게 푸시를 발송하는 로직 + 지금의 key value 와 consumer를 활용한 방법에 비해 큰 이점이 없음(지금 제가 생각하기에는 그런데, 있다면 말씀 부탁드립니다) + 말씀하신대러 추가적인 프록시 서버 구현 필요로 인해 포기할수밖에 없을 것 같아요 다만 지금의 구현에서 consumer가 scale in/out 될시에 rebalance time 때문에 메시지 발송이 상당히 밀리거나 그런 현상은 없었을까요? 만약 mq로 카프카를 사용하고 있었다면 필연적인 일이라서요
@@가사나다 "Stateful 이용한 구현 또한 오프라인인 유저에게 푸시를 발송하는 로직 + 지금의 key value 와 consumer를 활용한 방법에 비해 이점" 에 대해 먼저 말씀드릴게요, 생각한 아이디어는 다음과 같아요. 1. 유저가 어느 서버에 붙을지 규칙을 정한다. 2. 규칙에 맞게 유저들이 접속할때 해당 서버에 연결시킨다. 3. 메시지 요청시 이벤트를 받아야 할 유저들을 해당 규칙에 따라 어느 서버에 보낼지 나눈다. 4. 서버마다 한번의 요청에 유저 아이디를 묶어서 보낸다. 5. 릴레이 요청을 받은 서버는 유저아이디를 순회하며 접속한 유저에게 이벤트를 전달한다. 6. 유저아이디를 순회했을때 접속하지 않은 유저들에게는 푸시를 보낸다. 위 방법을 적용하면 가장큰 장점은 Redis를 사용하지 않고도 메시지 전달을 할 수 있게된다. 라고 생각해요. Redis에 유저가 접속할때마다 or 배포할때마다 세션정보를 관리하는게 부담이 되서요. Redis 정보를 100% 신뢰 못할때도 있구요
@@가사나다 "다만 지금의 구현에서 consumer가 scale in/out 될시에 rebalance time 때문에 메시지 발송이 상당히 밀리거나 그런 현상은 없었을까요? " 이건 히스토리를 잘 몰라 팀원분들에게 여쭤봤는데요, 저희 경험을 공유하자면, 현재 저희 시스템에서는 컨슈머가 scale in/out될 때의 리밸런스가 메시지 발송에 큰 지연을 일으키지는 않았어요. 그 이유는 파티션 수가 많지 않고, 컨슈머와 적절히 분배되어 있어 리밸런스에 걸리는 시간이 비교적 짧기 때문이에요. 또한, 운영 중에는 장애 대응을 제외하고는 빈번한 스케일 조정이 없었기 때문에, 리밸런스로 인한 영향을 크게 체감하지 못했어요. 평상시에는 lag이 높은 수준이 아니고 배포 시에는 전체 파드를 한꺼번에 내리지 않고 점진적으로 배포하는 방식을 사용하고 있어 lag를 줄이는 데도 도움이 되고 있어요. scale out 시에는 메시지 처리량이 늘어나 오히려 발송이 밀리는 염려를 줄일 수 있어요. 만약 순간적으로 피크를 치는게 빈번한 환경에서 리밸런스 시간이 걱정된다면 이를 최소화할 수 있는 여러 전략을 고려해 보시는 것도 좋을 것 같아요.
오픈소스로 공개해주세요!
좋은 내용 감사합니다 👍 잘듣고가요 고퍼콘에 이어 좋은 내용이네요
진짜 좋은 정보 🎉
잘봤습니다 감사합니다~
안녕하세요. 김태희 개발자님. 저는 취미로 개발을 하고 있는데 우선 영상 너무 잘봤습니다. ^^. 코딩을 시작한지 얼마 안된 40대 코린입니다. 이 글을 보실지는 모르겠지만 궁금한게 있어서 댓글남깁니다. Next Js 로 메타의 threads 서비스를 흉내내고 있습니다. 영상 중간에 Next Js 는 Vercel 친화적이라고 하셨는데 저도 그렇게 느끼고 배포도 Vercel을 통해서 진행했습니다. 사실 초보자입장에서 접근성이 제일 좋았던 거 같습니다. 혹시 Next JS 가 배제된 사유를 좀더 알 수 있을까요. 그리고 제가 테스트 배포중인 웹뷰는 포스팅 글쓰기나 Image 업로드는 uploadthing 을 사용하고 있습니다. 포스팅시 업로드 지연이 엄청 딜레이가 걸리지는 않는데 좀 거슬리는 정도에요. 예를들어 이미지 제외하고 단순 텍스트만 포스팅했을때 완전 다이렉트로 업로드 되길 원하는데 대략 2-3초 정도 걸립니다. 혹시 포스팅 속도를 높이는 팁같은게 있을까요. 마지막 질문입니다. 당근 동네생활 들어가면 스크롤해서 화면을 내릴때 거의 딜레이 없이 스크롤이 계속 내려가더라구요. 이렇게 딜레이 없이 스크롤을 내릴려면 렌더링할때 어떤 팁이 있을지 조언 좀 여쭙고 싶습니다. 아 그리고 웹뷰도 expo를 사용하면 안드로이드와 ios에서도 앱처럼 사용할 수 있다는데 혹시 속도나 성능면에서 차이가 있을지도 궁금한데 조언 좀 해주실 수 있을까요. 초면에 실례가 많았습니다. 혼자 취미로 하다보니 어디 물어볼데도 없고 혼자 주절거려봤습니다. 영상 잘봤습니다. 감사합니다.
개인적으로 파악된 내용을기반으로 답변드립니다. 1. nextjs가 배제된 사유 nextjs가 배제된 사유는 영상에서도 말씀하시지만 처음ssr을 적용하기때문도 있다고 했는데 이런관점에서는 보통 새로운 프레임워크 도입할때 모든 사람들이 해당 내용을 학습하고 적용하는것도 문제중하나고 많은 실패와 연구를 거쳐서 적용하는게 일반적인데 해당 시기에 그럴만한 여유가 없었을수도 있던것 같습니다. 그리고 nextjs가 좀 최근 몇년간 대격변패치를 좀 자주해서 적용시점이 버전12~13언저리쯤이라면 좀 불안했었을것 같아요. 또하나의 이유는 회사별로 각자의 고유한 관습과 특정 문제를 해결해기위한 방식이 있는데 이를 nextjs에 녹이기에 좀 문제가 있었을수도있습니다. 기본적으로 nextjs는 프레임워크이기때문에 자신의 고유한 규칙안에서 작업이 이루어지는것을 강제할때가 있는데 이와중에 nextjs에서는 핸들링이 안되는 작업이 있었을수도있습니다. 이러한 이유때문에 저같은경우도 nodejs로 express를 올린다음 그위에 nextjs를 올리고 그위에 graphql같은 서버도 올리는형식으로 커스텀해서 사용하며 트랜스파일링또한 nodejs서버따로 nextjs서버따로 진행하여 후처리로 조합하는 형태로 실서버를 운영하기때문에 이와 비슷한 내용이 아닐까싶어요. 2. image 업로드시 업로드되는 속도를 높이는 팁. 이 질문은 개인적으로는 고려해야할 사항이 너무 많아서 잘못된 질문같습니다. 결국 클라이언트에서 각종 서비스 서버까지데이터 전송 및 요청의 과정에서 얼마나 지연을 줄이거나 최적화를 하냐의 관점입니다. 그 과정에서 어떻게 타협하여 무엇을 생략해도 되고 안되는지는 서비스의 상황에 따라 너무나 많아서 좀더 본인의 상황을 자세히 설명해주시면 다른분들이 답변을 더 잘해주실것이라 생각됩니다. 그래도 따라서 영상에서 벗어나지 않는 내용을 기반으로 말씀하신 uploadthing이 "uploadthing.com" 이 플랫폼을 이용하시는것이라면 당장 생각나는것중에 가장 간단한것은 aws s3중 가장 리전이 가까운것을 이용하던가 업로드하는 국가또는 지역과 가장 가까운곳에 스토리지 서버를 운영하는것과 업로드시 데이터를 압축또는 전송에 최적화된 폼,셋을 찾아서 규격화하여 업로드하는것이 지금보다 더 빠른 업로드가 가능하지 않을까 생각됩니다. 이는 운영 및 배포와 관련된 도메인지식이 꽤나 필요해서 질문의 상황으로 봤을때 직접 여러 환경에 배포 해보시면서 실험을 하며 맞춰가보는것이 제일 최선일것같습니다. 여기서는 굉장히 간략하게 설명하고있지만 실제로는 시장평가를 받은 서비스의 경우에는 서버에도 한개의 서버에서 모든것을 핸들링하지않고 메일을 처리하는 서버, DB를 처리하는서버, 캐싱하는 서버등 각각 세부적으로 나누어서 관리하는것이 일반적인 관행입니다. (시장평가를 받기전 방법은 다름) 이곳에서 굉장히 생략된 방식의 흐름은 (클라이언트 => CDN => 릴레이서버(있을수도있고 없을수도 있고 순서가 이곳이 아닐수도있음) => 웹서버 => 각종 서비스 서버) 이런식인것 같습니다. 3. expo를 이용하여 안드로이드와 ios를 동시에 개발한건에 관하여 말씀하신 내용은 크로스플랫폼과 하이브리드 앱개발에대한 내용이 동시에 들어가 있는 내용인데요. 지금은 잘 모르겠으나 1년쯤전에 expo를 접했을때는 간단한 내용들을 개발하기엔 굉장히 쾌적했지만 조금만 커스텀하게 제어하는 상황이 발생하는경우에는 핸들링하지 못해서 결국 react native를 쓰는것보다 난이도가 더 올라가는 상황이 발생했던것으로 기억합니다. 저는 최근 다시 flutter를 이용하여 동일한 개념으로 접근하여 개발하고있지만 expo는 실제로 의미있는 서비스를 개발할때는 추천하지 않습니다. 지금도 그런상황인지는 파악이 안돼서 확실하게 답변은 못드리겠으나 1년사이에 그렇게 많이 달라지지 않았을 것 같습니다. 그리고 속도는 당연히 네이티브보다 느릴수 밖에 없는이유가 개념자체가 크로스플랫폼은 한번의 개발로 안드로이드와 ios를 둘다 대응하고싶어서 나온 개념이기도 하기때문에 최적화적인 이슈가 생길수밖에 없습니다. 네이티브를 사용하며 얻는 이점은 사용하는 기기의 os친화적인 언어를 이용하여 직접 개발하기때문에 한번 개발하고 빌드된 파일은 별도의 번역이 필요없지만. 크로스플랫폼은 빌드된 파일이라고 하더라도 해당 파일을 항상 번역하는 기능이 필요한 상태입니다. 따라서 이런 요인들로 크로스플랫폼쪽 개발 즉 ,여기서는 말씀하신 expo가 더 느릴 수 밖에없습니다. 하지만 개발하고자 하는 내용이 매우 단순하고 간결하다면 이러한 내용은 무시하시고 개발을 진행하셔도 됩니다. 당근테크의 개발자분들께서 답변을해주시길 원하셨을텐데 뭔 지나가던 웹개발자가 답변을드려 좀 죄송스럽기도 합니다. 정확하지 않고 모호한 내용들 또한 죄송하며 다른 고수분들께서 추가적인 답변을 보다 자세히 해주시지 않을까 기대합니다. 건승하세요.!
@ 상세한 답변 정말 감사드립니다. 이렇게 장문의 글을 남겨주시니 몸둘바를 모르겠습니다. 독학으로 여기저기 헤매다가 한줄기 빛을 얻은거 같습니다. 코드 최적화 및 서버 리전(유료결제) 변경으로 속도는 어느 정도 타협했고 말씀해주신 서버 배분에 대해서도 헤딩?을 해보려 합니다. 다시 한번 시간 내주셔서 감사드립니다. 꾸벅
iOS 키보드 문제를 해결하는 흑마법이 뭐죠..?
와드박고갑니다 저도 알려주십셔😢
혹시 그 흑마법이 뭔지 나왔나요? 전 왜 못본거같죠??
최신 메시지 순 채팅방 정렬을 서버 쪽에서 관리해야할 필요성은 어떤 것이 있나요?
클라이언트에서 채팅방 리스트 조회 요청을 할때 최신순으로 보여주기 위함인데요, 만약 최신순으로 정렬을 하지 않고 서버에서 보내줘야 한다면 페이징 없이 해당 유저의 모든 채팅방을 다 보내줘야하는 문제가 생겨요. 간단히 말하면 유저의 채팅방을 최신메시지 페이징 단위로 조회하기 위함이라고 보시면 됩니다.
넋놓고 다 봤네요😮😮
매롱