project 26

[꿀팁대방출] Kafka Topic 재설계와 EDA 도입을 통한 획기적인 클라우드 비용 개선

네? Kafka 운영비 400$를 제공한다구요? 거기다가 작게 쓰면 1$/month 이하라고요? Kafka의 공동 제작자이자 Confluent의 공동 창립자, CTO인 neha의 인터뷰를 통해서 탄생 비화를 알 수 있었다.카프카가 대세가 되는걸 느낀 시점에서, 데이터를 어떻게 처리할지만 고민하던 링크드인 내부에서 새로 창업을 결심했다고 한다. 다들,, Kafka의 기업용 클라우드를 제공하는 Confluent의 저렴한 요금제에 따르시오 Confluent Kafka를 이용해서 저렴한 비용으로 kafka를 이용해보자. 사실 클라우드 벤더사중에서 AWS의 비용은 비싼 편이다. 베이직 요금제로 진행하면 한달에 1GB도 안쓰는 범부들 입장에서 거의 제로에 가깝게 비용이 나온다. 아 첫 한달 400$ 제공이 눈앞..

project/wargame 2025.07.12

전적 검색 서비스 배포 및 문제 해결 (feat. Redis 도입 논의, 이벤트 소싱에 대한 오해)

wargame 프로젝트 자체는 추가로 생각난 신기능 개발하는거 이외에 서버, 인프라적 기능은 대부분 완료된 상태다.전적 검색 서비스나 통계 지표 분석 관련 기능을 만들어 둔게 있어서 프론트엔드를 개발해봤다. react, vite.js를 이용해서 간단하게 프론트엔드를 구현하고, vercel을 통해 배포했다. https://wargamegg.vercel.app/ 메인 페이지에서 원래 인게임 소개 영상(youtube), 플레이 이미지를 넣어서 간단한 게임 소개를 가미할려고 했다.하지만 지금은 그딴거 없고 테스트 목적으로 올린거니 대충 느좋 플리 아무거나 집어넣었다. 백엔드는 클라우드 환경에서 테스트를 매번 생성하고자 해서, 서버가 안켜져있는 경우에는 더미를 생성하도록 처리했다. 추가된 게임 결과 데이터에..

project/wargame 2025.06.21

ElasticSearch Completion을 이용한 검색어 자동완성 구현 (feat. 검색 엔진의 성능 개선)

검색 엔진의 성능 개선 (전적 통계 시스템)elasticsearch로 테스트 하고 있지만, 배포시 AWS Opensearch로 구동할려고 계획중 형태소 분석이나 동의어 설정같은 tokenizer가 필요 없다고 판단했다.사용자의 이름은 규칙성이 없으며 챔피언 종류별 통계는 리그오브레전드도 130개 남짓이다. 검색 쿼리 개선 minimum_should_match=100% match, term 함께 사용(term은 analyzer를 거치지 않아서 더 빠름) ElasticSearch Configuration 튜닝: thread_count 설정 인덱싱 설계 user_name : keyword champion : 자주 검색되면 keyword items : 어떤 아이..

project/wargame 2025.03.16

게임종료시 전적 갱신에 대한 트랜잭션 롤백 처리 (Saga 패턴, Axon Framework)

적어놓고 블로그 올릴까 말까 굉장히 고민했다. 어려운 내용이기도 하고.. 남들이 물어봐도 잘 설명할 수 있을까? 내가 아직 공부가 부족하다고 생각하는 파트라 조심스럽다.그래도 멀쩡히 구현해냈으니 숨길 필요는 없다고 생각해서 올려버렸다.  * 프로젝트의 Saga 도입과 트랜잭션 장애 상황에 대한 롤백 구현을 위한 포스트라, Axon Framework나 Saga 패턴에 대한 이론적인 내용은 생략하겠다.  잦은 쓰기 작업에 대한 이벤트 소싱(Event Sourcing)사용자의 실력 점수(Elo)와 현재 진행중인 게임 방의 Id(code)는 매 게임마다 변경된다.비즈니스상 데이터의 정합성이 매우 중요하며 장애 발생시 롤백이 구현되어야한다.게임 완료를 이벤트로 처리하여 이벤트 소싱 처리함  AxonFramewor..

project/wargame 2025.03.16

데이터에 기반한 사용자 행위 분석 - 어떤 데이터를 수집해야할까?

공격적인지 등의 플레이 스타일이나 성향 분석도 재밌을 거 같고, 인게임 데이터를 수집해서 사용자의 행위를 분석하면서 AFK나 탈주같은 트롤 행위를 검출하면 좋을 것같다. 추후 수집된 데이터들을 기반으로 다시 고민해보겠다. 일단 수집이 먼저다.  데이터 파이프라인(Data Pipeline) 구축e커머스 서비스들로 예시를 들자면, 구매나 배송같은 트랜잭션 작업 이외에 장바구니에 담거나 다시 꺼내고 쿠폰을 적용하는 모든 사용자 액션을 로그 데이터로 수집하고자 한다. 이런 사용자 행위를 수집하고 분석하는 데이터 파이프라인을 구축하는 것을 목표로 한다. 기존에 이미 사용하고 있던 Kafka를 통해서 데이터를 스트리밍할 생각이다. Case 1. Kafka Consumer가 이벤트를 받아서 구축한 ELK에서 분석Ca..

