카카오

카카오톡, 다음, 카카오맵, 멜론

개발팀 리뷰

위 내용은 카카오 전 • 현 재직자의 응답 결과입니다.

기술 스택

언어

javascript

Java

Kotlin

프론트엔드

Angular

ReactJS

Redux

백엔드

NestJs

Spring

SpringBoot

데이터베이스

PostgreSQL

Redis

mongodb

데브옵스

Argo CD

Jenkins

OpenEBS

재직자가 작성한 글

profile picture

이준

카카오 플랫폼 기획

머스크의 생산 알고리즘

요즘 월터 아이작슨의 <일론 머스크>를 너무 재밌게 읽고 있는데 여기 '머스크의 생산 알고리즘'으로 알려진, 머스크와 일한다면 신조처럼 읊조려야 할 계명들이 정리된 게 있습니다. 생산성에 관한 너무 좋은 통찰이라 요약해봅니다. 1. 모든 요구사항에 의문을 제기한다. 모든 요구사항에는 그것을 만든 사람의 이름이 나와야 한다. 왜 그런지를 질의하고 요구사항을 수정하거나 없앨 기회를 얻기 위해서다. 2. 부품이든 프로세스든 가능한 최대한 제거하라. 제거한 것 중 10%이상을 다시 추가하는 게 정상이다. 제거할 때는 아주 과감하게 제거하고 필요가 밝혀지면 다시 넣을 각오를 하는 게 생산적인 제거다. 3. 단순화하고 최적화하라. 사람들은 앞의 두 과정을 생략하고 최적화를 하려고 하는데 이러다보면 쓸데 없는 것을 최적화하는 실수가 빈번하게 일어난다. 최적화는 앞의 과정 이후에 와야 한다. 4. 속도를 높여 주기를 단축하라. 이것도 앞의 세 과정을 진행한 후에 집중해야 한다. 쓸데 없는 일을 비효율적인 방식으로 하면서 속도만 높여 봐야 소용이 없다. 5. 자동화하라. 마지막 단계로, 모든 프로세스가 안정적으로 정리된 후에야 자동화를 한다. 자동화부터 적용하면 앞의 프로세스를 수정하기 더 어려워진다. 저도 외워야겠어요ㅎ. 특히 다시 넣을 각오로 빼야한다는 게 인상적인데 실제로 머스크는 괜히 뺐다가 나중에 다시 넣으면서 원망을 들을 것에 대해서는 전혀 고민하지 않더라구요. 생산적으로 일하려면 이정도 용기가 필요한 것 같습니다.

profile picture

이준

카카오 플랫폼 기획

좋아하는 일을 잘 할 때까지

"좋아하기만 하면 성공하기 어렵고 잘하기만 하면 금방 포기하게 된다" 최근에 한 VC 이사님을 만나 이야길 나눌 기회가 있었어요. VC들마다 투자심사에서 중요하게 보는 가치들이 있기에 저는 그걸 여쭤봤는데, 망설이 없이 '그 아이템을 창업자가 좋아하고, 잘 하는지'를 많이 본다고 하셨어요. 저는 먼 훗날 언젠가 다시 사업을 해볼 생각이 있어서 집에 돌아오며 그 이야길 곰곰이 생각해 봤습니다. 결론은 잘하는 걸 좋아하게 만드는 것보다는 좋아하는 걸 잘하도록 하는 게 나을 거 같았어요. 뭔가 목적을 갖고 좋아해 보려 하는 건 쉽지 않겠다 싶어서.. 마침 제가 좋아하는 건 아직 아무런 비즈니스 가치를 만들 수준이 아니기에💸 아주 천천히 제가 그걸 잘할 때까지 연습해 보기로 했습니다.

재직자가 좋아한 글

