728x90
반응형

전체 글 146

Mysql supremum deadlock 개선

사내에서 유저들의 광고 시청 이력을 로그성 데이터롤 적재해야 되는 작업이 있었다.작업중에 데이터 삽입도중 deadlock 개선기에 대해 정리해보고자 한다. 구조우선 웹/앱 의 이벤트를 받아서 이벤트로그 원장 데이터를 저장하는 kafka의 토픽이 있는데여기서 별도의 kafka consumer group 을 생성하여 광고 이벤트에 대해서만 따로 추출하여 유저가 광고를 띄우고 보고 완료했는지 같은 일련의 흐름을 보는 구조를 만들었다. 테이블 구조일단 유저 광고 시청 이력을 쌓는 부분에서는 아래와 같은 구조로 구성을 했었다.create table user_ads_history( id bigint unsigned auto_increment, created_at timestamp not null defa..

Mysql 인덱스 컨디션 푸시다운

오늘은 회사에서 계속해서 올라오던 slow query에 대해 성능 최적화를 수행한 내용을 바탕으로 해당 포스팅을 작성한다. soft delete를 사용함에 있어서 쿼리를 주의 깊게 작성해야 한다는 사실을 알고있었지만 이번 기회를 계기로 좀 더 깨달았던 것 같다.문제의 구성은 이러했다. 원래의 문제가 됐던 쿼리select count(*) from tables where 조건1 = ? and user_id = ? and deleted_at is null 유저별로 카운팅을 하지만 데이터에 맞는 카운팅 개수가 4천개를 넘어서는 순간부터 점점 응답이 느려져 4초 이상으로 가서 alert 채널에 공유가 되었다. 일단 더미데이터를 넣고 비슷하게 구성해보았다.create table test_table( id ..

DB 2025.06.25

동시 차감 시 Redis Lua Script 활용하기

이전에 업무하다가 동시성 이슈를 처리하기 위해 redis를 사용했었다. 아래 기능 구현이 실제 업무하는 환경과 비슷한 조건이다.우리는 상금을 얻기 위해 게임 참여를 진행한다.유저는 게임에 1회 참여할때마다 공동 상금에 1원씩 적립한다.1등이 당첨되었을 때 1등은 현재까지 적립된 상금을 모두 가져간다.위 2가지를 만족하는 기능 개발을 진행해야 한다. 일단 1등이라는 확률 자체가 희박하기 때문에 아래 기능으로 동작하게 만들어도 문제가 없을 것 같았다.실제로 아직까지 문제가 발생했다는것은 아니다.-> 근데 발생할 수 있기 때문에 로직도 수정해야 하는것이 맞다.포인트 보정 산출식 추가하기시나리오를 하나 생각해보면유저 A, B 가 있다.현재 상금은 98원까지 적립되어있다. 유저 A가 응모한다.상금은 99원이된다...

NoSQL 2025.05.08

트래픽이 많은 시간에 배포하여 삽질하기

회사에서 그냥 내 욕심이었는지는 모르겠다.내가 개발한 기능중에 14시에 환율을 맞추는 게임 챌린지가 오픈되는 시간에 항상 앱 푸시 알림을 보낸다.이 때 트래픽이 솟구치게 되는데 우리가 평상시에 운영하는 인스턴스 개수는 8개(초당 평균 300개 요청)로 운영중인데, 이 때 시간 간격 텀을 두고 우리가 설정한 최대값인 20개까(초당 호출 평균 1200회 이상)지 차오르는걸 항상 목격하게 된다.여기서 욕심이 생겼다.이 시간에도 구애받지 않고 배포하여 정상적으로 운영할 수는 없을까?이 생각으로 부터 나와 지금부터 삽질을 시작하게 된다.이 글에서 다루는 내용은 최소한의 인프라와 그놈의 지긋지긋한 Hikari CP 얘기를 다시 한번 해보려고 한다.서론이 길었다. 바로 본론으로 들어가보자!!! 아무것도 설정을 건드리..

Spring 2025.04.18

Redis Cache 성능 저하 이슈 수정

이번주 월요일에 슬랙에 지속적으로 같은 로그가 되게 많이 떴었다.사실 redis를 다른 팀에서도 사용을 하고 있기에 좀 더 주의깊게 확인해봐야 했지만 전체가 태그되는 바람에 잘 모니터링 하지는 못했던 것 같다.이게 갑자기 alert log가 뜨게 되니까 되게 이상했다. 그리고 latency가 그래프 상으로 기하급수적으로 증가한게 보일 것이다.이 로그가 문제는 내가 배포했던 시간부터 쭉 나왔다는 것이다.신규 기능을 해당 시간에 오픈을 진행했었고, 그 이후로 로그가 지속적으로 찍혔었다. 😭😭😭퇴근길에 놓치고 있었던 스레드에 같은 팀의 백엔드 개발자분이 먼저 남겨주셨다.말씀주신 기능보다는 다른 기능에서 문제가 있긴 했다. 저쪽은 캐시도 사용하지 않으며 문제될것이 전혀 없던 곳이었다.아래 제보된 것부터는 ..

NoSQL 2025.03.26

FeignClient의 parameter type mismatch

개발을 하다가 어드민을 사용하시는 부분에서 제보가 들어왔다.request log를 보니 LocalDate 를 받도록 되어있는데 분명히 yyyy-MM-dd 형식으로 request log가 찍혔는데?근데 좀 달랐다. access-language가 en-US로 되어있는것!어드민 사용하시는 분에게 여쭤봤더니 자신은 크롬 브라우저를 영어모드로 사용한다고 했다.시작점아, 설명하기 앞서 이 상황은 앞단에 proxy 서버가 따로있다. 호출 방식이 아래처럼 되어있다.앞단은 proxy server라고 지칭하겠다.client ->  proxy server -> 우리의 serverproxy server에서는 우리 server로 bypass 시켜주며 그 때 call 해주는 방식을 Spring Cloud OpenFeign을 사용..

디버깅 2025.02.26

Hikari CP Connection is not available 오류

일을 하면서 서버 에러로그에 언제부턴가HikariPool-1 - Connection is not available, request timed out after 3000ms위와 같은 에러 문구가 특정 주기를 가지고 계속 노출되었다.일단 여러가지 문제가 있었는데, 먼저 해결된 것부터 써보려고 한다.HikariCP pool size일단 내가 개발하는 서비스 특성상 특정 시간대 or CRM으로 푸시알림이 발송된 순간에 트래픽이 몰리는 경향이 있다.그래서 내가 입사하기 이전부터 서비스에선 hikari cp 권장사항인 maximum-pool-size와 minimum-idle 개수를 다르게 줬었다.물론 minimumIdle 설정 개수가 더 적었었다.그렇게 잘 유지되다가 어느날부터 트래픽이 몰리면 이제 유휴에서 max..

DB 2025.02.19

2024년 회고

올 한해도 뭔가 얻어간게 많았던 것 같은 시기였다.작년에는 회고글도 못쓰고 바쁘게 지나갔던 것 같은데, 이번에는 또 어떻게 시간이 나서 이렇게 정리글을 쓸 수 있게 되었다. 1. 이직기존 회사에서 자비스앤빌런즈(삼쩜삼)로 이직하게 되었다.이전 회사에 비해서 인원이 일단 굉장히 많아졌고 그리고 개발자분들이 되게 많아서 놀랐다.물론 나머지 회사들이 아깝게 떨어져서 마지막으로 여길 오게된건 운명이 이끈걸까? 싶다. 이번에도 서류를 합격하는 맛을 보았기 때문에 이제 더 위로 계속 갈 수 있을거라고 많이 생각하고 있다. 계속 은행과 돈이 관련된 업무들을 쭉 하고 싶다는 생각에 아래 회사들을 넣었었다.- 카카오뱅크 (과제 불합)- 토스뱅크 (2차면접 불합 -> 재시도 후 1차면접 불합)- 카카오페이증권 (과제 취소..

Diary 2024.12.30

DataIntegrityViolationException에 대해서

짧은 근황을 먼저 얘기하자면...올해 3월부터 이직을 하게되어 삼쩜삼(자비스앤빌런즈) 백엔드 엔지니어로 현재 이직하여 회사를 다니고 있다.나중에 다른 포스팅으로 해당 부분은 잘 작성해보도록 하겠다.이전 포스팅인 @Transactional 제대로 알고쓰기 에서는 무지성 중첩 트랜잭션에 대한 포스팅이었는데,이번에는 좀 다른 케이스였다.해당 예외가 발생하는 것이었다.회사에서는 Mysql을 RDBMS로 채택하여 사용해서 아래와 같은 예외가 보였지만, 예제에서는 H2 DB를 사용하기 때문에 같은 에러메시지는 아니지만,내용은 똑같다는 점을 일단 알고 넘어가면 좋을 것 같다.HHH000099: an assertion failure occurred (this may indicate a bug in Hibernate, ..

JPA 2024.08.20

Mysql 인덱스

인덱스란? 번역을하면 바로 색인이라는 단어로 번역된다. 색인은, 검색하면 책속의 낱말이나 어떤 챕터나 구절들을 빠르게 찾아볼 수 있게 쪽수 정보를 나타내주는 것을 뜻한다. 이 개념을 DB에 적용시킨 것이다. 인덱스는 어떻게 구성하는가? 인덱스는 CREATE INDEX 키워드로 구성이 가능하다. Team 이라는 테이블이 이렇게 있다. id(primary key) name member_id grade 1 홍길동 1 1 2 가나다 2 2 3 고길동 3 3 4 나길동 4 4 이름만으로 인덱스를 구성하고 싶다면 아래와 같이 수행해주면 된다. CREATE INDEX 테이블(칼럼); CREATE INDEX team_index team(name); 이렇게 해주게 되면 name의 오름차순 순서로 정렬되게 된다. 왜 정렬..

728x90
반응형