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