2020 봄학기 실전프로젝트2 수업 과제의 일환으로, ZeroMQ라는 오픈소스에 대해 소개하고 다뤄보는 시간을 가지려고 합니다.
ZeroMQ(ØMQ, 0MQ, ZMQ)는 분산/동시성 응용 프로그램에서 사용하도록 개발된 고성능 비동기 메시징 라이브러리
이다.
프로그래밍에서 MQ는 프로그램 인스턴스 또는 프로세스가 데이터를 서로 교환할때 사용하는 방법이다. 이때 데이터 교환시 시스템이 관리하는 메시지 큐를 이용하는 것이 특징이다. ZeroMQ는 메시지 큐를 제공하지만 메시지 지향 미들웨어와 달리 전용 메시지 브로커 없이 동작이 가능하다. 여기서 메시지 지향 미들웨어란 비동기 메시지를 사용하는 다른 응용 프로그램 사이에서의 데이터 송수신을 의미한다.
라이브러리의 API는 버클리 소켓을 모방하도록 설계되었다. 이 말은 프로그램을 통하여 사용할 수 있는 단순한 메시징 라이브러리라는 뜻이다. 기본적으로 메시지 시스템을 빠르게 만들 수 있는 소켓 인터페이스를 제공한다.
ZeroMQ는 TCP, in-process, inter-process, multicast, WebSocket 과 같은 다양한 방식으로 메시지를 전송하는 소켓을 제공한다. 또한 pub/sub, request/reply, client/server and others처럼 공통 메시징 패턴을 지원하여 프로세스 간 메시징을 간단하게 만들어 준다. 스레드 간 메시징으로, 코드를 명확하게 모듈화하며 확장이 매우 쉽다는 장점이 있다.
왜 Zero라고 하는가?
ZeroMQ의 철학은 0으로 시작한다. 0
은 브로커 없음 (ZeroMQ는 브로커 없음), 대기 시간 없음, 비용 없음(무료) 및 관리 없음의 의미를 지닌다.
보다 일반적으로, "제로"는 프로젝트에 침투하는 미니멀리즘의 문화를 말하며, 새로운 기능을 노출하는 대신 복잡성을 제거한다.
전통적인 네트워크 프로그래밍은 한 소켓이 한 connection으로 한 대상과 통신한다고 가정한다. "한 소켓 = 하나의 연결"이라 가정했을 때 ØMQ는 다른 방식으로 아키텍처를 확장할 수 있다. 여러 스레드가 한 소켓으로 처리하도록 하는 로직을 만들 수 있다. ØMQ는 이들의 스레드에 정보와 상태를 설정한다.
ØMQ에서 소켓
은 자동으로 연결 전체 집합을 관리하는 영리한 멀티스레드 어플리케이션이다. 사용자는 이들 연결이 작동되고, 열고, 닫고, 추가적인 상태를 알 수 없다. 사용자가 send/receive/poll을 차단하고 제어 할 수 있는 것이 소켓일지라도, 그것은 connection이 아니다. Connection은 개인적이고 보이지 않는 것이며, ØMQ 확장성의 핵심이 된다. ØMQ 소켓들은 복수의 접점을 가질 수 있으며, 그들 간에 자동으로 메시지 부하 분산을 수행하게 되거나 하나의 소켓으로 복수의 소스에서 메시지들을 받아들이는 게이트 역할을 한다.
퍼포먼스
ZeroMQ는 대부분의 AMQP들 보다 단위가 다를 정도로 빠른 속도를 자랑한다. 이러한 퍼포먼스는 다음과 같은 기술을 보유하기 있기 때문에 가능하다고 한다.
- AMQP처럼 과도하게 복잡한 프로토콜이 없다.
- 신뢰성 있는 멀티캐스트나 Y-suite IPC 전송같은 효율적인 전송을 활용한다.
- 지능적인 메시지 묶음을 활용한다. 이것은 ZeroMQ로 하여금 프로토콜 오버헤드뿐만 아니라 시스템 호출을 줄여 TCP/IP를 효율적으로 사용하게 해준다.
ZeroMQ는 두 스트림에서 최대 속도로 처리하기 위해 다음과 같은 방법을 이용한다.
하나보다는 두 개의 I / O 스레드.
두 개의 네트워크 인터페이스 (NIC), 각 subscriber마다 하나씩.
각 I / O 스레드는 특정 NIC에 바인딩.
특정 코어에 바인딩된 두 subscriber스레드.
두 개의 SUB 소켓, 각 subscriber스레드 마다 하나씩.
나머지 코어들은 작업자 스레드들에게 할당.
작업자 스레드는 양쪽 subscriber PUSH 소켓에 연결.
한 개발자의 포스팅에 의하면, ZeroMQ 의 메모리 공간은 기존 메시징 시스템보다 훨씬 작기 때문에 임베디드 개발자에게 특히 흥미로울 것이라고 이야기한다. 예를 들어 Linux/x86에서 코어 코드는 상주 메모리에서 두 페이지만 차지하는 것처럼 말이다.
ZeroMQ의 API는 매우 간단하다. 그렇기에 소켓 버퍼에 계속 '값을 채워' 주어야 하는 생 소켓 방식에 비교하면 메시지를 보내는 것이 매우 단순하다. ZeroMQ에서는 비동기 send 호출을 부르기만 하면, 메시지를 별도의 스레드의 큐에 넣고 필요한 모든 일을 처리해준다. 이러한 비동기 특성이 있기에 유저의 애플리케이션은 메시지가 처리되기를 기다리며 시간 낭비하지 않아도 된다. ZeroMQ의 비동기 특성은 이벤트 중심의 프레임워크에도 최적이다.
ZeroMQ의 단순한 와이어 프로토콜은 다양한 전송 프로토콜이 사용되는 곳에 있어 적합하다.
ZeroMQ는 iMatix에서 개발되었으며 오픈소스 소프트웨어이다.
서버 개발자들은 애플리케이션에 네트워크 기능을 간단하게 추가하거나 서버의 확장성 구현을 시행착오없이 하고 싶을때, ZeroMQ의 도입을 고민하기도 한다. 그런 개발자들을 위해 ZeroMQ는 홈페이지에 가이드북을 공개하고 있다.
ZeroMQ 다음과 같은 프로그래밍 언어들로 지원하고 있으며, 위의 하이퍼링크를 통해 다양한 라이브러리들을 살펴볼 수 있다.
공개 Github 리포지터리에서 관련 예제들을 학습해보는 것도 좋은 방법이다.
다음 포스트에서는 mac OS에 ZMQ를 설치하고 실행하는 방법을 알아보도록 하겠다. 👩🏻💻🍒