본 발표는 Ruby 소켓 라이브러리에 Happy Eyeballs 버전 2 알고리즘을 도입하는 과정을 다룹니다. 이 알고리즘은 듀얼 스택(IPv6/IPv4) 환경에서 네트워크 연결 지연을 최소화하여 효율성을 극대화합니다. 발표에서는 `Socket.tcp` 개선과 C 언어로 구현된 `TCP_Socket.new`에 이 알고리즘을 적용하며 마주했던 기술적 도전과 해결 방안을 설명합니다.
Happy Eyeballs 도입은 Socket.tcp
개선과 TCP_Socket.new
구현으로 진행되었습니다. Socket.tcp
는 초기 상태 기반 구현의 비효율성을 해소하고자 명시적 상태 관리를 제거하고 유연한 조건부 로직으로 재구성되어 Ruby 3.4에 병합되었습니다.
C 언어 기반의 TCP_Socket.new
적용은 더욱 복잡했습니다. 기존 getaddrinfo
함수의 한계로 병렬 처리가 불가능했기에, 주소 패밀리별 병렬 이름 해석 및 연결 확립을 동시에 대기할 수 있는 새로운 내부 함수를 도입했습니다.
이후 CI 테스트 중 Net::HTTP
연결 타임아웃 문제가 발생했는데, 이는 IPv6 우선 시도 실패 시 불필요한 지연 때문이었으며, 즉시 폴백하도록 수정하여 해결했습니다. 또한, 많은 파일 디스크립터(FD) 사용 시 TCP_Socket.new
에서 세그먼트 폴트가 발생했는데, 이는 select
시스템 콜의 FD 제한 때문이었습니다. 루비 내부의 rb_fd_select
함수가 동적으로 FD 셋을 관리하며 이 제한을 우회, 이를 활용하여 문제를 성공적으로 해결했습니다.
이러한 난관들을 극복한 후, Happy Eyeballs 기능의 활성화/비활성화 API가 제공되었고, Ruby 3.4에서 기본적으로 활성화되었습니다. 2023년 12월 25일, Ruby 3.4.0 및 3.4.1 릴리즈와 함께 Happy Eyeballs 버전 2가 Ruby 소켓 라이브러리에 공식 도입되었습니다.
성능 측면에서는 최악의 시나리오에서 TCP_Socket.new
실행 시간이 15초에서 0.1초로 단축되어 132배 빠른 성능 향상을 보였습니다. 일반 환경에서는 미미한 오버헤드가 있었으나, 전반적인 이점이 컸습니다. 특정 환경에서는 이 기능을 비활성화할 수 있습니다.
Ruby 소켓 라이브러리에 Happy Eyeballs 버전 2 알고리즘을 성공적으로 통합한 것은 네트워크 효율성을 크게 향상시키는 중요한 진전입니다. 복잡한 기술적 문제들을 해결하고 성능을 최적화하며, 사용자에게 유연한 제어 옵션을 제공하는 등 다각적인 노력이 이루어졌습니다. 본 프로젝트는 루비 커뮤니티의 활발한 기여와 협업의 중요성을 보여주는 모범 사례입니다.