본문 바로가기

전체 글

(227)
[디베이트 타이머] 하늘이 무너져도 솟아날 로그는 있다 : DataDog 없이 커널 로그만으로 CPU 스파이크 원인 찾기 Situation 1-1) 갑자기 에러가 우다다 터졌다가 복구됨출근하여 한창 업무를 보는 중에 갑자기 디베이트 타이머 에러알림창에트랜잭션 획득을 할 수 없다는 에러가 발생했습니다. 에러 알림은 7월 29일 오후 4시 - 오후 4시 34분까지 발생했는데요. 일단 팀원들이 모두 각자의 일과 업무를 보고 있었기 때문에 할 수 있는 조치가 없었습니다.이에 시간이 되는 프론트 분들께 점검 창을 띄워두고 복구가 완료될때까지 서버 통신이 필요없는 비회원 기능을 제외하고더이상 서버 트래픽을 임시 차단해달라는 최후의 결심을 내렸습니다. 그러다 오후 4시 40분경부터 알림이 멎었고 시스템도 정상복구가 되었습니다.퇴근길에 이 현상에 대해 짐작이 가는 점을 생각해보았는데 DB 악의 요청말고는 사실 짐작가는 점이 없었습니다...
[디베이트 타이머] 시간은 항상 앞으로 흐르지 않는다 - NTP가 만든 타이머 버그 안녕하세요 브로콜리입니다.디베이트 타이머에서 중앙선거방송토론위원회가 주최하는 26년 열린 토론대회의 타이머 운용을 다시금 맡게 되었습니다.본 글에서는 주최사의 타이머 요구사항을 반영하던 중 발견한 시간이 다르게 흐르는 재미있는 문제에 대해 서술합니다. 타이머 로직 : 목표시간과 현재시간의 차이 계산타이머 로직은 다음과 같이 구성되어 있습니다. step1. 타이머 시작시점에 종료되어야 할 종료시간을 계산합니다.현재 시간 : 오후 1시 30분 00초타이머 시간 : 1분 30초종료시간 : 현재시간 + 타이머 시간 = 오후 1시 31분 30초 step2. 200ms 마다 현재 시각에서 타이머 종료시각을 빼어 타이머 시간을 갱신합니다.종료시간 : 오후 1시 31분 30초현재 시간 : 오후 1시 30분 15초현..
[Moong] 분산환경 동시성 처리를 위한 5가지 방안 비교 동일 회원의 모임 중복 참여 동시성 이슈 — 5가지 해결 방법 비교 📋 목차 문제 상황 1. Synchronized 2. 트랜잭션 격리수준 (Serializable) 3. Redis 분산락 4. DB Row Lock 5. DB Named Lock 최종 선택: Redis 분산락 전체 비교 요약 문제 상황: 동일 회원의 모임 참여 동시성 이슈뭉 서비스에는 모임 가계부 단위인 pet_group, 회원인 member, 모임원인 Crew가 존재합니다. 서비스 정책으로 하나의 pet_group에는 동일 회원이 한 번만 존재할 수 있습니다.기존에는 Crew 테이블의 (group_id, member_id)에 Unique Index를 걸어 따닥 동시성 이슈를 해결했습니..
[Moong] 옵티마이저는 왜 이 인덱스를 선택했을까: 1억 행 쿼리 실험기 인덱스 설계를 통한 쿼리 성능 최적화 📋 목차 환경 세팅 0. 서비스 정책을 고려한 쿼리 최적화 0-1. 집계 쿼리 2번 호출 vs GROUP BY 1번 0-2. 인덱스 추가에 따른 쓰기 성능 저하 1. 커버링 인덱스 2. 복합 인덱스 순서 최적화 2-1. 카디널리티를 고려한 순서 조정 2-2. 범위 검색을 고려한 순서 결정 3. 정렬 최적화 3-1. Using filesort 제거 3-2. 오름차순 vs 내림차순 인덱스 4. 복잡한 Join 쿼리 Explain Analyze 분석 환경 세팅실험 환경 설정..
[디베이트 트래커] 어떤 STT API를 써야할까? : 전사/화자분리 정확도 벤치마크 테스트 Situation : 기획에 따른 STT 벤더 선택 필요 저희 팀의 소마 기획은 [디베이트 트래커: 토론의 실시간 요약/분석/포트폴리오까지 한번에] 입니다.(기획에 대해선 다른 글로 후술해보도록 하겠습니다 ㅎㅎ)이번 스프린트 목표는 다음 메인 대시보드였습니다. 1) 실시간 속기록(왼쪽 파트) : 토론 발언자들의 음성 기록이 실시간으로 화자가 분리되어 기록됨2) 쟁점 요약(오른쪽 파트) : 토론 내용을 축적하며 토론의 쟁점-주장-근거가 구조화되어 대시보드에 표시됨 이중 실시간 속기록 과정에서 음성을 텍스트로 바꾸는 과정이 필요했고,이에 따라 STT(Speech-To-Text) API를 무엇으로 해야할지가 큰 과업이었습니다. Task : 벤더별 전사 정확도와 화자분리 정확도 측정하기 저희 팀이 던진 대질문..
[소마 강의 회고] 대규모 서비스 개발 기초 #2 안정 해시 강의 개요멘토 : 강대명 멘토님수강일자 : 2026.04.11 20:00시 ~ 23:00시온/오프라인 : 온라인(Webex)강의 수강 이유이전 수강 회고 글에서 이어 쓰는 글이다. 다만 안정해시에 대해서 조금 더 알아보고자 논문이나, 도 함께 읽고 정리하느라 조금 늦어졌다https://hellobrocolli.tistory.com/231 [소마 강의 회고] 대규모 서비스 개발 기초 #1 Stateless와 읽기 분배강의 개요멘토 : 강대명 멘토님수강일자 : 2026.04.11 20:00시 ~ 23:00시온/오프라인 : 온라인(Webex)강의 수강 이유1) 백엔드 대규모 시스템 설계에 대한 이해DB Routing, Consistent Hashing, Sharding과 같은 개념hellobrocolli.ti..
[Redis 소스코드 분석] RedisObject와 문자열 인코딩 feat) 벤치마크 테스트 [글의 개요]- redisObject의 정의와 의의- 레디스 문자열을 위한 SDS 구조체의 구조- 레디스 문자열 인코딩의 세 종류(정수형, embstr, raw)의 구조와 성능차이 [핵심 요약]- redisObject는 데이터 메타정보(타입, 인코딩, 참조횟수, 데이터 주소)를 가진다- SDS는 레디스 문자열을 위한 구조체로 바이너리 세이프하다- 문자열 인코딩은 3종류로 정수형, embstr, raw 형이 있다- 정수형은 long 범위 이내에 있으며 9999까지는 미리 만들어 공유한다.- embstr는 44글자 이내의 문자열을 인코딩하며 redisObject와 SDS를 연속된 공간에 함께 저장한다.- raw는 44글자 이상의 문자열을 인코딩하며 redisObject의 포인터가 SDS를 가리키는 구조이다...
[소마 강의 회고] DB JOIN에 대해서 알아보기 강의 개요멘토 : 강성욱 멘토님수강일자 : 2026.04.16 19:00시 ~ 22:00시온/오프라인 : 오프라인강의 수강 이유1) DB JOIN 원리 이해를 통한 최적화 방안 알아보기사실 조인의 종류에 대해서는 잘알고 있지만 조인 자체를 더 잘쓰기 위해서는 어떻게 해야할까? 를 고민해본 적은 크게 없다. 그렇기에 조인을 사용할 때의 주의할 점에 대해 알아보고자 했다. (최적화 방안 등등..) 2) DB에 대한 애정RealMySQL을 읽으면서 DB를 좋아하게 되었다. 특히 인덱스를 딥하게 팠다. 특강에는 DB를 주제로 한 특강이 많지 않아 아쉬웠는데 마침 DBOps 이신 멘토님의 강의가 올라와 흥미가 갔다. 강의 핵심 요약JOIN의 구현 방식 3가지- Nested Loop Join : 이중 반복문을 통..