LINE 의 오픈챗 서버는 어떻게 급증하는 트래픽을 다룰까?  |  LINE 의 오픈챗은 대규모 트래픽을 처리하는 서비스 중 하나입니다. 특히 유명 가수의 콘서트 시, 수백만 팬들이 오픈챗에서 활발히 소통하면서 트래픽이 급증하는 현상이 발생합니다. 이렇게 하나의 오픈챗이 다른 오픈챗보다 트래픽이 많이 발생하는 걸 LINE은 '핫 챗 (Hot Chat)'으로 정의하며, 이 글에서는 핫 챗의 발생 패턴과 해결 방법을 살펴보겠습니다. <오픈챗이 처리하는 트래픽의 규모> 하나의 오픈챗은 수천에서 수만 명의 사용자를 수용할 수 있습니다. 오픈챗 서버는 분당 1천만 건, 일일 약 100억 건의 API 요청을 처리합니다. 활발한 하나의 오픈챗은 분당 최대 20만 건의 API 요청을 생성하기도 합니다. <오픈챗 서비스의 구조> LINE의 오픈챗 서비스는 이벤트 기반 아키텍처로 구성되어 있습니다. 사용자가 메시지를 보내는 등의 이벤트가 발생하면, 이들은 데이터베이스에 기록되고 Kafka를 통해 전달됩니다. 이후 Publish 서비스가 Kafka 토픽에서 이벤트를 소비하고, 사용자들에게 이벤트를 알리는 서버 푸시를 합니다. 사용자들은 API 호출을 통해 필요한 데이터를 가져갑니다. 서비스 구조는 그림으로 보는 것이 좋을 것 같은데요. 아래 파일로 첨부해두었습니다. <Hot Chat 패턴별로 발생하는 문제와 이를 해결하는 전략> 1.1 첫 번째 문제: 오픈챗 트래픽 증가 수백만명의 가수의 팬들이 콘서트를 열 때 오픈챗에서 활발히 떠들다보니 오픈챗의 이벤트를 가져오려는 API 호출 트래픽이 급증하는 사례가 발생합니다. 이로 인해 발생하는 증상은 다음과 같습니다: * 트래픽 급증으로 인한 데이터베이스 요청 증가, Slow Query 발생 * API 서버의 GC, CPU 사용량 증가 및 응답 지연 * 카프카의 Lag 증가 1.2 해결책: 일반적으로 Naive 하게 생각해 수 있는 해결책은 Shard 를 추가하는 것일텐데, 핫 챗은 전체 오픈챗 중의 0.1% 정도 되기 때문에 단순 샤드를 추가하는 건 영향이 작을 것입니다. LINE 에서는 Hot Chat 을 Detecting 하고 일정시간 동안 Throttling 을 적용하는 방법으로 해결했습니다: * 핫 챗 탐지: * Publish 서버에서 발생한 채팅방의 이벤트 수를 추적하고, 특정 임계점이 넘었으면 이 채팅방을 Hot Chat 이라고 기록합니다.  * 트래픽 Throttling 적용: * 핫 챗으로 분류된 채팅방에서는 확률적으로 서버 푸시 메시지 전송 빈도를 조절합니다. * 이는 API 요청의 폭증을 방지하고 서버 부하를 줄이는 데 도움이 됩니다. * 정책 동적 조정: * 핫 챗 정책은 LINE의 오픈소스 솔루션인 Central Dogma를 사용하여 동적으로 조정됩니다. * 이를 통해 서비스 운영자는 배포 없이 실시간으로 트래픽 상황에 맞춰 정책을 조정할 수 있습니다. * Note: * 이 방법은 폭증하는 트래픽에서 서버를 보호하는 방법이지, 트래픽 자체를 해결하는 방법은 아닙니다. * 위의 LINE 의 사례와 같은 Hot Key 문제에 대해서 트래픽 자체를 해결하려면 하나의 샤드로 향하는 트래픽을 다른 샤드들로 분산시키는 것이 필요합니다. * 그래서 일반적인 해결 방법 중 하나는 Shard Key 에다가 Random Number 를 붙혀서 하나의 샤드에서 다른 샤드들로 저장되고 읽을 수 있도록 하는 것입니다. 이를 'Salted Key' 라고도 합니다. * 이 방법으로 할 경우 읽기 요청을 할 때가 문제라서 Hot Key 의 Shard Key 가 어떻게 분산되었는지를 추적할 수 있는 방법을 추가로 필요로 합니다. * 이 방식으로 해결해야한다는 뜻을 말하는 것은 아닙니다. 개인적인 생각으로는 활발한 오픈챗에서 이벤트 전달은 되게 작은 문제라고 보여서 Throttling 하는 것이 더 나은 솔루션 같아 보입니다. 2.1 두 번째 문제: 오픈챗 참여 요청이 급증: 인플루언서가 오픈챗 링크를 공유하면서 참여 요청이 갑자기 증가하는 상황이 발생할 수 있습니다. 이로 인해 발생하는 증상은 다음과 같습니다: * MySQL Slow Log 증가, CPU 사용률 증가 * OpenChat 서비스의 응답 타임아웃 증가 2.2 해결책: MySQL INSERT 성능 최적화: * 오픈챗 참여 INSERT 는 단순 INSERT 가 아니라, INSERT 내부에서 SELECT 를 사용하는 쿼리로 구성되어 있습니다. 이는 내부적으로 Bulk Insert 로 취급이 됩니다. * Bulk Insert 에서 레코드가 Auto Increment 타입의 칼럼을 쓰고 있는 경우 auto_increment_lock_mode=1 로 설정되어 있는 경우에는 Auto Increment 의 값을 연속적으로 증가함을 보장하며 테이블 락을 잡습니다. (MySQL 8.0 이전에는 auto_increment_lock_mode 의 기본 값은 1입니다.) * 그래서 동시에 오픈챗 참여 요청을 하면 이런 테이블락의 경합으로 인해서 CPU 사용률이 치솟는 것입니다. * 이를 auto_increment_lock_mode=2 로 변경하면 Auto Increment 값이 연속적으로 증가함을 보장하지는 않지만, 테이블 락보다 가벼운 Mutex 를 사용해서 더 나은 성능을 낼 수 있습니다.  * 모든 기술이 그렇듯이 주의할 점이 있는데  auto_increment_lock_mode=2 로 적용할 경우에는 복제에서 statement-based replication 이 아니라 row-based replication 을 적용해야합니다. Auto Increment 값이 연속적으로 증가하지 않기 때문에 복제 서버에서는 다른 값이 될 수 있기 때문입니다.  참여 요청에 대한 Throttling 적용: * auto_increment_lock_mode 를 튜닝해서 처리할 수 있는 성능을 높혔더라도, 언제든지 MySQL 이 처리할 수 있는 양보다 훨씬 많은 부하를 받을 수 있습니다. * 여기서 Throttling 을 적용할 때 중요했던 건 Hot Chat Throttling 과 달리 Throttling 을 지연없이 빠르게 적용할 수 있는가 입니다. * Redis 에서도 참여 요청의 수를 집계해서 Throttling 를 적용할 수도 있지만 얼마 안되는 핫 오픈챗에 대해서 전체 오픈챗에 대해 기록하는 건 큰 오버헤드라고 판단해서 Local Cache 에서 집계를 해서 Throttling 을 적용했습니다. Reference: https://engineering.linecorp.com/ko/blog/how-line-openchat-server-handles-extreme-traffic-spikes

좋아요 111 저장 209