0MQ: 메시지 시스템 라이브러리

LWN.net 에서 0MQ 라는 매우 흥미로운 라이브러리를 소개하길래 조금 자세히 살펴 보았습니다.

일단 소개부터 하자면, BSD 소켓 비슷한 API를 지원하는 경량 메시지 시스템입니다. 소켓 비슷한 API라고 하지만, 소켓보다 사용하기 훨씬 편합니다. 실행 중 차지하는 용량이 1~20 KB 정도밖에 안될 뿐 아니라, 처음 개발이 실시간 증권 정보 시스템의 일부였기 때문인지 매우 빠릅니다. 네트워크 프로토콜은 TCP, UDP, PGM(Pragmatic General Multicast) , IPC는 물론 쓰레드간 통신도 지원합니다. 지원하는 메시징 모델은 일대일 통신에 유용한 요청/응답(request/reply), 일대다 통신에 좋은 출판/가입(publish/subscribe), 스트리밍(streaming) 등을 지원합니다.

대신 이 라이브러리는 메시지 내용 자체에는 관여하지 않습니다. 메시지 내용은 단순한 바이너리 데이터로 취급하기 때문에 개발자가 직접 정의하거나 구글 프로토콜 버퍼 같은 전용 라이브러리를 사용해야 합니다. (참고로 구글 프로토콜 버퍼는 좋은 라이브러리이지만,  C++, Java, Python만 지원하고 정작 제가 사용하는 주언어인 C 언어는 지원하지 않아 검토만 하고 실제 프로젝트에서는 사용해 본 적이 없습니다) 즉, 인증 / 암호화 / 압축 / 시리얼라이제이션 등은 개발자가 알아서 하면 됩니다.

다양한 언어와 플랫폼을 지원하기 때문에 어떤 프로젝트에서도 향후 확장성이나 호환성을 걱정하지 않고 사용할 수 있습니다. 지원하는 운영체제는  Linux, Windows, Mac OS X, Solaris, AIX, FreeBSD, HP-UX, OpenBSD, OpenVMS, QNX Neutrino 등이고, 아키텍쳐는 i386, x86-64, Sparc, Itanium, Alpha, ARM 등입니다.  사용 가능한 언어는 현재 C, C++, Common Lisp, Java, Python, Ruby 등인데 PHP 같은 웹 개발 언어까지 가능하다면 금상첨화일 것 같습니다.

아직 직접 사용해보진 않았으나 긍정적으로 다음 프로젝트 또는 기능 추가시 사용해볼 예정인데, 몇 가지 이유를 적어보면 다음과 같습니다.

  1. 멀티플랫폼을 고려해야 하는 프로젝트에서는 모듈간 통신에 어쩔 수 없이 가장 일반적인 TCP/UDP 소켓을 사용합니다. 그런데 아무리 경험많은 개발자라도 매번 통신 모듈을 새로 개발하는 것은 부담스러운데, 이 라이브러리는 이런 고민을 말끔히 해결해주는 동시에 다양한 메시징 모델을 이용하여  응용 프로그램 자체에만 전념할 수 있게 도와줍니다.
  2. 네트워크 상의 클라이언트-서버 방식 뿐 아니라, 하나의 시스템이 여러 역할별로 프로세스가 할당되어 구성되는 경우도 많습니다. 이 경우 성능을 위해 IPC나 PGM 등과 같은 프로토콜을 사용하다가, 나중에 분산 시스템으로 구성이 변경되더라도 프로토콜만 다시 TCP로 바꾸어 주면 되기 때문에 확장성이 매우 좋습니다. 또한 LWN.net 기사에서도 언급한 것처럼 게이트웨이나 프록시 역할을 하는 기능을 추가하는 것도 매우 쉬어집니다. 이를 응용할 수 있는 것도 매우 많아지는데, 예를 들어 사용자가 여러번 프로그램을 실행해도 한 개의 인스턴스만 존재하도록 하고 싶을때, 간단하게 IPC나 루프백 통신을 이용해 인스턴스 여부를 검사하면 되고, 더 나아가 기존 인스턴스에게 인자를 넘겨주는 것도 가능합니다. ( Unique 라이브러리 참고)
  3. 게다가 이 라이브러리에서 지원하는 쓰레드간 통신을 이용하면, 물론 뮤텍스나 큐를 사용하는게 더 효율이 좋겠지만, 처음에는 쓰레드로 만들었다가 여러가지 이유로 나중에 프로세스로 분리하거나, 아예 다른 호스트에서 네트워크로 통신해야할 경우에도 쉽게 이전이 가능합니다. 또한 큐는 단순한 일대일 통신에만 사용할 수 있지만, 출판/가입 모델 등과 같이 한 쓰레드가 여러 쓰레드에게 메시지를 전송하는 경우(예를 들어 버스 또는 시그널 방송)도 쉽게 구현할 수 있습니다.

LWN.net 페이지를 보시면 각 언어별로 샘플 코드가 나열되어 있으므로 기본적인 사용법이 궁금하신 분은 직접 확인해보시기 바랍니다. 아, 물론 LGPL 오픈소스입니다.

comments powered by Disqus

Related