반응형

전체 글 293

Dignus.ActorServer 액터 모델 기반 고성능 서버 프레임워크

Dignus.ActorServer는 Dignus.Sockets 라이브러리를 기반으로 구현된 액터 모델 서버 엔진이다.네트워크 I/O와 액터 실행을 분리하고 전용 디스패처 기반 실행 구조를 통해 예측 가능한 동시성과 높은 처리량을 목표로 설계되었다.Round-Trip Benchmark (Plain TCP)Test ConditionsServer address: 127.0.0.1Server port: 5000Protocol: Plain TCP (no TLS)Working clients: 1In-flight messages per client: 1000Message size: 32 bytesBenchmark duration: 10 secondsResultTotal Time: 10.002 secondsTotal ..

MPSC (Multiple Producer Single Consumer) 락프리 링버퍼

1.MPSC란 무엇인가?멀티스레드 환경에서 가장 흔한 패턴은 다음과 같다. 여러 스레드가 작업을 생산한다. (Multiple Producer)하나의 스레드가 작업을 처리한다. (Single Consumer)이를 줄여서 MPSC (Multiple Producer, Single Consumer) 라고 부른다.2.왜 MPSC 구조가 중요한가?예를 들어 Actor 시스템에서는 여러 스레드가 Actor에게 메시지 Post 호출 각 Actor는 단일 스레드로 처리 Actor 메일박스는 전형적인 MPSC 구조이다.3.단순 큐로는 안 되는 이유일반적인 큐는 다음과 같이 동작한다.enqueue → tail++ dequeue → head++두 스레드가 동시에 enqueue 하면 tail 증가 충돌, 같은 슬롯에 쓰기 가능..

개발관련/C# 2026.02.15

서버 액터 모델

서버 액터 모델은 상태를 가진 객체 하나가, 메시지를 한 번에 하나씩만 처리하도록 강제하는 서버 설계 방식이다.액터는 다음 규칙을 가진다.액터는 자기 상태를 소유한다외부에서는 상태를 직접 수정할 수 없다모든 요청은 메시지로 전달된다액터는 한 번에 하나의 메시지만 처리한다이 네 줄이 액터 모델의 전부다.왜 서버에서 액터 모델이 필요한가?서버에서 가장 위험한 상황은 다음이다.1.여러 요청이 동시에 들어온다.2.같은 상태를 동시에 수정한다.3.실행 순서에 따라 결과가 달라진다. 이 문제는 서버 개발에서도 가장 흔하면서도 재현하기 어려운 버그의 원인이 된다. 액터 모델의 접근 방식액터 모델에서는 상태의 주인을 하나로 제한하고 상태 변경 경로를 메시지 처리로만 한정하며 메시지를 순차적으로 처리하도록 강제한다.그 ..

개발관련/ETC.. 2026.01.06

ExecutionContext

ExecutionContext는 async await로 이어지는 하나의 실행 흐름에 딸려 다니는 실행 상태 컨텍스트이다. async 코드는 실행 도중 다음과 같은 일이 발생한다.await 지점에서 실행이 중단된다.이후 다른 쓰레드에서 실행이 재개될 수 있다.상태머신이 재개되기 전에 런타임은 이전에 캡처한 ExecutionContext를 해당 실행 흐름에 다시 설정한 뒤 다음 단계의 실행을 이어간다. AsyncLocal과 관계AsyncLocal은 ExecutionContext에 값을 붙이는 역할을 한다.ExecutionContext가 실행 흐름이라면 AsyncLocal은 그 흐름에 달라붙어 값을 함께 따라다닌다. 정리하자면ExecutionContext는 개발자가 직접 다루거나 설계할 개념은 아니다. asy..

개발관련/C# 2026.01.06

AsyncLocal와 ThreadLocal

