개요

2년전, ZeroMQ를 처음 접했던 시절 Publish와 Subscribe 테스트를 위해 직접 Python으로 테스팅툴을 직접 만들어 썼던 기억이 있습니다. 네트워크를 이용한 분산처리를 하다보면 테스트가 다소 불편하기 때문에 커맨드라인에서 각종 소켓을 생성해 표준 입력(stdin)으로 메시지를 보내거나, 받은 메시지를 표준출력(stdout)으로 확인하는 정도의 기능을 하는 툴이 꼭 필요하거든요.

최근 nanomsg를 기웃거리다 보니, nanocat라는 유틸리티가 기본적으로 제공되고 있었습니다. ZeroMQ에서도 유사한 툴이 있겠다 싶어 GitHub을 찾아보니, Publish/Subscribe 외에도 Push/Pull 등 여러가지 프로토콜을 지원하는 Python 프로젝트가 있었고, 이를 Go로 포팅한 프로젝트가 눈길을 끌었습니다. Go로 작성된 프로그램들은 .EXE 형태로 실행파일이 만들어지기 때문에 Python이나 Java처럼 런타임을 설치할 필요가 없어 무척 편리합니다.

컴파일 준비

zmqc 컴파일을 위해서는 Go로 작성된 gozmq를 먼저 컴파일해야 하는데, 이를 위해서 ZeroMQ의 라이브러리가 필요합니다.

ZeroMQ 라이브러리 준비

ZeroMQ 소스코드 컴파일 절차를 따르면 필요한 파일들이 준비되어 있을텐데, 아래 폴더에서 3개의 파일을 활용합니다.

C:\Program Files\ZeroMQ>tree
├───bin			→ libzmq-v141-mt-4_2_5.dll
├───include		→ zmq.h
└───lib			→ libzmq-v141-mt-4_2_5.lib

윈도우용 Git, gcc 설치

아마도 이 포스트를 검색해서 여기까지 읽고있는 사람이라면 당연히 설치되어 있을것 같습니다만, 윈도우용 Git을 설치 후 gcc 컴파일러 설치를 위해 MinGW도 함께 설치합니다. MinGW는 Minimalist GNU for Windows의 약자로, 지금 필요한 gcc와 같은 GNU 소프트웨어 도구 모음입니다.

Go 설치

끝으로, Go 컴파일러를 설치해서 준비를 마무리 짓습니다. Go 자체가 의존성 있는 패키지를 설치하기 위해 Git을 활용하기 때문에 Git을 설치한 것이고, gozmq 코드에 포함된 ZeroMQ 관련 코드를 컴파일하기 위해 gcc가 필요하여 MinGW을 설치한 것입니다.

컴파일

zmqc 컴파일을 시작하면 자동으로 gozmq가 컴파일 됩니다. 이때 ZeroMQ의 헤더파일과 라이브러리가 필요합니다. 사실 이 부분에서 삽질을 많이 했기 때문에, 이를 기록으로 남기느라 포스팅을 하게되었습니다.

일단 아래의 명령어를 시작하면 필요한 파일들을 GitHub에서 받아오고, 컴파일을 시작하는 과정에 ZeroMQ 관련 파일들이 없다고 에러가 날겁니다.

go get github.com/jhawk28/zmqc

그러면 아래의 명령어로 필요한 파일들을 복사합니다. C:\Program Files 디렉토리에 파일을 복사하기 때문에 명령행 프롬프트는 관리자 권한으로 실행해야 합니다. lib 파일을 복사하는 두번째 명령어의 경우 MinGW의 버전에 따라 경로가 다를 수는 있지만, 버전에 맞추어 찾아가서 libzma.a라는 이름으로 파일명을 바꿔 복사하는 것이 중요합니다.

copy "C:\Program Files\ZeroMQ\include\zmq.h"  ^
	%USERPROFILE%\go\src\github.com\pebbe\zmq4

copy "C:\Program Files\ZeroMQ\lib\libzmq-v141-mt-4_2_5.lib" ^
	"C:\Program Files\mingw-w64\x86_64-8.1.0-win32-seh-rt_v6-rev0\mingw64\x86_64-w64-mingw32\lib\libzmq.a"

이제 아래 명령어를 다시 시작하면 정상적으로 컴파일이 완료되고 zmqc.exe 파일이 생성됩니다. 이제 ZeroMQ의 DLL 파일을 같은 디렉토리에 넣어주면 zmqc.exe를 활용해 ZeroMQ 테스트를 시작할 수 있습니다.

go get github.com/jhawk28/zmqc
copy "C:\Program Files\ZeroMQ\bin\libzmq-v141-mt-4_2_5.dll" ^
	%USERPROFILE%\go\bin
%USERPROFILE%\go\bin\zmqc.exe

실행 결과

C:\>%USERPROFILE%\go\bin\zmqc.exe
No Addresses submitted
Options:
  -0                                   Separate messages on input/output should be
  -c, --connect                        Connect to the specified address(es).
  -b, --bind                           Bind to the specified address(es).
  -n -1                                Receive/send only NUM messages. By default, zmqc lives forever in 'read' mode, or until the end of input in 'write' mode.
  -s [PUSH|PULL|PUB|SUB|REQ|REP|PAIR]  Which type of socket to create. Must be one of 'PUSH', 'PULL', 'PUB', 'SUB', 'REQ', 'REP' or 'PAIR'. See `man zmq_socket` for an explanation of the different types. 'DEALER' and 'ROUTER' sockets are currently unsupported.
  --subscribe=                         Subscribes to data matching
  -h, --help                           Show usage message
  --version                            Show version