[c++] ZeroMQ 퍼블리셔-서브스크라이버 패턴

제로엠큐(ZeroMQ)는 가볍고 빠른 메시지 전달을 위한 라이브러리이다. ZeroMQ를 사용하면 다양한 통신 패턴을 쉽게 구현할 수 있다. 여기서는 제로엠큐의 퍼블리셔-서브스크라이버(publisher-subscriber) 패턴을 사용하여 데이터를 주고받는 방법을 알아보겠다.

제로엠큐 설치

먼저 제로엠큐를 설치해야 한다. 제로엠큐는 여러 언어에서 사용할 수 있지만, 여기서는 C++을 기준으로 설명하겠다.

sudo apt-get update
sudo apt-get install libzmq3-dev

제로엠큐 라이브러리를 설치하면 C++에서 제로엠큐를 사용할 수 있다.

퍼블리셔-서브스크라이버 패턴

퍼블리셔-서브스크라이버 패턴은 데이터를 한 발신자가 여러 수신자에게 보내는 방식이다. 퍼블리셔는 데이터를 발송하고, 서브스크라이버는 해당 데이터를 구독하여 받는다.

// publisher.cpp

#include <zmq.hpp>
#include <string>
#include <iostream>

int main () {
    zmq::context_t context(1);
    zmq::socket_t publisher (context, ZMQ_PUB);
    publisher.bind("tcp://*:5555");

    while (true) {
        std::string message = "Hello, World!";
        publisher.send(zmq::buffer(message), zmq::send_flags::none);
        std::cout << "Sent: " << message << std::endl;
    }
}

위의 예제는 퍼블리셔를 구현한 C++ 코드이다. 이 코드는 “tcp://*:5555” 주소로 바인딩된 퍼블리셔를 생성하고, 무한 루프를 통해 “Hello, World!”라는 메시지를 주기적으로 발송한다.

// subscriber.cpp

#include <zmq.hpp>
#include <string>
#include <iostream>

int main () {
    zmq::context_t context(1);
    zmq::socket_t subscriber (context, ZMQ_SUB);
    subscriber.connect("tcp://localhost:5555");
    subscriber.set(zmq::sockopt::subscribe, ""); 

    while (true) {
        zmq::message_t update;
        subscriber.recv(update);
        std::string message = std::string(static_cast<char*>(update.data()), update.size());
        std::cout << "Received: " << message << std::endl;
    }
}

이제 서브스크라이버를 위한 코드를 살펴보겠다. 위의 예제는 “tcp://localhost:5555” 주소에 연결된 서브스크라이버를 생성하고, 해당 주소로부터 메시지를 구독한다.

이제 위의 예제들을 각각 publisher.cpp, subscriber.cpp 파일에 저장하고, 각각을 컴파일하여 실행해보면, 퍼블리셔가 발송한 메시지를 서브스크라이버가 수신하는 것을 확인할 수 있다.

제로엠큐의 퍼블리셔-서브스크라이버 패턴은 서로 다른 프로세스나 시스템 간에 데이터를 효과적으로 교환할 수 있는 강력한 방법이다.

이상으로 제로엠큐의 퍼블리셔-서브스크라이버 패턴을 간단히 살펴보았다. ZeroMQ의 다양한 패턴을 활용하여 효율적인 통신 시스템을 구축할 수 있다.

References