Network/IoT-MQTT

IoT - MQTT 의 Sub/Pub 모델

양디 2016. 1. 28. 12:58




Sub / Pub Model?


Sub/pub 모델, 즉 Subscriber / Publisher 모델은 구독 클라이언트와 발행 클라이언트 간의 통신 모델이다.


일반적인 Server / Client 모델은 한쪽은 서버의 역할을, 한쪽은 클라이언트의 역할을 하게 된다.


일반적으로 클라이언트가 서버에 데이터를 요청하고, 서버가 해당 데이터를 클라이언트에 전송하는 식의 방식이 사용된다.


Sub/pub 모델은 이와 조금 다르다.


클라이언트는 데이터를 보내는 입장이 될 수 있고, 혹은 데이터를 받는 입장, 혹은 동시에 두 입장을 소화해 낼 수도 있다.


실생활의 예를 한번 들어보자.


내가 신문 읽기를 좋아하여, 신문 구독(Subscribe) 을 신청하였다.


예를 들어 조선일보(Topic) 와 한겨레 신문(Topic) 을 구독 신청했다고 하자.


그럼 조선일보와 한겨레는 기사를 발행(Publish) 하면, 그 신문은 신문 배달원(Broker) 에 의하여 나에게 도착하게 된다.


여기서 살짝 다른 점은, 나는 신문을 발행할 수 없다는 것인데, MQTT에서는 내가 발행하는 사람이 될 수도 있다.


MQTT 용어



이미지 출처 : http://www.hardcopyworld.com/ngine/aduino/wp-content/uploads/sites/3/2016/01/0912embmqtt01.png



위에서 나왔듯이, MQTT Sub/Pub 모델에서 가장 핵심적인 용어들은 Subscribe, Publish, Broker, Topic이다.


Subscribe는 말그대로 구독이다.


내가 관심 있는, 내가 받아야 할 Topic 들을 선택하고, 해당하는 정보를 받게 된다.


Publish는 역시 발행이다.


발행할 Topic에 정보를 발행한다.


Broker 의 역할이 아주 중요하다.


Subscriber 는 Broker에 자신이 받을 Topic 들에 대한 정보를 요청한다.(subscribe)

Broker는 메모리에 topic별로 subscribe하는 client의 정보를 갖고 있다가,

Publisher 가 해당 topic으로 데이터를 전송하면 구독하고 있던 client 전원에게 데이터를 전달해준다.(publish)


Topic 별로 데이터를 주고받는다는 것이 중요하다.


Subscriber가 weather, time 이라는 Topic을 구독하겠다고 신청하면


Publisher가 weather, person, address 를 발행하면 weather의 정보만 Broker를 통해서 전달되게 된다.


Broker는 Topic을 관리해주고 구독과 발행을 총괄한다고 보면 되겠다.


 

Topic의 구분

이미지 출처 : 기록이 안되어있음 ..


토픽이 아무래도 무수히 많이 존재할 텐데, 이를 구분하는 것도 당연히 중요하다.


토픽을 구분하는 것은 위의 그림에서 볼 수 있듯이 슬래쉬(/) 로 구분한다.


마치 트리 구조처럼 아래로 내려가는 형식이다.


또한 특별한 키워드가 존재하는데, 바로 와일드카드 이다.


와일드카드는 토픽에 특별한 기능을 추가해주는데, + , * 의 두가지가 있다.


예를 들어 Subscriber가 위의 사진에서 /sensors/NODE_NAME/temperature/CPU 에 대해 구독하도록 하였다면,


그 Subscriber는 해당 토픽에 관한 내용만 받아들일 수 있다.


그러나 /sensors/NODE_NAME/temperature/* 이런식으로 와일드카드를 사용하여 구독한다면


Harddisk, CPU, Memory 정보를 모두 받을 수 있다.


* 와일드 카드는 같은 부모 노드를 가진 형제노드 전부를 동시에 구독할 수 있게 해준다.


하지만 단말노드(자식 노드가 없는 경우)에만 해당한다.


만약 자식 노드가 있다면, + 와일드 카드를 사용하여야 한다.


예를 들어 위의 NODE_NAME에 해당하는 부분이 node1, node2 가 있다고 하자.


즉 sensors/node1/temperature/... 가 있고, sensor/node2/temperature/... 가 있다고 하자.


이 경우에 node1과 node2 둘다 받을때에는 단말노드가 아니므로 *를 사용하는 것이 아니라 +를 사용하여야 한다.


sensors/+/temperature/CPU 이런식으로 토픽을 지정해두면


node1의 CPU 온도와 node2의 CPU 온도 둘다 받을수 있게 된다.




기초 모델 끝




댓글