.net 으로 서버를 만들었을때 장점이 뭘까요??

작년에 면접을 보러 다니면서 (연례행사?)
느낀것데 게임회사에서 의외로 .net 으로 서버를 구축하는 경우가 있습니다.

분하지만 상식적으로 서버라면 이제 스프링 부트가 ? 대동단결 하고
상식인 상황에서 게임 같은 Edge 한곳에서 .net 으로 서버 구축 하는 것이
흥미로웠습니다.

당연히 그런 회사들은 기술적으로 아주 성숙 해보였습니다.
아마도 언어에 구애 받지는 고급 기술진들이 .net 을 채택 한 이유가 있겠죠

이 회사들이 java가 아닌 .net 을 채택한 이유나 효과를 알수있다면
.net의 효용성의 대해서 좋은 사례가 될것 같은데요

얼마전에도 본 일본 게임회사에서도 .net backend를 사용하는것 같더군요

그리고 대부분 grpc 를 쓰는것 같았어요
아니면 signalr이나 socket 실시간 반응성 처리 때문에 그럴까요?

7개의 좋아요

게임회사에서 재직하진 않았지만 자바 역시 일본에서 가장 많이 쓰이는 기술이라고 생각합니다.
다만 차이가 있다면 한국보단 일본이 닷넷을 더 쓰고 레퍼런스나 직장 역시 많은 것 같습니다.
단순하게 “한국의 전자정부 프레임워크 때문에 갈라파고스가 된겁니다” 라고 하고 싶지만 그것보다 게임 분야가 아닌 큰 회사 기준에서 다녀도 보고 한 경험으로 말씀드리면 다음 이유가 아닐까… 생각해봅니다

  1. aspnet core가 대규모 처리 시 초당 HTTP 요청이 가장 빠릅니다 (Servlet, nginx, golang, node.js 보다?)

  2. 데이터베이스 엑세스 성능이나 초당 처리 성능이 상당히 빠릅니다

  3. net core로 넘어오게 되면서 비동기나 각종 메모리 관리 등 성능이 크게 향상 되었습니다.

  4. 웹 개발자가 많고 상대적으로 규모가 크지 않은 경우라면 다른 대안이 많지만 큰 규모라면 관리와 장애 대응을 생각했을 때 커뮤니티 활성화보다 파트너사나 조치를 좀 더 쉽게 할 수 있는 안전성(성숙도)을 생각할 수 있습니다

  5. 게임 개발사는 상대적으로 자바보다 C#을 접할 확률이 더 있습니다. 설득력은 좀 떨어지지만 Unity하던 사람이 서버도 만질 확률도 있고 그렇지 않더라도 자바로 된 개발사가 아닌 이상 코드 공유가 수월하다는 장점이 있을 것 같습니다. 생산성 측면이나 MS 기술에 대해 익숙할 수 있으니 채택이 된 건 아닌가 싶습니다

  6. net core를 통해 유연하게 다양한 환경에 배포가 가능해졌습니다. 특히 제 경우엔 linux를 잘 모르더라도 쉽게 배포가 가능해졌고 이를 통해 docker 컨테이너 형태로 lambda에 배포하거나 리눅스 기반에 aws ec2에 배포하는 것이 수월해졌습니다. 특히 단일서버 기준 리눅스에서 .net core가 돌았을 때 성능이나 가성비가 확실히 좋습니다. 클라우드에 이것을 구축했다면 콜드 스타트나 비용 등 여러가지를 고려해도 나쁘지 않은 선택입니다

  7. 확실히 C++ 게임서버가 속도 측면에서 보편적으로 많이 선택 되어왔다고 생각이 되는데 진입장벽이 높기도 하고 JAVA 게임서버 개발은 레퍼런스나 성능 문제도 있고 오히려 이 시장에선 극소수인지라 자연스럽게 C → C++ → C#이 된 건 아닌지…

  8. 예전에 비해 백엔드 쪽으로 .net core로 작성하는 케이스가 심심치 않게 보이고 있긴 한 것 같습니다. 한국이야 뭐 워낙 파이가 작아도 채용시장에 조금 보이기도 하고 .net core가 발전함에 따라 말씀하신 비동기 소켓서버를 선택했을 때 이 점이 확실히 있는 편이라 전환하는 과정에서 수요가 있을 것 같습니다

