[c++] ZeroMQ 패턴 비교

ZeroMQ는 분산 시스템에서 통신을 쉽고 효율적으로 구현할 수 있도록 하는 오픈 소스 라이브러리입니다. 다양한 통신 패턴을 지원하여 각각의 장단점이 있습니다. 이번 게시물에서는 ZeroMQ의 주요 패턴인 REQ-REP, PUB-SUB, PUSH-PULL 패턴을 비교하고 각각의 사용 사례에 대해 알아보겠습니다.

REQ-REP 패턴

REQ-REP(요청-응답) 패턴은 클라이언트가 서버에 요청을 보내고, 서버는 해당 요청에 대한 응답을 보내는 패턴입니다. 이 패턴은 단일 요청에 대한 단일 응답으로 구성되어 있어서 동기적인 통신에 적합합니다. 일반적으로 클라이언트가 요청을 보내면, 서버는 해당 요청을 처리하고 응답을 보내는 방식으로 동작합니다.

// Server
zmq::socket_t server(context, ZMQ_REP);
server.bind("tcp://*:5555");
while (true) {
    zmq::message_t request;
    server.recv(&request);
    // Process request
    zmq::message_t reply(5);
    memcpy(reply.data(), "world", 5);
    server.send(reply);
}

// Client
zmq::socket_t client(context, ZMQ_REQ);
client.connect("tcp://localhost:5555");
zmq::message_t request(5);
memcpy(request.data(), "hello", 5);
client.send(request);
zmq::message_t reply;
client.recv(&reply);

PUB-SUB 패턴

PUB-SUB(발행-구독) 패턴은 메시지 발행자(Publisher)가 메시지를 발행하고, 메시지 구독자(Subscriber)가 해당 메시지를 구독하는 패턴입니다. 이 패턴은 1:N의 통신 구조를 가지고 있어서 다수의 수신자에게 동시에 메시지를 전달할 수 있습니다. 주로 이벤트 기반 아키텍처에서 사용되며, 실시간 데이터 피드를 제공하는 데 적합합니다.

// Publisher
zmq::socket_t publisher(context, ZMQ_PUB);
publisher.bind("tcp://*:5556");
while (true) {
    zmq::message_t update(10);
    memcpy(update.data(), "New update", 10);
    publisher.send(update);
}

// Subscriber
zmq::socket_t subscriber(context, ZMQ_SUB);
subscriber.connect("tcp://localhost:5556");
subscriber.setsockopt(ZMQ_SUBSCRIBE, "", 0);
zmq::message_t update;
subscriber.recv(&update);

PUSH-PULL 패턴

PUSH-PULL 패턴은 여러 프로세스 간에 작업을 분산하여 처리하는데 사용됩니다. 데이터가 여러 작업자에게 고루 분배되어야 하는 경우에 유용합니다. 작업을 처리할 준비가 된 작업자는 데이터를 가져와 처리합니다. 이 패턴은 백그라운드 작업, 작업 큐, 병렬 처리 등에 사용됩니다.

// Pusher
zmq::socket_t pusher(context, ZMQ_PUSH);
pusher.bind("tcp://*:5557");
zmq::message_t task(5);
memcpy(task.data(), "task1", 5);
pusher.send(task);

// Puller
zmq::socket_t puller(context, ZMQ_PULL);
puller.connect("tcp://localhost:5557");
zmq::message_t task;
puller.recv(&task);

위의 예시로 각 패턴의 특징과 사용 사례를 알아보았습니다. 각 패턴은 서로 다른 통신 요구 사항에 따라 유용하게 활용될 수 있습니다. 그러므로 용도에 맞게 선택하여 사용하면 좋겠습니다.

참고 자료