ThreadLocal쓰레드 단위로 값이 분리되는 저장소이다.- 각 쓰레드는 자기만의 ThreadLocal 값을 가진다.- 같은 코드라도 다른 쓰레드에서 실행이 되면 값이 다르다.- 쓰레드가 바뀌면 값은 자동으로 이어지지 않는다. AsyncLocal논리적 실행 흐름 단위로 값이 유지되는 저장소이다.- async await 로 이어지는 실행 흐름 단위로 값이 분리된다.- 쓰레드가 바뀌어도 ExecutionContext를 통해 값이 복원된다.예시의 마지막 결과물을 보면 알 수 있다.AsyncMethodB에 Value 1로 진입을 했고Value 2 처리가 먼저 끝났지만 비동기 흐름 단위로 값이 유지되기에 Value 1이 유지됨을 알 수 있다.일반 static 변수였다면 마지막에 실행된 값(Value 2)이 두 ..

개발관련/C# 2026.01.06

Unity Google Sign-In iOS 빌드 오류 해결

마지막으로 릴리즈된 plugin으로 ios 빌드시에 문제점이 2가지가 존재한다.GIDSignInDelegate를 찾지 못하는 문제GoogleSignIn.h:18:17 No type or protocol named 'GIDSignInDelegate' WKWebView를 참조하면서 발생하는 문제ITMS-90809 Deprecated : WKWebView 해결 방법 GoogleSignInPlugin/Assets/GoogleSignIn/Editor/GoogleSignInDependencies.xml 5.0.0" bitcodeEnabled="false" minTargetSdk="6.0"> GoogleSignInPlugin/Assets/Plugins/iOS/GoogleSig..

개발관련/Unity 2025.10.20

NLog vs Serilog

1.Serilog: 구성이 간단하고 다양한 출력 대상을 지원하여 많은 개발자들이 사용하는 로그 라이브러리.2.NLog: 유연하고 확장성이 좋으며 매우 빠른 속도를 가진 로그 라이브러리.벤치마킹1차 GUID 1000개 임의의 string 생성속도 : Serilog 483.8ms, Nlog 488.8msGC : Serilog 1,000회 / 1000번 호출, NLog 1000회 / 0번 호출메모리 사용 : Serilog 18.93MB, NLog 3.98MB2차GUID 1000개 임의의 string 생성속도 : Serilog 453.7ms NLog : 491.4msGC : Serilog 1,000회 / 1000번 호출, NLog 1000회 / 0번 호출메모리 사용 : Serilog 18.93MB, NLog 3..

개발관련/C# 2025.07.04

C# 고성능 소켓 서버 DignusSocketServer 성능 테스트

DignusSocketServer> tcp,tls, udp 서버 https://www.nuget.org/packages/Dignus.Sockets 벤치마크 코드https://github.com/EomTaeWook/ServerPerformanceBenchmark테스트 환경 CPU: Intel Core i5-12400F (12세대, 2.50GHz) RAM: 32GB (속도 2400MHz) 테스트 방식: Round-Trip 기반 Echo 방식 (보낸 메시지를 바로 수신) https://github.com/chronoxor/CppServer?tab=readme-ov-file#performance Message Size: 32..

개발관련/C# 2025.05.01

가십 프로토콜

1. 가십 프로토콜이란?가십 프로토콜은 분산 시스템에서 노드들이 정보를 교환하며 동기화하는 방식입니다. 이름 그대로, 소문(gossip)이 퍼지듯 정보가 네트워크 전체로 확산됩니다.가십 프로토콜의 주요 특징랜덤성: 정보가 무작위로 선택된 노드들에게 전파됩니다.확장성: 네트워크의 크기가 커져도 효율적으로 작동합니다.내결함성: 일부 노드가 고장 나더라도 전체 정보 전파에 문제가 없습니다.2. 가십 프로토콜의 동작 방식기본 개념정보의 전파:새로운 정보를 가진 노드가 무작위로 선택된 다른 노드에게 정보를 전달합니다.선택된 노드들은 다시 새로운 노드를 선택해 정보를 전파합니다.이 과정이 반복되면서 네트워크 전체로 정보가 확산됩니다.3. 전파 수(Fanout)전파 수란?전파 수는 한 번에 정보를 전파할 노드의 수를..

개발관련/ETC.. 2025.01.25
반응형