DeepConnect의 개념 및 사용법
DeepConnect는 분산 객체 시스템을 위한 프레임워크로, 별도의 프로세스 공간에 있는 객체를 로컬 객체처럼 다룰 수 있게 합니다. 이는 원격 객체를 로컬 변수에 할당하거나, 일반적인 Ruby 메시지 형식으로 메서드를 호출하는 방식으로 이루어집니다.
기본 사용법
-
서버 측:
DeepConnect.start를 호출하여 서비스를 시작합니다. -
클라이언트 측:
DeepConnect.start로 서비스를 시작한 후,open_deep_space를 통해 원격 DeepSpace(상대방의 객체/이름 공간)에 접속합니다. -
객체 접근:
DeepSpace::File과 같이::연산자를 사용하여 원격 공간의 클래스나 상수에 접근할 수 있습니다. 예를 들어,peer::A와 같이 원격 변수도 접근 가능합니다. -
메시지 전송: 로컬 객체처럼 원격 객체에 메시지를 보내면(예:
remote_array.push(object)), 해당 메시지는 원격 측 객체에서 실행됩니다.
신규 인터페이스의 특징
- 간소화된 객체 관리: 이전 버전에서 필요했던
export및import와 같은 명시적인 객체 등록 및 가져오기 과정이 신규 버전에서는 기본적으로 불필요합니다. 로컬에서 할 수 있는 모든 작업이 원격에서도 동일하게 가능합니다.
주요 특징: 메서드 인자 전달 방식
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 스레드를 사용하는 구조를 개선하여, 개발자가 필요에 따라 단일 스레드로 순차적인 요청 처리를 할 수 있는 기능을 구현 중입니다. 이는 데드락 위험을 줄이면서도 자원 사용 효율을 높일 수 있습니다.