메시지큐에 대해 알아보자.

2017. 6. 27. 14:30Architecture/AA

반응형
모델 종류 
  • 발행/구독(publish - and - subscribe) 모델
          1: 다 - 모든 클라이언트에게 모든 메시지의 사본을 전달.
           publisher -> topic -> subscriber
                                         -> subscriber
                                         -> subscriber


  • 지점간 연결(point -  to - point) 모델 
          1:1 - 하나의 메시지는 하나의 클라이언트에만 전송(큐는 공유 가능)
          sender -> queue -> receiver 

위의 모델 중에 publish - and - subscribe(pub - sub) 모델에 대해서 알아보자!

pub/sub 구조
보통의 message queue들은 publisher - message broker(topic) - subscriber 구조를 사용한다.
publisher(message data)를 하면 가운데 있는 message broker가 메시지를 선택하고 처리하는 즉, 내부적으로 구독하고 있는
subscriber들을 찾아서 메시지를 보낸다. 

opensource message queue중에 nats라는 녀석이 있다. (http://nats.io/)


pub/sub 구현(w/go lang)
그러면 pub/sub 모델을 구현한다고 생각해보자.
우선은 메시지큐 server가 필요하겠다. 그리고 그 서버를 붙는 client도 필요하다.
보통 jms, nats, amazon sqs 등등이 서버가 되겠다. client는 제공되어지는 publish()등의 함수가 있는 lib 정도.

ex)  메시지 큐 동작 과정
  1. 클라이언트가 NATS 서버와의 TCP / IP 소켓 연결을 설정.
    1. nc, _ := nats.Connect(nats.DefaultURL)
  2. 발행
    1. nc.Publish("foo", []byte("Hello World"))
  3. 구독 (subject가 구독대상 : foo)
          // Simple Async Subscriber
    nc.Subscribe("foo", func(m *nats.Msg) {
                      fmt.Printf("Received a message: %s\n", string(m.Data))
     })

    // Simple Sync Subscriber
    sub, err := nc.SubscribeSync("foo")
    m, err := sub.NextMsg(timeout)
  1. 구독 해제(Sync Subscriber 일 경우에만)
    // Unsubscribe
          sub.Unsubscribe()    
     5. defer nc.Close()    

func TestNatsWorking(t *testing.T) {
   nc, _ := nats.Connect(nats.DefaultURL)
   defer nc.Close()
   // Simple Publisher
   nc.Publish("foo", []byte("Hello World"))

   // Simple Async Subscriber
   nc.Subscribe("foo", func(m *nats.Msg) {
      fmt.Printf("Received a message: %s\n", string(m.Data))
   })

}



           


반응형