하지만 어디까지나 제 생각이고… 데이터 가지고 들고 나와서 말씀드리기엔 현업에 계신 분들이 공감 못하실까봐 뇌피셜로 끄적여봤습니다.

이제 게임 서버 개발자 분들이 등장하셔서 니 말이 틀리다고 달아주실 때가…

결론 : MAUI 만세

18개의 좋아요

기술적으로 닷넷의 버전이 업그레이드 될 수록 힙 메모리에 의존하는 연산을 최소화하고, 가비지 컬렉터가 실행되는 빈도를 낮추는 방향으로 I/O 연산을 최적화하는 것에 많은 공을 들이는 것으로 알고 있습니다. Microsoft가 리딩 포인트를 잡고서 계속 런타임 성능 개선에 많은 투자를 하고 있는 덕분이라고 보여집니다.

아마 Java의 경우에도 여러 JVM Implementation이 있을 것이고 (흔히 업계에서 말하는 Java는 OpenJDK일 확률이 높고), 그 중에서는 .NET과 비슷한 기조 아래에서 성능에 집중하는 구현체를 만드는 곳도 있을 것으로 사려됩니다. (예: https://technology.amis.nl/software-development/performance-and-tuning/comparing-jvm-performance-zulu-openjdk-openjdk-oracle-jdk-graalvm-ce/)

기술적인 우수성과는 별개로, 제 예상에 게임 분야의 경우에는 Unity를 이용해서 개발을 하기 때문에, C# 스크립트의 지식과 코드 애셋을 다시 활용할 가능성이 높아서 서버쪽도 닷넷 런타임을 같이 쓰는 것을 선호하는 것이 아닐까 생각합니다.

8개의 좋아요

이게 좀 단순하게 보기 어려운 같아요

한개 프레임워크의 특징을 논할 순 있습니다.
그러나 회사의 다양한 기술과 향후 전략과 같은것을 합쳐서 생각해보면 매우 달라질 수 있어요

그래서 제 결론은, 조직으로써 ASP.NET 하나만 가지고 장점을 논하기엔 어렵다.


그럼에도 장점을 꼽으라면,

  1. .NET BCL

    타 언어에는 컴파일 시점 Readonly 컬렉션도 없습니다. (IReadOnlyCollection 류)

  2. C#

    아무리 Reactive 도구가 나와도 컴파일러 수준에서 지원하는 비동기 프로그래밍을 이길 순 없는거 같습니다. (Async, Await)

  3. Service collection

    스xx 의 ioc 컨테이너는 너무 오래되서 상당히 무갑습니다. 그에 비해 닷넷의 service collection은 마치 코드 레벨의 컬렉션 다루는 것 마냥 가볍습니다. 이건 단위테스트에서 빛을 보게되더라구요.

7개의 좋아요

프라우드넷이 C#으로 개발되었다가 C++로 컨버전 했죠
GC도 문제고 네이티브 언어에 비하면 성능이 낮으니 장점이라기 보단 절충안으로 닷넷을 선택한 것 같습니다.
리더보드나 실시간이 아닌 모바일 게임은 성능이 크게 중요하지 않으니 뭘로 해도 상관 없고요
C++ 고성능 서버 제외한 나머지는 그냥 취향인 것 같습니다.

3개의 좋아요

여기 나오지 않은 내용으로 하나 말씀드리면,

게임마다 다르다

라고 보시는 것도 좋을 것 같습니다.

MMORPG 업계에서는 서버에 C++를 사용하는 경우가 많지만 실시간 메세지 통신이 필요하지 않은 케쥬얼 게임같은 경우에는 aspnet core도 꽤 사용합니다.

실시간 메세지 통신의 경우 protobuf를 사용하는 grpc 보다는 통신량을 예측하고 따져본 뒤 flatbuffers 같은 protobuf 보다 압축률이 좋은 버퍼를 사용하기도 합니다.

물론 건너 듣기로 신작 모바일게임인 나이트 크로우가 .NET서버로 개발되었다고 들었는데 진짜인지는 모르겠습니다.

따라서 구현하기 나름이 아닐까 싶습니다…!

4개의 좋아요

image

맞나봅니다.

6개의 좋아요

여러회사 다니면서 http 서버로 노드,파이썬,자바,코틀린,루비온레일즈 서버랑 비교해봤는데 성능차이가 쨉도안됩니다.
아이들상태에서 노드 파이썬(당시 fast api가 흥하지 않았어서 fast api는 몰라요)보다 10배정도 빠르고, 자바보다는 2~5배정도 빨랐습니다. 루비는 100배쯤 차이나서 아예 쨉도 안돼요. 비동기+스트레스 상황에서는 앞에 얘기한것보다 2배씩 더 빨라졌고, 메모리 효율이나 스트레스 내구성도 차이가 많이 났습니다. 물론 저 플랫폼들을 준비하신분들의 역량의 차이일수도 있지만 닷넷서버라고 딱히 성능이나 안정성에 관련해서 손댄건 아니었어요. 고랭은 api 서버를 하시는분이 안계셨었는데 병렬처리가 정말 빨랐는데 닷넷에 비해 느린 케이스도 많았고 라이브러리들이 당시에는 많이 미성숙했어요.

6개의 좋아요

특히 자바쪽은 스프링부트로 그냥 비동기 처리를 하는게 어렵게 되어있더라구요? 그래서 무슨 스프링부트 어쩌고해서 나온걸 해야하는데 기존 스프링부트와 유사성도 떨어지고, 그 고생해서 작성해도 닷넷보다 미세하게 느렸어요. 특히 디비관련된 라이브러리들은 비동기를 지원이 미흡해서(저는 그럴리가 없다고 생각했지만 관계자분들이 그렇다고 해서…) r2db?머시긴가 아직 베타라고 하던데 알아야할게 왜이렇게 많나 싶었습니다. 자바 라이센스 정책도 복잡하고, ojdk도 8, 11 두개만 지원해서 최신버전 역시 적용못하고 8-11간 하위호환성 문제도 나오고 여러모로 채택할 이유가 없었습니다.

6개의 좋아요

개발자분이 프라우드넷2는 퓨어닷넷코어로 작성한다고 했었는데, 한 2년 지난거같은데 소식은 없네요.

6개의 좋아요

규모가 큰 게임회사의 경우 어느 정도 스펙이나 여러 사항을 고려한 후에 서버 스펙을 정할텐데요. 작은 규모의 게임 회사인 경우 간혹 게임 개발 겸 서버도 개발하는 곳도 있습니다. 그럴 경우 Unity 개발자의 경우 가장 접근이 쉬운 게 닷넷 서버라서 채택하는 경우도 많다고 합니다. 결국에는 각 프로젝트 별로 고려 후에 정하는 거겠지만 위처럼 겸해서 개발하는 경우는 보통 닷넷 서버로 간다고 하더군요.
Unity로 개발하는 경우는 Entity나 구조 설계가 아무래도 닷넷 서버와 이점이 많은 것 같습니다. 닷넷 서버로 개발하는 입장에서 Unity 개발자와 협업 시 라이브러리를 같이 사용하거나 공통으로 사용해야할 로직들에 대해 정리해서 서버쪽에서 만들어 배포하는 등 개발이나 운영 간에 여러 이점이 있는 것 같습니다.
그리고 그렇게 개발하면서 필요한 운영툴이 있다면 닷넷 서버를 사용하는 경우 자연스레 닷넷을 이용한 웹 프론트, 백엔드 개발이 들어가게 되서 닷넷 생태계가 이루어지는 것 같습니다. 이상 게임업계 종사자의 뇌피셜이었습니다…?! ㅎㅎ

7개의 좋아요

언어나 프레임웍을 선택하는 기준은 상황에 따라 매우 큰 차이가 있기 때문에
역시나 '상황에 따라 다르다’라고 하겠습니다.
일반적으로 할 수 있는 이야기가 각자의 상황에 모두 들어맞기는 매우 어렵기 때문입니다.

여러가지 기준이 있을텐데요,

  • 결과물의 런타임 성능의 중요도
  • 개발 및 유지보수에 필요한 시간
  • 해당 기술력(및 기술인력)의 보유 여부
  • 해당 기술인력 수급의 용이함
  • 자금이나 일정상이 이유 및 외주개발 가능 여부
  • 협력관계에 있는 회사와의 사정

대충 생각해 봐도 무지 많군요. 이런것들을 다 떠나서 기술적인 부분만 자세히 들여다보면… 그래도 상황에 따라 다르다고 할 수 있습니다.
가비지 컬렉터도 없고 네이티브 언어인 C는 일단 논외로 칩니다.

우선 성능에 지대한 영향을 미칠수 있는 것들은 여러가지일텐데 나열해보겠습니다.

  • 쓰레딩 모델
  • DB 저장 구조와 UI/UX의 연관성(관계형, 키밸류, 타임시리즈 등…)
  • I/O 요청량의 크기 및 요청횟수
  • 자주 사용되는 것 부터 드물게 사용되는 데이터들까지의 캐싱 레벨의 설정
  • 최적의 성능을 발휘하는 상태를 유지하는 설정(메모리 핏 되서 페이징등이 자주 발생되지 않게)
  • 하드웨어의 특수기능 활용 여부(SIMD 명령어나 DPDK 등 지원 및 활용 여부)
  • 런타임 환경의 제약

이러한 조건들은 환경에 따라, 그당시 상황에 따라 달라질 수 있습니다. 특별한 경우가 아니라면 범용 언어나 프레임웍들 중 어떤것도 그 자체로서 특출날수는 없을 것 같습니다.
예를 들어 이런 경우도 있을 수 있습니다. 올해 인텔 아키텍쳐인 AVX-512를 활용한 정렬 알고리즘이 발표되어 파이썬 넘파이 라이브러리에 포함되었는데, 정렬연산이 많은 작업을 처리할때는
그리고 런타임환경이 해당 명령을 지원하는 환경일 경우는 해당 기능을 사용하지 않는 다른 java나 c# 프레임웍보다 파이썬이 훨씬 높은 성능을 처리할 수 있습니다.
각 환경별로 다소 늦게 공식(혹은 표준) 라이브러리에 포함될 수도 있으니 시간에 따른 편차도 존재합니다.

어떤 제약이 있는지, 단점이 있지만 본인이 포함되었던 환경에서는 그 단점이 상쇄되는 환경이었을수도 있고… 그리고 시간이 지나면 상황이 바뀌기도 합니다.

정확한 근거가 없이 당장 나타난 현상에만 집작하게 되면 잘못된 지식과 믿음을 가지게 되는 경우도 많으니, 근거가 확인되지 않은 경우에는 ‘뭐가 어디어디에 좋다는 이야기는 들었다.’ 정도로 인식하시면 좋을 것 같습니다.

8개의 좋아요

와…댓글들의 퀄리티가 어마어마하네요.
글쓴이분의 궁금증이 많이 해소되었으면 좋겠네요.

3개의 좋아요

Spring Boot(Java), Node(NestJS, Typescript)로도 서버 많이 만들고,
ASP.NET Core(C#)기반 서버도 만듭니다. (저희는 3가지 서버군을 게임에 맞게 지원합니다.)
ASP.NET Core(C#)을 선택하는 가장 큰 이유는

  • Client가 Unity(C#)기반이면 Request, Response 객체를 단일화해서 관리할 수 있습니다.
  • 단일화한 객체를 가지고 각각 Client와 Server의 병행개발이 가능합니다. (연동은 추후에…)
  • 서로간의 코드를 볼 수 있어서 커뮤니케이션이 쉽습니다.
4개의 좋아요