reactor 5

Proactor 기반 게임서버에서 Kafka를 IO Completion Port와 통합하기

Reactor 환경에서는 Spring WebFlux와 Reactor-Kafka를 활용해 Kafka 메시지를 Flux 스트림으로 자연스럽게 처리하는 것이 익숙하다. 하지만 Proactor 환경에서는 Kafka를 어떻게 처리할까? 이번 글에서는 C++ 게임 서버에서 Kafka Consumer를 IOCP 이벤트 루프에 통합했던 경험을 공유한다. 1. OS가 어디까지 처리하는지에 따라서 구분한다.데이터가 소켓 버퍼에 수신되면 OS가 수신 이벤트를 전달(reactor)하거나, 나아가서 OS가 직접 IO 작업까지 하고 완료 결과를 통보(proactor)하여서 비동기적으로 IO 멀티플렉싱을 진행한다. 쉽게 설명해서 IO 멀티플렉싱은 읽을 데이터가 왔을때 작업하는 Reactor와 실제 작업이 완료되면 통보받는 Pro..

kafka 2025.09.11

토스가 겪은 Reactor Netty의 Memory Leak 이슈를 알아보자

토스에서 제공하는 기술 블로그를 통해서 어떤 사고 과정을 거쳐서 문제를 해결하는지 권위자들의 시야를 엿볼 수 있어서 훔쳐보고(?) 커비처럼 빨아먹어야 한다. 클러스터 안에는 수많은 서버들이 Spring WebClient를 통해 REST API로 통신해서 요청을 처리한다.1. Spring Cloud Gateway의 Memory Leak 이슈 파악하기해당 컨테이너에 지정한 메모리 상한을 사용한 총 메모리가 초과한 경우 OOMKilled 알림을 보낸다. 그런데 Gateway가 왜 OOM으로 죽어? Gateway의 OOM 문제를 트러블 슈팅하는 과정으로 JVM 튜닝에 대한 이야기부터 시작한다. 토스에서는 메모리 할당에 드는 오버헤드를 줄이기 위해서 -XX:+AlwaysPreTouch JVM 옵션을 사용해서..

backend 2025.08.18

Hexagonal Architecture의 테스트코드 작성 (feat. StepVerifier, TestPublisher)

프로젝트를 Hexagonal Architecture로 개발하면서, 외부 시스템과 소통하는 Port 인터페이스를 통해서 실제 비즈니스를 담당하는 UseCase의 구현체인 Service를 검증할 수 있다. 독립적인 테스트 코드비즈니스 로직이 외부 시스템에 의존하지 않으므로, 독립적으로 단위 테스트(Unit Test), 빠른 테스트 실행DataBase, HTTP Client, 메시징 등의 외부 시스템에 대한 각 Adapter는 독립적으로 테스트 가능의존성의 대체(Mock, Stub, Fake)Port-Adapter 패턴으로 인해, 실제 사용하는 외부 시스템이 아닌 Mock 등 으로 활용한 테스트 가능예를 들어, DB Adapter 대신 InMemoryRepository를 사용하여 테스트할 수 있다.  테스트코..

backend 2025.02.13

비동기 프로그래밍, 얼마나 알고 있나요? (Advanced Asynchronized)

이벤트 기반 IO 처리 방식의 비동기 설계 패턴으로 여러 방식이 존재하고, 비동기 작업을 관리하지만 그 방식이 상이하다. 비동기 방식의 구분 : 이벤트를 감지하는 주체가 누구인가?두 방식 모두 "-actor"로끝나며 행동하는 주체로서 행위자(actor)를 의미한다. 따라서 어떤 방식으로 행동하는지를 나타낸다고 볼 수 있다. Reactor : IO 이벤트가 발생하면 직접 반응(React)하여 실행Proactor : 미리, 앞서서(Pro) + IO 작업을 요청해두고, 완료되면 OS가 자동으로 실행 1. Reactor 패턴I/O 이벤트가 발생하면 핸들러(Callback)를 등록해 두고, 이벤트가 발생하면 이를 처리하는 방식 동작 방식애플리케이션이 비동기 작업을 요청하고, 처리할 핸들러(콜백)를 등록I/O 멀티..

backend 2025.02.11

MSA? 이길 수 없다면 합류해라 (feat. Kafka IPC 트러블슈팅)

당근마켓도 100만 MAU 뜨고 나서야 MSA를 도입했다는거 보면, 사실 그정도 규모 이하는 모놀리식으로 충분하다는 소리다.​도대체 왜 이렇게 MSA에 목메이게 되었는가..​이길 수 없다면 합류해라​나도 MSA하겠다​​이거말고 진짜 MSA를 결심한 이유원래 C++로 이뤄진 게임 서버와 통신하기 위해 Kafka를 사용했었다.   매칭 결과나 전적 결과를 저장하기 위해서라도 전달 과정에서 최소 한번은 디스크에 기록되어야 했다.​1. 매치메이킹의 결과를 받아서 게임 서버에 방을 생성2. 게임이 끝나면 그 결과를 다시 웹서버로 전달 대충 목적인데 닭 잡는데 소 칼 쓰는 느낌이다. 그래서 kafka를 좀 더 효율적으로 쓰기 위해서 고도화를 고민해봤다. ​일단 Redis를 이용하던 매치메이킹 기능이 스케줄러로 동작..

project/wargame 2025.01.03