project/wargame 2025.03.12

Hexagonal Architecture 마이그레이션

Hexagonal Architecture 마이그레이션프로젝트 내의 모든 서비스의 마이그레이션이 어느정도 마무리되었다. (25-02-22)가장 아래에서 일단락된 스프린트에 대한 후기를 작성했다.   대공사가 진행중입니다.와 너무 양이 많다……….그나마 통계 서비스는 내용이 적고 DynamoDB를 애초에 Adapter 형태로 설계해서 좀 편했다. 뭣도 모르고 사전순으로 피드(Feed) 서비스부터 시작했다가 뭔가 잘못됐다는걸 크게 느껴버렸음.게시글, 공지사항, 이벤트, 댓글, 좋아요 기능에는 PostgreSQL와 Redis를 섞어 쓰고 있기 때문에 엔티티와 외부시스템이 가장 많다. 현재 피드, 매칭, 통계를 담당하는 각 마이크로 서비스는 마이그레이션을 완료한 상태고, 사용자 정보 관리쪽과 게임 결과 관리 서비..

project/wargame 2025.02.11

포탑의 공격 우선순위와 병종 시스템 개선 (feat. Kafka 메시지 유실)

적진 않았지만 구현한 내용 : Redis로 구현한 스핀락 >> Redisson을 이용한 분산 락그냥 길게 적을 내용 아닌거 같아서 뻈다. 나중에 배포하면서 노드 수가 늘어나면 다시 포스팅 주제로 할애하겠음  nlohmann/json 라이브러리 도입을 통해 JSON 타입 처리 개선 GitHub - nlohmann/json: JSON for Modern C++JSON for Modern C++. Contribute to nlohmann/json development by creating an account on GitHub.github.com 난 그동안 뭘했던걸까... 그냥 라이브러리 쓰면 편한데...  Kafka 메시지 유실에 대비한 후처리로 사용자 경험 개선사실 난관은 '메시지의 유실을 어떻게 인지하는가..

project/wargame 2025.01.17

매칭 서버의 대규모 트래픽 시험 검증하기 (feat. Kafka 성능 튜닝)

매칭 시스템은 가장 성능이 중요한 비즈니스인 만큼 검증은 필수적이다. 매칭 비즈니스 흐름도기본 골자는 다음과 같다.registerMatchQueue : 회원 서비스에게 요청을 보내서 현재 게임중인 사용자인지 검증하고, 매칭 큐에 등록한다.getRank : 현재 매칭중인지 확인하는 APIcalcelMatchQueue : 매칭 큐에 등록된 사용자인지 확인하고 취소한다. 매칭 큐에 등록될때 ZSet 자료구조를 통해 사용자의 Elo 점수를 score로 정렬해서 비슷한 실력대의 사용자들끼리 매칭시켜준다. 마이크로 서비스로 분해하면서 회원 정보의 Nickname에 접근하기 까다로워졌기에, 맨 처음 매칭 큐에 등록할때 사용자 정보를 받아서 HSet 타입으로 캐싱해둬서 가져오도록 했다. 매칭하는데 결과가 줄..

project/wargame 2025.01.04

사용자 경험 개선을 위한 시도 (Banner 구현, Addressable 패치)

비정상적인 좌표 이동에 대한 검증(Validation)아직 패킷 암호화 등의 처리를 하지 않았다. 어차피 막아도 뚫린다는 생각이 있어서 먼저 로직상의 검증부터 구현했다. 객체의 좌표 이동시 이전 위치와 speed를 고려해서 검사하고, 통과해야 움직여준다.로직상 비용이 드는 연산이 아니라 부담은 없다. 그러나 시작할때 생성되는 병종들과 충돌해서 사용자가 밀려나는데, 서버에서는 위치 검증에 실패해서 비정상적인 이동으로 판단함.물론 안 겹치게 병종들을 떨어트려서 생성하면 당장은 그럴듯하겠지만 근본적인 문제를 해결하진 못한다. 충돌(Collision) 등의 물리 연산도 서버에서 진행해야하는건지 의구심이 들기 시작함..   Csharp ↔ Cpp 마샬링 문제std::string과 C#의 string 간에 충돌로 ..

project/wargame 2025.01.04

게임서버 개선을 위한 시행착오들 (feat. 게임서버 타이머, 매치메이킹 정책)

게임서버의 타이머 관리넥슨에 재직중인 선배님과 진득하게 얘기할 기회가 있어서 그중에 프로젝트에 쓰기 위해서 물어본 게 있었다. 현업에서는 게임서버의 타이머를 어떻게 관리하나요? M 게임에서 스킬이나 쿨타임쪽을 담당하진 않지만, 알기로는 타이머를 담당하는 쓰레드를 따로 두고 처리한다고 하셨다.class Timer { ...};void TimerCheckThread() { while (true) { Timer::TimeOutCheck(); Timer::ProcessTimers(); Sleep(1000); }}int main() { IOCPInit(); std::thread timer_thread(TimerCheckThread); timer_thread.join(); return 0;} 이.. 이렇게..

project/wargame 2025.01.04