LavinMQ: Crystal로 구축된 고성능 오픈소스 메시지 브로커

메시지 브로커는 비동기 통신을 가능하게 하고 서비스를 분리함으로써 현대 분산 시스템의 핵심 구성 요소 역할을 합니다. 그러나 전통적인 브로커는 때때로 리소스를 많이 사용하거나 진단 및 해결하기 어려운 운영상의 문제를 야기할 수 있습니다. LavinMQ는 이러한 문제를 해결하기 위해 CloudAMQP의 숙련된 팀이 처음부터 설계한 매력적인 오픈소스 대안으로 등장했으며, 뛰어난 성능과 리소스 효율성을 약속합니다.

이 기사는 LavinMQ의 기원, 독특한 아키텍처 선택, 그리고 달성한 인상적인 벤치마크를 깊이 있게 다루며, Crystal 언어로 구축된 메시지 브로커가 어떻게 처리량과 운영의 단순성에 대한 기대를 재정의할 수 있는지에 대한 통찰을 제공합니다.

LavinMQ의 탄생: 실제 브로커의 과제 해결

LavinMQ의 제작자인 CloudAMQP 팀은 14년 동안 RabbitMQ를 호스팅하며 메시지 브로커와 관련된 운영상의 복잡성과 고충을 깊이 있게 이해하게 되었습니다. LavinMQ의 창시자인 Carl Hoerberg는 광범위한 경험에도 불구하고, 고객들이 기존의 외부 브로커 제약 조건 내에서 완전히 설명하거나 해결하기 어려운 문제들에 가끔 직면한다는 것을 설명합니다.

이는 스택 전체를 완전히 제어하고 이전에는 불가능했던 솔루션을 제공할 수 있도록 자체 브로커를 구축하겠다는 야심 찬 결정으로 이어졌습니다. 여정은 과도한 CPU 부하를 완화하기 위해 단기 연결을 처리하도록 설계된 오픈소스 AMQP 프록시로 시작되었습니다. 프로토콜 구현으로 시작된 것은 훨씬 더 큰 과제인 신뢰할 수 있는 영속성 계층을 구축하는 것으로 진화했습니다. 프로토콜 자체는 '쉬운 부분'임이 증명되었지만, 견고-록한 디스크 저장소, 확인 응답(acknowledgment) 처리, 그리고 복제(replication)를 구현하는 데는 수년의 헌신적인 노력이 필요했습니다. LavinMQ의 첫 릴리스는 2020년에 이루어졌으며, 현재 CloudAMQP에서 5,000개 이상의 프로덕션 인스턴스에서 구동되고 있습니다.

기술 아키텍처 및 성능 역량

LavinMQ는 속도와 효율성을 위해 설계되었으며, 다음과 같은 몇 가지 핵심 설계 선택을 통해 차별화됩니다:

언어 및 동시성 모델

LavinMQ는 Ruby와 유사한 구문을 결합하면서도 LLVM 컴파일 언어의 성능 이점과 Go와 같은 동시성을 제공하는 Crystal 언어로 작성되었습니다. 이 조합은 네이티브 바이너리로 컴파일되는 매우 효율적이고 타입 안정성이 높은 코드를 가능하게 하여 런타임 오버헤드를 최소화합니다.

"인상적인 벤치마크입니다. 2 vCPU 인스턴스에서 초당 100만 개의 메시지를 처리하는 것은 Crystal의 훌륭한 쇼케이스입니다. Crystal 코어 멤버로서, 저는 항상 LavinMQ를 성능 지향적 엔지니어링의 주요 사례로 보아왔습니다. 특히 I/O를 처리하고 하드웨어의 성능을 최대한 끌어내기 위해 syscall을 최소화하는 방식이 인상적입니다. Crystal의 동시성과 타입 시스템을 진지한 프로덕션 환경에서 보고 싶다면, 이 프로젝트를 확인해 보시기 바랍니다. 2020년부터 노력해 온 LavinMQ 팀에게 경의를 표합니다." — @sdogruyol, Crystal 코어 멤버

리소스 최적화

핵심 설계 철학은 메모리 복사, 할당, 그리고 syscall을 최소화하는 것에 중점을 둡니다. 메시지는 메모리 맵 파일(memory-mapped files)을 통해 디스크에 직접 기록되며, 인메모리 캐시를 우회합니다. 메시지와 확인 응답(acknowledgment) 모두 추가 전용 쓰기(append-only writes) 방식을 사용하여 디스크 I/O를를 최적화하고 크래시 복구(crash recovery)를 단순화합니다.

지원 프로토콜 및 배포

LavinMQ는 AMQP 0-9-1, MQTT, HTTP, 그리고 스트리밍을 포함한 다양한 필수 메시징 프로토콜을을 지원합니다. 단일 바이너리로 배배포되므로 배포가 매우 단순합니다. 빠른 평가를 위해 다음과 같은 간단한 명령어로 Docker를 통해 실행할 수 있습니다: docker run -p 15672:15672 -p 5672:5672 cloudamqp/lavinmq.

벤치마크 하이라이트

성능 수치는 최적화된 설계의 증거입니다:

  • ~580,000 messages/second on an AWS t4g.micro instance (2 vCPU, 1 GB RAM).
  • Over 1,000,000 messages/second on an AWS c8g.large instance (2 vCPU, 4 GB RAM).

이러한 수치는 최소한의 하드웨어에서 높은 처리량을 제공할 수 있는 LavinMQ의 능력을 강조하며, 이는 비용에 민감하거나 고성능이 필요한 환경에 매력적인 선택지가 됩니다.

신뢰성 및 내구성에 대한 고려 사항

모든 메시지 브로커에게 신뢰성 및 메시지 내구성은 매우 중요합니다. LavinMQ를 평가하는 사용자, 특히 분산 및 결함 허용(fault-tolerant) 환경에서 사용하는 경우, 리더 실패 시의 동작에 대한 질문이 매우 중요합니다. 구체적으로, 클러스터 환경에서 publisher confirm이 적어도 한 명의 팔로워에게 메시지 생존을 보정할지 여지부가 핵심적인 데이터 무결성 및 가용성 확보의 데 대한 핵심적인 측면입니다.

초기 발표에서는 신뢰할 수 있는 디스크 저장소 및 복제에 대한 과제를 강조했지만, 클러스터 환경에서의 리더 실패와 같은 시나리오를(특히 publisher confirms와 관련하여) LavinMQ가 어떻게 처리하는지에 대한 추가적인 세려는 정보가 가치 있을 것입니다. 이는 강력한 내구성 보장을 요구하는 시스템에서 흔히 발생하는 우적입니다.

결론

LavinMQ는 고성능, 리소스 효율적이며 운영상 투명한 메시지 브로커를 구축하기 위한 상당한 노력을 상합니다합니다. RabbitMQ를 호스팅한 수년간의 경험을 바탕으로, Crystal 언어를 활용하고 세심하게 최적화된 아키텍처를를 통해 적은 하드웨어에서 인상적인 처리량을 제공합니다. 성능, 효율성, 제어권이 매력적인 조합을 제공하는 오픈소스 메시지 브로커를 찾는 조직에게 LavinMQ는 강력한 경쟁자가 됩니다. 제작자들은 커뮤니티가 이 솔루션을 탐색하고 현재 메시징 관행 및 새로운 브로커로 전환할 때 영향을 미치는 요인들에 대해 통찰을 공유해 주기를 요청합니다.

Sources