UringMachine 소개

Noteflakes - Introducing UringMachine

작성자
발행일
2025년 06월 28일

핵심 요약

  • 1 UringMachine은 io_uring과 Ruby 파이버를 활용하여 동시성 I/O를 효율적으로 처리하는 새로운 Ruby Gem입니다.
  • 2 기존 프로젝트의 교훈을 바탕으로 불필요한 monkey-patching과 과도한 기능 확장을 지양하고, 더 간결하고 견고한 핵심 기능 제공에 집중합니다.
  • 3 이 Gem을 기반으로 새로운 웹 서버(TP2)와 웹 프레임워크(Syntropy)를 구축하여 독자적인 Ruby 개발 생태계를 형성하고 있습니다.

도입

UringMachine은 Ruby에서 io_uring과 Ruby 파이버를 이용하여 고성능 동시성 I/O를 구현하기 위해 개발된 혁신적인 Ruby Gem입니다. 이 프로젝트는 개발자가 이전에 시도했던 Polyphony와 IOU 프로젝트에서 얻은 귀중한 교훈들을 통합하여 탄생했습니다. 특히, 기존 프로젝트에서 발생했던 표준 라이브러리 monkey-patching의 유지보수 문제와 '모든 것을 담으려는' 접근 방식의 비효율성을 개선하여, 보다 간결하고 견고하며 핵심 기능에 집중하는 설계를 목표로 합니다.

UringMachine은 기존 Ruby I/O 클래스를 직접 수정하는 대신, 파일 디스크립터를 직접 다루는 저수준 접근 방식을 채택합니다. 이는 초기에는 다소 복잡하게 느껴질 수 있으나, machine.open, machine.read, machine.close와 같은 명시적인 API를 통해 동시성 I/O 작업을 매우 효율적으로 제어할 수 있게 합니다. 예를 들어, machine.spin 메서드를 사용하여 여러 파이버에서 동시에 파일을 읽는 작업을 간편하게 수행할 수 있으며, 이는 비동기 작업을 쉽게 시작할 수 있는 강력한 이점을 제공합니다.

UringMachine의 가장 큰 특징 중 하나는 그 간결함과 견고한 구현입니다. 기존 Polyphony가 방대한 코드베이스(Ruby 약 2.7KLOC, C 약 6KLOC)를 가졌던 것에 비해, UringMachine은 훨씬 작은 규모(Ruby 약 200LOC, C 약 2.7KLOC)로 구현되었습니다. 이는 UringMachine이 처음부터 Linux 및 io_uring 전용 라이브러리로 설계되었기 때문이며, 동시성과 관련된 모든 기능을 제공하기보다는, 개발자가 원하는 추상화(예: 파이버 간 메시지 전달, 구조화된 동시성)를 구축하는 데 필요한 기본적인 요소들을 제공하는 데 집중합니다.

UringMachine은 기존 Ruby 생태계의 I/O 방식과 직접적으로 충돌하지 않으면서도, 자체적인 I/O 처리 방식을 고수합니다. 이는 다른 Gem과의 간섭을 최소화하지만, UringMachine을 통하지 않는 I/O 작업이 UringMachine을 사용하는 부분의 성능에 영향을 줄 수 있음을 의미합니다. 따라서 UringMachine의 잠재력을 최대한 활용하기 위해서는 이를 중심으로 한 새로운 생태계의 구축이 필수적입니다.

이러한 생태계의 일환으로 두 가지 주요 프로젝트가 개발 중입니다. 첫 번째는 UringMachine 기반의 새로운 웹 서버인 TP2입니다. 이는 기존 Tipi 웹 서버의 후속작으로, 훨씬 간결한 디자인과 코드베이스를 자랑하며 I/O 및 동시성 관리를 UringMachine에 전적으로 의존합니다. 두 번째는 새로운 웹 프레임워크인 Syntropy입니다. Impression의 연장선상에 있는 Syntropy는 파일 시스템 기반 라우터를 채택하여 디렉토리 및 파일 구조를 통해 라우트를 정의합니다. 정적 파일 및 마크다운 서비스, _hook.rb를 통한 미들웨어, _error.rb를 통한 사용자 정의 오류 핸들러, 깔끔한 URL 지원, 개발 모드에서의 자동 라우트 재로딩 등 다양한 기능을 제공합니다. Syntropy는 향후 Docker Compose를 이용한 배포, 스켈레톤 웹 앱 생성 도구, SQLite 기반 데이터 모델링 계층, 그리고 애플릿 통합 기능 등을 추가할 계획입니다.

UringMachine 자체도 지속적인 개선이 이루어질 예정입니다. 향후에는 splice, sendto, recvfrom과 같은 더 많은 io_uring 작업 지원, 폴링 기능, 전체 파일의 간편한 읽기/쓰기 추상화, 그리고 SSL I/O 지원 등을 추가하여 기능을 확장할 계획입니다.

결론

UringMachine, TP2, 그리고 Syntropy는 저자의 소프트웨어 개발 방식에 대한 새로운 방향성을 제시합니다. 이 프로젝트들은 개발자 자신의 워크플로우와 선호도에 맞춰진 맞춤형 도구를 구축하는 데 중점을 둡니다. 기능 확장을 지양하고, 고객을 위한 프로젝트 실행에 필수적인 기능만을 추가하거나 변경하는 데 집중함으로써, 불필요한 복잡성을 피하고 효율성을 극대화합니다. 궁극적으로 이 프로젝트들은 개발자 자신의 필요를 충족시키기 위한 노력의 산물이며, 현재 이 웹사이트 자체가 이러한 도구들로 구축되어 그 실용성과 효용성을 입증하고 있습니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!