분산 객체 환경 DeepConnect 신버전 소개

[18S07] About New Version of DeepConnect for Distributed Object Environment (ja)

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

핵심 요약

  • 1 DeepConnect는 Ruby 분산 객체 시스템을 위한 프레임워크로, 새로운 버전은 명시적인 export/import 없이 원격 객체를 로컬 객체처럼 다룰 수 있는 직관적인 인터페이스를 제공합니다.
  • 2 신규 버전은 `const_missing`과 동적 모듈 생성을 활용하여 원격 객체 및 클래스에 대한 투명한 접근을 구현했으며, 메서드 인자 전달 방식을 `MethodSpec`으로 세밀하게 제어할 수 있습니다.
  • 3 성능 최적화를 위해 Ruby의 기본 스레드 및 큐의 한계를 극복하고자 C로 구현된 ExThread 라이브러리(ExQueue, ExConditionVariable 포함)를 개발했으며, 인자 직렬화 속도 개선도 추진 중입니다.

도입

본 발표는 IRB 개발자이자 Ruby의 명명자로 알려진 이시즈카 씨가 개발한 분산 객체 환경 DeepConnect의 새로운 버전에 대한 소개입니다. DeepConnect는 Ruby 언어 기반의 분산 객체 시스템을 구현하기 위한 프레임워크로, 다른 프로세스 공간에 존재하는 객체를 마치 로컬 객체처럼 투명하게 다룰 수 있도록 설계되었습니다. 이 프레임워크는 과거 Fairy 프로젝트를 구현하는 과정에서 다시 활성화되었으며, 2023년 10월 GitHub에 공개되었습니다. 이번 발표에서는 특히 사용 편의성을 대폭 개선한 신규 인터페이스와 그 구현 방식, 그리고 향후 성능 개선 계획에 중점을 둡니다.

DeepConnect의 개념 및 사용법

DeepConnect는 분산 객체 시스템을 위한 프레임워크로, 별도의 프로세스 공간에 있는 객체를 로컬 객체처럼 다룰 수 있게 합니다. 이는 원격 객체를 로컬 변수에 할당하거나, 일반적인 Ruby 메시지 형식으로 메서드를 호출하는 방식으로 이루어집니다.

기본 사용법

  • 서버 측: DeepConnect.start를 호출하여 서비스를 시작합니다.

  • 클라이언트 측: DeepConnect.start로 서비스를 시작한 후, open_deep_space를 통해 원격 DeepSpace(상대방의 객체/이름 공간)에 접속합니다.

  • 객체 접근: DeepSpace::File과 같이 :: 연산자를 사용하여 원격 공간의 클래스나 상수에 접근할 수 있습니다. 예를 들어, peer::A와 같이 원격 변수도 접근 가능합니다.

  • 메시지 전송: 로컬 객체처럼 원격 객체에 메시지를 보내면(예: remote_array.push(object)), 해당 메시지는 원격 측 객체에서 실행됩니다.

신규 인터페이스의 특징

  • 간소화된 객체 관리: 이전 버전에서 필요했던 exportimport와 같은 명시적인 객체 등록 및 가져오기 과정이 신규 버전에서는 기본적으로 불필요합니다. 로컬에서 할 수 있는 모든 작업이 원격에서도 동일하게 가능합니다.

주요 특징: 메서드 인자 전달 방식

DeepConnect는 성능과 일관성을 위해 메서드 인자 전달 방식을 유연하게 처리합니다.

  • 기본 참조 전달: 대부분의 객체는 기본적으로 참조(reference) 방식으로 전달됩니다. 이는 분산 프로그램의 구현을 매우 간단하게 만듭니다.

  • 값 전달 예외: 다음 경우 성능 또는 불변성 유지를 위해 값(value)으로 전달됩니다.
    • 불변 객체: True, False, Nil, Symbol, Numeric 등 내부 상태가 변하지 않는 객체.
    • String: 성능 최적화를 위해 기본적으로 복사하여 전달됩니다. 다만, 원격 객체에 대한 부작용(side effect)이 필요한 경우 MethodSpec을 통해 참조 전달을 지정할 수 있습니다.
  • MethodSpec을 이용한 제어: 개발자는 MethodSpec을 사용하여 특정 메서드의 인자 전달 방식을 세밀하게 지정할 수 있습니다. 이는 참조(reference), 얕은 복사(shallow copy), 깊은 복사(deep copy) 중 하나를 선택할 수 있게 하며, 내장 Ruby 메서드에 대해서도 사전 정의된 MethodSpec이 적용되어 예상치 못한 동작을 방지합니다.

신규 API 구현 방식

  • const_missing 활용: DeepSpace::File과 같이 :: 연산자를 통한 상수 접근은 Ruby의 const_missing 메커니즘을 활용하여 구현됩니다. DeepSpace는 연결 상대방마다 동적으로 생성되는 무명 모듈(anonymous module)로, const_missing이 호출되면 원격 공간에서 해당 상수를 가져와 로컬에 프록시 객체를 생성합니다.

  • 동적 클래스/모듈 생성: 원격 클래스 참조 시, DeepConnect는 해당 클래스뿐만 아니라 그 상위 클래스(ancestors)까지 필요에 따라 동적으로 모듈/클래스 프록시를 생성하여 로컬에서 접근 가능하게 합니다. 이는 원격 객체의 상속 계층 구조를 투명하게 반영합니다.

향후 계획 및 성능 개선

DeepConnect는 지속적인 고속화와 최적화를 목표로 합니다.

  • ExThread 라이브러리: Ruby의 기본 큐(Queue) 및 컨디션 변수(ConditionVariable)가 성능 병목이 되는 문제를 해결하기 위해 C로 구현된 ExThread 라이브러리를 개발했습니다. ExQueue는 Ruby 기본 큐보다 약 10배, ExConditionVariable은 약 4배 빠릅니다. 이는 Fairy 프로젝트의 고속화를 위해 시작되었으나, 독립적인 패키지로 제공됩니다.

  • 인자 직렬화/역직렬화 고속화: MethodSpec에 따른 복잡한 인자 전달(참조, 얕은 복사, 깊은 복사) 로직으로 인해 발생하는 성능 저하를 해결하기 위해 해당 부분을 C로 재구현할 계획입니다.

  • 스레드 사용량 감소: 현재 1 연결당 1 스레드, 1 요청당 1 스레드를 사용하는 구조를 개선하여, 개발자가 필요에 따라 단일 스레드로 순차적인 요청 처리를 할 수 있는 기능을 구현 중입니다. 이는 데드락 위험을 줄이면서도 자원 사용 효율을 높일 수 있습니다.

결론

DeepConnect는 Ruby 개발자들이 분산 시스템을 더욱 쉽고 효율적으로 구축할 수 있도록 돕는 강력한 프레임워크입니다. 특히 새로운 버전은 직관적인 인터페이스와 `const_missing`을 활용한 동적 객체 접근 방식으로 사용 편의성을 극대화했습니다. 또한, Ruby의 내재된 성능 한계를 극복하기 위한 C 기반 ExThread 라이브러리 개발 및 인자 직렬화 최적화 등 저수준에서의 끊임없는 개선 노력은 DeepConnect의 미래를 더욱 기대하게 만듭니다. 이러한 기술적 진보는 복잡한 분산 환경에서 Ruby의 활용 가능성을 확장하며, 개발자들에게 새로운 가치를 제공할 것입니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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