[Python] ZeroMQ Publish-Subscribe 패턴 Develop Tip

메시징 시스템을 사용하는 이유는 여러가지가 있습니다.
그 중에서 메시징 패턴을 이용하면 편한 것들이 있습니다.

일반적인 TCP/IP 소켓 Client-Server 예제를 보면
클라이언트가 여러개 서버로 연결되어 상위 APP 
프로토콜로 주고 받는 것이 지금까지의 일반적인
SMTP, HTTP  등의 대부분 RFP0000 에서 정의된
프로토콜이라 할 수 있지요.

하지만 ZeroMQ와 같은 메시징 에서는 여러가지
응용 패턴을 기본적으로 제공해 줍니다.

가장 잘 이용할 수 있는 방법 중 하나가 게시-구독 (Publish-Subscribe) 패턴 입니다.

만약 서버에서 게시를 하면 이것은 구독을 위해 연결된 모든 클라이언트에게 전달이 되는 모양새 입니다.

ZeroMQ 샘플을 살펴보도록 하겠습니다.

우선 topics_pub.py 입니다.

소스를 살펴보면 패러미터로 넘어오는 bind 주소를 열고 구독상태로 놓은 상태에서

all_topics = ['sports.general','sports.football','sports.basketball',
                  'stocks.general','stocks.GOOG','stocks.AAPL',
                  'weather']
위의 topics을 계속하여 순차적으로 돌면서 순번의 메시지를 보내는 것입니다.
(위의 소스를 받아서 time.sleep(0.1) 을 time.sleep(1) 로 바꾸어 테스트해 보았습니다)

이제는 구독을 위한 topics_sub.py 소스입니다.
(numpy 모듈은 필요없는데 import 를 하기에 제가 제외시키는 것을 권고했습니다)


역시 구독을 위한 주소를 패러미터로 받아 SUB 모델로 connect 하고 
연결하여 게시하는 내용을 구독하여 출력하는 형태입니다.

특별한 것은 ZMQ 소켓 옵션으로 topic을 지정할 수 있다는 것인데,
예를 들어 w 라고 지정하였다면 위의 all_topics에서 w 로 시작하는
모든 타픽 만을 구독하라는 것이 되겠습니다.
다른 것은 아예 통신도 일어나지 않는 다는 것입니다.

따라서 해당 채널안에서 구독하고픈 것을 타픽으로 정리하면 되겠다는 생각이 들었습니다.

이제는 위에 것을 우분투나 맥에다 가져다 놓고 테스트를 해 봅니다.

우선 파이썬 zeromq 를 우분투에서 가져다 사용하기 위해서는
$ sudo pip install pyzmq
또는
$ sudo apt-get install python-zeromq
등으로 설치 합니다.

우선 게시용 서버를 기동시킵니다.

$ python topics_pub.py tcp://*:9999
Starting broadcast on topics:
   ['sports.general', 'sports.football', 'sports.basketball', 'stocks.general', 'stocks.GOOG', 'stocks.AAPL', 'weather']
Hit Ctrl-C to stop broadcasting.
Waiting so subscriber sockets can connect...

   Topic: sports.general, msg:0
   Topic: sports.football, msg:1
   Topic: sports.basketball, msg:2
   Topic: stocks.general, msg:3
   ...

bind 패러미터는 tcp://*:9999 입니다. 이 의미는
TCP를 통하여 모든 ip 에서 오는 9999 포트로 바인드를 허용한다는 것입니다.


이제 다른 머신의 터미널에서 위에 접속을 해 봅니다.

$ python topics_sub.py tcp://localhost:9999 w
Receiving messages on topics: ['w'] ...

   Topic: weather, msg:6
   Topic: weather, msg:13
   Topic: weather, msg:20
   ...

위와 같이 잘 동작합니다.
(같은 머신에서 돌렸기 때문에 localhost:9999로 접속했습니다만 다른 머신에서 해도 동일합니다)

여러 머신에서 topics_sub.py 를 돌려도 모두 동일하게 잘 동작합니다.

위에서 topics_pub.py 서버가 192.168.18.140:9999 로 bind 되어 있고,
192.168.18.130 에서 구독을 한는 경우에 wireshark로 패킷 캡쳐를 해 보았습니다.

우선 정상적인 TCP의 CS 환경처럼 192.168.18.130 Client (topics_sub.py) 에서 먼저 접속시도를 합니다.
게시하기 전까지는 일단 메시징 채널을 확립해 놓는 것이구요.

그 다음 실제 w* topic을 가져올 때는,

위와 같이 192.168.18.140 Server (topics_pub.py) 에서 먼저 PUSH를 합니다.

물론 중간에 연결이 끊기거나 서버가 죽었다가 다시 살아나더라도 연결 등은
ZeroMQ가 채널 연결 보장을 해 줍니다.

이와 같은 게시-구독의 특징 중의 하나는,
지난번의 Reverse-SSH 와 같이 서버에서 클라이언트로 먼저 연결이 되지 않아도
되는 환경에서 사용할 수 있다는 장점이 존재합니다.

또한 서버는 아무리 클라이언트가 많아도 그것을 일일이 반복하여 보내려는 별도의
로직이 필요없다는 장점도 존재합니다.


어느분께는 도움이 되셨기를....



덧글

댓글 입력 영역

구글애드텍스트