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 지원 등을 추가하여 기능을 확장할 계획입니다.