Ruby Wasm 기반 브라우저 D-Ruby: 분산 객체 프로그래밍의 새로운 지평

[JA] dRuby on Browser Again! / @youchan @ledsun

작성자
RubyKaigi
발행일
2025년 05월 27일

핵심 요약

  • 1 Ruby Wasm과 D-Ruby를 결합하여 브라우저 환경에서 Ruby 분산 객체 프로그래밍을 구현하는 두 가지 혁신적인 접근 방식이 소개되었습니다.
  • 2 Yo-chan은 `drb-websocket` 및 `wasm-drb` 젬을 통해 D-Ruby의 서버/클라이언트 기능을 브라우저에 통합하고, 비동기 처리 및 Wasm-JavaScript 경계 상호작용의 복잡성을 지적했습니다.
  • 3 Red-san은 `Wasm-Socket` 젬으로 Ruby와 브라우저 간 웹소켓 통신 API를 추상화하여 동기적 소켓 프로그래밍 경험을 제공하며 'Socket Programming in Browser' 개념을 제시했습니다.

도입

본 발표는 Ruby Wasm 기술을 활용하여 브라우저 환경에서 D-Ruby(분산 Ruby 객체)를 실행하는 두 가지 혁신적인 접근 방식을 다룹니다. Yo-chan과 Red-san 두 발표자는 동일한 목표를 공유하지만, 각기 다른 방식으로 웹소켓 통신을 추상화하고 Ruby의 분산 객체 기능을 웹 브라우저에 통합하는 과정을 상세히 설명합니다. 이는 기존 웹 애플리케이션 개발 방식의 한계를 극복하고, Ruby 개발자에게 새로운 가능성을 제시하고자 하는 시도입니다.

Ruby Wasm 기반 브라우저 D-Ruby 구현

Yo-chan의 접근 방식: drb-websocketwasm-drb

  • Ruby Wasm: CRuby를 WebAssembly로 컴파일하여 브라우저에서 Ruby 코드를 실행하는 기술입니다.
  • D-Ruby: Ruby의 분산 객체 기술로, 서로 다른 Ruby VM(프로세스, 호스트) 간 객체 호출을 가능하게 합니다. 일반적으로 TCP 소켓을 사용하나, 웹 환경을 위해 웹소켓 프로토콜로 확장됩니다.
  • 통합의 이점:
    • JSON API 구현 불필요: 서버에서 클래스를 정의하고 클라이언트에서 메서드를 직접 호출하는 간결한 아키텍처를 구현합니다.
    • 객체 공유 용이성: 여러 브라우저 클라이언트가 서버의 동일한 Ruby 객체를 공유하여 상태 관리가 간소화됩니다.
  • 구현 Gem:
    • drb-websocket: 서버 측에서 D-Ruby 프로토콜을 웹소켓 기반으로 확장합니다. Standalone 모드와 Rack 미들웨어 모드를 지원합니다.
    • wasm-drb: Wasm 환경에서 D-Ruby 클라이언트 및 서버 기능을 구현합니다. 특히, 클라이언트 측에서 블록을 전달할 때 서버가 클라이언트의 메서드를 원격 호출하는 역전된 관계를 처리하기 위해 Wasm 환경 내 서버 구현이 필요합니다.
  • 도전 과제:
    • 비동기 호출: D-Ruby의 원격 호출은 비동기적으로 처리되며, Wasm 환경에서는 JavaScript의 Promise로 변환되어 await 키워드 사용이 필수적입니다. 이는 기존 Ruby의 동기적 사고방식과 차이를 발생시킵니다.
    • Wasm-JavaScript 경계 문제: Wasm과 JavaScript 간의 컨텍스트 전환이 비동기 호출 시 필요하며, Fiber.transfer와 같은 복잡한 메커니즘을 요구하여 직관적이지 않습니다.

Red-san의 접근 방식: Wasm-Socket (Wans)

  • 목표: C-Ruby와 브라우저 환경에서 동일한 웹소켓 통신 코드를 실행할 수 있도록 소켓 통신을 추상화합니다.
  • Wasm-Socket (Wans) Gem:
    • TCPSocket과 유사한 API를 제공하여 Ruby 개발자가 웹소켓 통신을 마치 일반 소켓처럼 다룰 수 있게 합니다.
    • JS 젬에 의존하여 JavaScript WebSockets API를 활용하며, JS 젬의 존재 여부로 Ruby 또는 JavaScript 구현을 동적으로 전환합니다.
  • 동기/비동기 갭 해소:
    • Ruby의 Socket#gets는 동기적 대기, JavaScript WebSocket은 비동기 이벤트 핸들러 방식입니다.
    • JS 젬의 PromiseScheduler와 Ruby의 Queue 개념을 활용하여 JavaScript의 비동기 이벤트를 Ruby의 동기적 대기(예: Queue#pop)로 변환합니다. 메시지 수신 시 Promise를 해결하여 await 중인 Ruby 코드가 다시 실행되도록 합니다.
  • 테스트 전략: C-Ruby 기능은 RSpec으로, JavaScript/브라우저 기능은 Node.js 환경에서 node-wasm을 사용하여 유닛 테스트를 실행합니다.
  • 새로운 개념 제안: Wasm-Socket을 통해 브라우저 내에서 소켓 프로그래밍이 가능해짐으로써 “Socket Programming in Browser”라는 새로운 패러다임을 제시합니다.

결론

본 발표는 Ruby Wasm과 D-Ruby를 활용하여 브라우저 환경에서 분산 객체 프로그래밍을 실현하는 두 가지 독창적인 방법을 제시했습니다. Yo-chan은 기존 D-Ruby 프로토콜을 웹소켓으로 확장하고 Wasm 환경에 맞춰 재구현하는 방식을, Red-san은 `Wasm-Socket` 젬을 통해 Ruby와 브라우저 간 소켓 통신을 추상화하여 동기적 프로그래밍 경험을 제공하는 방식을 선보였습니다. 비록 비동기 처리와 Wasm-JavaScript 경계 상호작용의 복잡성이라는 도전 과제가 존재하지만, 이들의 노력은 Ruby 개발자들이 웹 애플리케이션을 더욱 효율적이고 Ruby 친화적인 방식으로 구축할 수 있는 새로운 가능성을 열었습니다. 특히, 브라우저에서 직접 소켓 프로그래밍을 가능하게 하는 `Wasm-Socket`의 개념은 향후 웹 개발의 새로운 지평을 열 잠재력을 보여줍니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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