발표 소개
게임서버를 개발하는 발표자가 자바에서 파이버를 이용해 동시성 프로그래밍을 쉽게 하는 방법을 소개하겠다고 밝힌다. NHN에서 실시간 게임서버를 만들라는 미션을 받아 3년간 고민한 내용을 바탕으로, 동시성의 어려움부터 파이버 적용까지 다룰 것임을 예고한다.
여러 스레드가 공유 자원에 접근할 때 락으로 순서를 제어해야 하고, 실수하면 데드락처럼 재현이 어려운 문제가 생긴다고 설명한다. 또 비동기 호출에서 콜백이나 프라미스로 결과를 처리하다 보면 코드의 흐름을 순차적으로 따라가기 어려워지는 점을 지적한다.
동시성 이슈를 피하려 Node.js처럼 싱글스레드 이벤트 루프로 동기식 코드를 쓰는 방법을 검토한다. 그러나 오래 걸리는 함수는 별도 스레드에 던지고 콜백으로 받아야 하며, 블로킹 작업이 있으면 요청이 순차 실행되어 성능이 막히는 한계가 있음을 설명한다.
파이버는 경량 스레드로, OS가 아니라 프로그래머가 명시적으로 제어를 넘기는 협력적 멀티태스킹 방식이라 컨텍스트 스위칭 비용이 낮다고 설명한다. 레이스 컨디션이 없고 수백 바이트 메모리만 써서 한 스레드에서 수십만 개의 파이버를 만들 수 있다는 장점을 강조한다.
파이버 내부는 코루틴으로 동작하며, 코루틴은 실행 상태를 유지하면서 제어를 양보(yield)했다 재개하는 개념이라고 설명한다. 자바스크립트의 제너레이터, 그리고 함수의 실행 상태를 객체에 저장하는 컨티뉴에이션 개념을 예로 들어 원리를 풀어낸다.
자바는 코루틴을 제공하지 않아 Quasar라는 오픈소스를 사용했다고 소개한다. Quasar는 JVM 바이트코드를 조작하는 에이전트로 실행 상태에 접근해 파이버를 구현하며, 디버깅 시 스택 정보를 복구해 주어 완성도가 높았다는 사용 경험을 전한다.
플레이어 상태를 중심으로 동작하는 게임서버에 파이버를 적용해, 싱글스레드 이벤트 루프 위에서 각 요청을 파이버로 처리하는 구조를 설명한다. DB 조회나 비동기 HTTP 호출을 파킹·재개로 처리해 동기 코드처럼 작성하면서도 많은 요청을 동시에 다룰 수 있게 했다.
파이버에는 중첩 함수 처리 등 일부 제약이 있지만, Quasar를 만든 개발자가 주도하는 자바 표준 Project Loom이 진행 중이라 앞으로 더 나아질 것으로 전망한다. 동시성에 익숙하지 않은 주니어도 큰 실수 없이 서버를 만들 수 있게 한 것을 성과로 꼽으며 발표를 맺는다.