동시 접속자 1만명에게 실시간으로 데이터 전달하기
·
카테고리 없음
배경실시간 시세 서비스에서는 단순히 웹소켓 연결이 된다는 것보다, 많은 사용자가 동시에 접속한 상태에서도 웹소켓 통신이 안정적으로 이루어질 수 있어야 한다는 것을 중점으로 생각했습니다. 특히 특정 종목으로 구독이 몰릴 경우 fanout 처리 시간이 급격히 증가할 수 있어, 먼저 대규모 연결 수립이 가능한지 확인하고, 그 위에서 fanout 병목을 측정·개선하는 방향으로 접근했습니다.테스트 환경 구성(K6 + TestProvider 기반)문제실제 국내 주식 시장은 9시에 열러서 3시에 장이 마감되는 구조이기 때문에 오후 3시 이후에는 새로운 주식 가격을 받을 수 없습니다KIS에서 제공하는 API를 제어할 수 없기 때문에 서버에 의도된 스케일의 부하를 줄 수 없습니다.고려한 점별도의 Staging 환경이 없..
카프카 제대로 알고 사용하기 - Consumer(프로토콜 v1)
·
카테고리 없음
Consumer의 두가지 구현체public class ConsumerRecords implements Iterable> { public static final ConsumerRecords EMPTY = new ConsumerRecords(Map.of(), Map.of()); private final Map>> records; private final Map nextOffsets;}저번 블로그에서 Kafka의 프로듀서를 살펴봤던 것에 이어서 이번에는 Consumer에 대해서 살펴보겠습니다. 먼저 KafkaConumser의 subscirbe를 살펴보겠습니다. 주의깊게 살펴볼 부분은 3가지인데 AsyncKafkaConsumer, ClassicKafkaConsumer, ConsumerWrappe..
카프카 제대로 알고 사용하기 - Producer
·
카테고리 없음
안녕하세요. 개발자 오원택입니다. 카프카는 전 세계 빅테크의 80%가 사용할만큼 대 MSA의 시대에 필수적인 기술이라고 생각합니다. 카프카는 아파치 재단에서 관리하는 오픈소스 이기 때문에 Github에서 언제든지 소스코드를 볼 수 있다는게 정말 좋습니다.카프카를 학습하다보니 유튜브나 심지어는 유명 기업의 기술 블로그에도 잘못된 설명이 있는 것을 보고 실제 내부 동작을 확인하는 편이 좋겠다고 생각해서 학습하는 김에 블로그로 남겨놓아야 겠다고 생각했습니다. 이미 카프카의 전반적인 이해는 되어있기 때문에 AI에게 어떤 곳을 중점으로 봐야 하는지 물어보고 학습을 진행했습니다. 설명을 위한 글이 아니라 제가 학습하는 과정 그대로를 담은 글이기 때문에 조금 난잡합니다.카프카 버전카프카 분석에 대한 첫번째 글이기 때..
대충 Redis 적용해서 캐싱했다고 하면 안되는 이유
·
Project/Redis
프로젝트 'Finvibe'는 투자 시뮬레이션 서비스로 실시간으로 주식 정보를 업데이트&제공 해야하기 때문에 캐시가 아주 중요한 프로젝트입니다. 현재 프로젝트에서 사용하고 있는 캐시 값은 다음과 같습니다현재가: market:current-price:현재가 갱신 시각: market:current-price-updated-at:유저별 상위 보유 종목: asset:top-holdings:종목별 watcher 목록: market:current-watcher:배치 가격 정보: market:batch-price:예약 주문/거래 관련 정보: market:reservation:*KIS 토큰 락: kis:accessToken:*위처럼 시피 아주 많은 데이터들을 캐시로 관리하고 있기 때문에 캐시 서버에 부하가 가해지는 것에..
[Spring] JVM 웜업
·
Project/Spring
문제 상황현재 백엔드 개발자로 참여하고 있는 서비스에서 JVM 웜업 문제를 해결하는 작업을 맡았다.먼저 Data Dog으로 배포 시간대의 Latency graph를 확인했다. 9시 40분 경에 배포를 했는데 그 시간대에 몇몇 api의 응답속도가 눈에 띄게 느려진 것을 확인할 수 있었다.이렇게 배포 직후 응답 속도가 느려지는 것을 JVM의 'cold start' 라고 한다. 정확히는 JVM의 JIT 컴파일러 때문에 발생하는 것이다.JIT 컴파일러JVM은 처음 실행된 메서드를 인터프리터로 돌리다가, 충분히 실행되면 JIT 컴파일을 통해 최적화한다. 이런식으로 최적화 하는 이유는 JVM의 특징과 관련이 있는데 Java는 자체적인 byte code를 사용하기 때문에 byte code를 기계어로 변환하는 과정이..